From 9ee75ce02b60c573b5d84faf43a84578fe73daab Mon Sep 17 00:00:00 2001 From: fun Date: Sat, 2 Jul 2022 23:41:24 +0800 Subject: [PATCH 1/3] feat: migrate saving protocols --- cspell.json | 22 + .../plugins/Savings/SNSAdaptor/IconURL.tsx | 7 + .../Savings/SNSAdaptor/SavingsDialog.tsx | 118 +- .../SNSAdaptor/SavingsDialogStyles.tsx | 7 + .../Savings/SNSAdaptor/SavingsForm.tsx | 41 +- .../Savings/SNSAdaptor/SavingsTable.tsx | 139 ++- .../Savings/SNSAdaptor/assets/alpaca.png | Bin 0 -> 33421 bytes .../Savings/SNSAdaptor/assets/aurigami.png | Bin 0 -> 8874 bytes .../Savings/SNSAdaptor/assets/benqi.png | Bin 0 -> 59851 bytes .../Savings/SNSAdaptor/assets/compound.png | Bin 0 -> 4201 bytes .../Savings/SNSAdaptor/assets/giest.png | Bin 0 -> 4146 bytes .../Savings/SNSAdaptor/assets/moola.png | Bin 0 -> 13066 bytes .../Savings/SNSAdaptor/assets/tranquil.png | Bin 0 -> 12583 bytes .../mask/src/plugins/Savings/constants.ts | 15 +- .../plugins/Savings/protocols/AAVEProtocol.ts | 254 ---- .../Savings/protocols/aave/AAVEProtocol.ts | 8 + .../plugins/Savings/protocols/aave/pairs.ts | 38 + .../protocols/alpaca/AlpacaProtocol.ts | 211 ++++ .../plugins/Savings/protocols/alpaca/pairs.ts | 56 + .../protocols/aurigami/AurigamiProtocol.ts | 91 ++ .../Savings/protocols/aurigami/pairs.ts | 44 + .../Savings/protocols/aurigami/price.ts | 92 ++ .../Savings/protocols/benqi/BenQiProtocol.ts | 18 + .../plugins/Savings/protocols/benqi/pairs.ts | 49 + .../protocols/common/AAVELikeFetcher.ts | 70 ++ .../protocols/common/CompoundLikeFetcher.ts | 47 + .../common/protocol/AAVELikeProtocol.ts | 146 +++ .../common/protocol/BenQiRewardProtocol.ts | 233 ++++ .../protocol/CompoundBlockBasedProtocol.ts | 170 +++ .../CompoundTimestampBasedProtocol.ts | 176 +++ .../Savings/protocols/common/tokens.ts | 51 + .../protocols/compound/CompoundProtocol.ts | 14 + .../Savings/protocols/compound/pairs.ts | 30 + .../Savings/protocols/giest/GiestProtocol.ts | 8 + .../plugins/Savings/protocols/giest/pairs.ts | 43 + .../src/plugins/Savings/protocols/index.ts | 33 +- .../protocols/{ => ldo}/LDOProtocol.ts | 3 +- .../plugins/Savings/protocols/ldo/pairs.ts | 12 + .../Savings/protocols/moola/MoolaProtocol.ts | 8 + .../plugins/Savings/protocols/moola/pairs.ts | 40 + .../protocols/tranquil/TranquilProtocol.ts | 68 ++ .../Savings/protocols/tranquil/pairs.ts | 56 + packages/mask/src/plugins/Savings/types.ts | 18 + .../state/Hub/TokenIconSpecialIconList.json | 155 +++ .../TokenIcon/TokenIconSpecialIconList.json | 155 +++ packages/typed-message/dom/Metadata/index.ts | 4 +- packages/web3-constants/evm/alpaca.json | 25 + packages/web3-constants/evm/aurigami.json | 163 +++ packages/web3-constants/evm/benqi.json | 48 + packages/web3-constants/evm/compound.json | 25 + packages/web3-constants/evm/giest.json | 48 + packages/web3-constants/evm/moola.json | 48 + packages/web3-constants/evm/token.json | 92 ++ packages/web3-constants/evm/tranquil.json | 71 ++ packages/web3-contracts/abis/AlpacaVault.json | 430 +++++++ .../abis/AlpacaVaultConfig.json | 346 ++++++ packages/web3-contracts/abis/AuriLens.json | 108 ++ .../web3-contracts/abis/BenQiComptroller.json | 1000 +++++++++++++++ .../abis/BenqiChainlinkOracle.json | 122 ++ packages/web3-contracts/abis/CERC20.json | 711 +++++++++++ packages/web3-contracts/abis/CEther.json | 596 +++++++++ packages/web3-contracts/abis/Comptroller.json | 1084 +++++++++++++++++ packages/web3-contracts/abis/QiAvax.json | 671 ++++++++++ packages/web3-contracts/abis/QiERC20.json | 729 +++++++++++ .../abis/TranquilPriceOracleV2.json | 252 ++++ .../web3-contracts/types/AlpacaVault.d.ts | 265 ++++ .../types/AlpacaVaultConfig.d.ts | 226 ++++ packages/web3-contracts/types/AuriLens.d.ts | 47 + .../types/BenQiComptroller.d.ts | 549 +++++++++ .../types/BenqiChainlinkOracle.d.ts | 93 ++ packages/web3-contracts/types/CERC20.d.ts | 391 ++++++ packages/web3-contracts/types/CEther.d.ts | 341 ++++++ .../web3-contracts/types/Comptroller.d.ts | 588 +++++++++ packages/web3-contracts/types/QiAvax.d.ts | 382 ++++++ packages/web3-contracts/types/QiERC20.d.ts | 405 ++++++ .../types/TranquilPriceOracleV2.d.ts | 74 ++ .../web3-shared/evm/constants/constants.ts | 28 + 77 files changed, 12283 insertions(+), 425 deletions(-) create mode 100644 packages/mask/src/plugins/Savings/SNSAdaptor/assets/alpaca.png create mode 100644 packages/mask/src/plugins/Savings/SNSAdaptor/assets/aurigami.png create mode 100644 packages/mask/src/plugins/Savings/SNSAdaptor/assets/benqi.png create mode 100644 packages/mask/src/plugins/Savings/SNSAdaptor/assets/compound.png create mode 100644 packages/mask/src/plugins/Savings/SNSAdaptor/assets/giest.png create mode 100644 packages/mask/src/plugins/Savings/SNSAdaptor/assets/moola.png create mode 100644 packages/mask/src/plugins/Savings/SNSAdaptor/assets/tranquil.png delete mode 100644 packages/mask/src/plugins/Savings/protocols/AAVEProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/aave/AAVEProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/aave/pairs.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/alpaca/AlpacaProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/alpaca/pairs.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/aurigami/AurigamiProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/aurigami/pairs.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/aurigami/price.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/benqi/BenQiProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/benqi/pairs.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/common/AAVELikeFetcher.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/common/CompoundLikeFetcher.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/common/protocol/AAVELikeProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/common/protocol/BenQiRewardProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/common/protocol/CompoundBlockBasedProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/common/protocol/CompoundTimestampBasedProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/common/tokens.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/compound/CompoundProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/compound/pairs.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/giest/GiestProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/giest/pairs.ts rename packages/mask/src/plugins/Savings/protocols/{ => ldo}/LDOProtocol.ts (97%) create mode 100644 packages/mask/src/plugins/Savings/protocols/ldo/pairs.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/moola/MoolaProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/moola/pairs.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/tranquil/TranquilProtocol.ts create mode 100644 packages/mask/src/plugins/Savings/protocols/tranquil/pairs.ts create mode 100644 packages/web3-constants/evm/alpaca.json create mode 100644 packages/web3-constants/evm/aurigami.json create mode 100644 packages/web3-constants/evm/benqi.json create mode 100644 packages/web3-constants/evm/compound.json create mode 100644 packages/web3-constants/evm/giest.json create mode 100644 packages/web3-constants/evm/moola.json create mode 100644 packages/web3-constants/evm/tranquil.json create mode 100644 packages/web3-contracts/abis/AlpacaVault.json create mode 100644 packages/web3-contracts/abis/AlpacaVaultConfig.json create mode 100644 packages/web3-contracts/abis/AuriLens.json create mode 100644 packages/web3-contracts/abis/BenQiComptroller.json create mode 100644 packages/web3-contracts/abis/BenqiChainlinkOracle.json create mode 100644 packages/web3-contracts/abis/CERC20.json create mode 100644 packages/web3-contracts/abis/CEther.json create mode 100644 packages/web3-contracts/abis/Comptroller.json create mode 100644 packages/web3-contracts/abis/QiAvax.json create mode 100644 packages/web3-contracts/abis/QiERC20.json create mode 100644 packages/web3-contracts/abis/TranquilPriceOracleV2.json create mode 100644 packages/web3-contracts/types/AlpacaVault.d.ts create mode 100644 packages/web3-contracts/types/AlpacaVaultConfig.d.ts create mode 100644 packages/web3-contracts/types/AuriLens.d.ts create mode 100644 packages/web3-contracts/types/BenQiComptroller.d.ts create mode 100644 packages/web3-contracts/types/BenqiChainlinkOracle.d.ts create mode 100644 packages/web3-contracts/types/CERC20.d.ts create mode 100644 packages/web3-contracts/types/CEther.d.ts create mode 100644 packages/web3-contracts/types/Comptroller.d.ts create mode 100644 packages/web3-contracts/types/QiAvax.d.ts create mode 100644 packages/web3-contracts/types/QiERC20.d.ts create mode 100644 packages/web3-contracts/types/TranquilPriceOracleV2.d.ts diff --git a/cspell.json b/cspell.json index 0ddac744d862..1df2752f2027 100644 --- a/cspell.json +++ b/cspell.json @@ -27,8 +27,13 @@ "artblocks", "arweave", "attrace", + "auri", + "aurigami", "avalanche", "avax", + "bech", + "benqi", + "betanet", "bgcolor", "bignumber", "binancecoin", @@ -45,6 +50,10 @@ "canonify", "cashtag", "cbridge", + "celer", + "celo", + "cerc20", + "chainlink", "checksummed", "choudhary", "cipherparams", @@ -53,6 +62,10 @@ "codegen", "commentid", "composertitlebar", + "compoundfinance", + "consolas", + "contenteditable", + "contrib", "contribs", "cooldown", "corepack", @@ -84,6 +97,7 @@ "gapcheck", "gasnow", "geckoview", + "giest", "gltf", "goodghosting", "gundb", @@ -195,6 +209,9 @@ "steganographic", "steganography", "stego", + "stnear", + "strat", + "strats", "subrepo", "sushiswap", "swappable", @@ -208,6 +225,7 @@ "topbar", "toruslabs", "traderjoe", + "tranq", "transak", "trisolaris", "twimg", @@ -216,6 +234,7 @@ "typehash", "typeson", "unencrypted", + "unitroller", "unreviewed", "unstake", "unstyled", @@ -234,6 +253,9 @@ "webm", "withdrawed", "wmatic", + "wnative", + "wnear", + "wone", "xdai", "xlarge", "zerion", diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/IconURL.tsx b/packages/mask/src/plugins/Savings/SNSAdaptor/IconURL.tsx index 718a431cd33c..2c86e0e39796 100644 --- a/packages/mask/src/plugins/Savings/SNSAdaptor/IconURL.tsx +++ b/packages/mask/src/plugins/Savings/SNSAdaptor/IconURL.tsx @@ -2,5 +2,12 @@ import { ProtocolType } from '../types' export const ProviderIconURLs: Record = { [ProtocolType.Lido]: new URL('./assets/lido.png', import.meta.url).toString(), + [ProtocolType.BENQI]: new URL('./assets/benqi.png', import.meta.url).toString(), + [ProtocolType.Compound]: new URL('./assets/compound.png', import.meta.url).toString(), [ProtocolType.AAVE]: new URL('./assets/aave.png', import.meta.url).toString(), + [ProtocolType.Aurigami]: new URL('./assets/aurigami.png', import.meta.url).toString(), + [ProtocolType.Giest]: new URL('./assets/giest.png', import.meta.url).toString(), + [ProtocolType.Alpaca]: new URL('./assets/alpaca.png', import.meta.url).toString(), + [ProtocolType.Moola]: new URL('./assets/moola.png', import.meta.url).toString(), + [ProtocolType.Tranquil]: new URL('./assets/tranquil.png', import.meta.url).toString(), } diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialog.tsx b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialog.tsx index 4662e23a3c69..62f2daf53641 100644 --- a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialog.tsx +++ b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialog.tsx @@ -1,16 +1,9 @@ import { useMemo, useState } from 'react' import { useAsync, useUpdateEffect } from 'react-use' -import { DialogContent } from '@mui/material' +import { DialogContent, CircularProgress } from '@mui/material' import { isDashboardPage, EMPTY_LIST } from '@masknet/shared-base' import { FolderTabPanel, FolderTabs } from '@masknet/theme' -import { - createContract, - ChainId, - SchemaType, - getAaveConstants, - ZERO_ADDRESS, - networkResolver, -} from '@masknet/web3-shared-evm' +import { ChainId, networkResolver } from '@masknet/web3-shared-evm' import { useI18N } from '../../../utils' import { InjectedDialog } from '@masknet/shared' import { WalletStatusBox } from '../../../components/shared/WalletStatusBox' @@ -22,15 +15,11 @@ import { SavingsProtocol, TabType } from '../types' import { useStyles } from './SavingsDialogStyles' import { SavingsTable } from './SavingsTable' import { SavingsForm } from './SavingsForm' -import type { AaveProtocolDataProvider } from '@masknet/web3-contracts/types/AaveProtocolDataProvider' -import AaveProtocolDataProviderABI from '@masknet/web3-contracts/abis/AaveProtocolDataProvider.json' -import { LidoProtocol } from '../protocols/LDOProtocol' -import { AAVEProtocol } from '../protocols/AAVEProtocol' -import { LDO_PAIRS } from '../constants' -import type { AbiItem } from 'web3-utils' -import { flatten, compact, chunk } from 'lodash-unified' -import { useChainId, useFungibleTokens, useWeb3 } from '@masknet/plugin-infra/web3' -import { FungibleToken, NetworkPluginID } from '@masknet/web3-shared-base' +import { flatten } from 'lodash-unified' +import { useChainId, useWeb3, useWeb3Connection } from '@masknet/plugin-infra/web3' +import { NetworkPluginID } from '@masknet/web3-shared-base' +import { SavingsProtocols, LazyProtocolsResolvers } from '../protocols' + export interface SavingsDialogProps { open: boolean onClose?: () => void @@ -44,6 +33,7 @@ export function SavingsDialog({ open, onClose }: SavingsDialogProps) { const currentChainId = useChainId(NetworkPluginID.PLUGIN_EVM) const [chainId, setChainId] = useState(currentChainId) const web3 = useWeb3(NetworkPluginID.PLUGIN_EVM, { chainId }) + const connection = useWeb3Connection(NetworkPluginID.PLUGIN_EVM, { chainId }) const [tab, setTab] = useState(TabType.Deposit) const [selectedProtocol, setSelectedProtocol] = useState(null) @@ -53,46 +43,22 @@ export function SavingsDialog({ open, onClose }: SavingsDialogProps) { return networks.map((network) => networkResolver.networkChainId(network)) }, []) - const { value: aaveTokens } = useAsync(async () => { - if (!open || chainId !== ChainId.Mainnet) { - return EMPTY_LIST + const { loading: lazyLoading, value: lazyProtocols } = useAsync(async () => { + const currentChainLazyResolvers = LazyProtocolsResolvers.filter((_) => _.supportChains.includes(chainId)) + try { + const allResults = await Promise.all( + currentChainLazyResolvers.map((resolver) => resolver.resolve(chainId, web3, connection)), + ) + return flatten(allResults) + } catch (error) { + console.error('lazyProtocols: resolve error', error) } + return [] + }, [web3, chainId]) - const address = getAaveConstants(chainId).AAVE_PROTOCOL_DATA_PROVIDER_CONTRACT_ADDRESS || ZERO_ADDRESS - - const protocolDataContract = createContract( - web3, - address, - AaveProtocolDataProviderABI as AbiItem[], - ) - - const tokens = await protocolDataContract?.methods.getAllReservesTokens().call() - - const aTokens = await protocolDataContract?.methods.getAllATokens().call() - - return tokens?.map((token) => { - return [token[1], aTokens?.filter((f) => f[0].toUpperCase() === `a${token[0]}`.toUpperCase())[0][1]] - }) - }, [open, web3, chainId]) - - const { value: detailedAaveTokens } = useFungibleTokens( - NetworkPluginID.PLUGIN_EVM, - compact(flatten(aaveTokens ?? [])), - { - chainId, - }, - ) - - const protocols = useMemo( - () => [ - ...LDO_PAIRS.filter((x) => x[0].chainId === chainId).map((pair) => new LidoProtocol(pair)), - ...chunk(detailedAaveTokens, 2).map( - (pair) => - new AAVEProtocol(pair as [FungibleToken, FungibleToken]), - ), - ], - [chainId, detailedAaveTokens, tab], - ) + const protocols = useMemo(() => { + return [...SavingsProtocols, ...(lazyProtocols ?? [])].filter((x) => x.bareToken.chainId === chainId) + }, [chainId, lazyProtocols]) useUpdateEffect(() => { setChainId(currentChainId) @@ -134,22 +100,34 @@ export function SavingsDialog({ open, onClose }: SavingsDialogProps) {
- + {lazyLoading ? ( +
+ +
+ ) : ( + + )}
- + {lazyLoading ? ( +
+ +
+ ) : ( + + )}
diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialogStyles.tsx b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialogStyles.tsx index 8b13fe54e7b3..3fc048768172 100644 --- a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialogStyles.tsx +++ b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialogStyles.tsx @@ -48,4 +48,11 @@ export const useStyles = makeStyles<{ isDashboard: boolean }>()((theme, { isDash width: 535, margin: 'auto', }, + loading: { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + minHeight: 300, + width: '100%', + }, })) diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsForm.tsx b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsForm.tsx index b10958dba553..f92e1f286bb4 100644 --- a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsForm.tsx +++ b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsForm.tsx @@ -1,31 +1,19 @@ import { useState, useCallback, useMemo } from 'react' import { useAsync, useAsyncFn } from 'react-use' -import type { AbiItem } from 'web3-utils' import BigNumber from 'bignumber.js' import { unreachable } from '@dimensiondev/kit' import { isLessThan, rightShift, - createLookupTableResolver, NetworkPluginID, ZERO, isSameAddress, formatBalance, formatCurrency, } from '@masknet/web3-shared-base' -import { - createContract, - createERC20Token, - SchemaType, - getAaveConstants, - useTokenConstants, - ZERO_ADDRESS, - chainResolver, -} from '@masknet/web3-shared-evm' +import { createERC20Token, SchemaType, useTokenConstants, chainResolver } from '@masknet/web3-shared-evm' import { useAccount, useFungibleTokenBalance, useFungibleTokenPrice, useWeb3 } from '@masknet/plugin-infra/web3' import { FormattedCurrency, LoadingAnimation, TokenAmountPanel, TokenIcon, useOpenShareTxDialog } from '@masknet/shared' -import type { AaveLendingPoolAddressProvider } from '@masknet/web3-contracts/types/AaveLendingPoolAddressProvider' -import AaveLendingPoolAddressProviderABI from '@masknet/web3-contracts/abis/AaveLendingPoolAddressProvider.json' import { useRemoteControlledDialog } from '@masknet/shared-base-ui' import { useI18N } from '../../../utils' import { WalletConnectedBoundary } from '../../../web3/UI/WalletConnectedBoundary' @@ -47,13 +35,13 @@ export interface SavingsFormProps { onClose?: () => void } -export const resolveProtocolName = createLookupTableResolver( - { - [ProtocolType.Lido]: 'Lido', - [ProtocolType.AAVE]: 'AAVE', - }, - 'unknown', -) +// export const resolveProtocolName = createLookupTableResolver( +// { +// [ProtocolType.Lido]: 'Lido', +// [ProtocolType.AAVE]: 'AAVE', +// }, +// 'unknown', +// ) export function SavingsForm({ chainId, protocol, tab, onClose }: SavingsFormProps) { const { t } = useI18N() @@ -145,24 +133,13 @@ export function SavingsForm({ chainId, protocol, tab, onClose }: SavingsFormProp const { value: approvalData } = useAsync(async () => { const token = protocol.bareToken - const aavePoolAddress = - getAaveConstants(chainId).AAVE_LENDING_POOL_ADDRESSES_PROVIDER_CONTRACT_ADDRESS || ZERO_ADDRESS - - const lPoolAddressProviderContract = createContract( - web3, - aavePoolAddress, - AaveLendingPoolAddressProviderABI as AbiItem[], - ) - - const poolAddress = await lPoolAddressProviderContract?.methods.getLendingPool().call() - return { approveToken: token.schema === SchemaType.ERC20 ? createERC20Token(chainId, token.address, token.name, token.symbol, token.decimals) : undefined, approveAmount: new BigNumber(inputAmount).shiftedBy(token.decimals), - approveAddress: poolAddress, + approveAddress: protocol.approveAddress, } }, [protocol.bareToken, inputAmount, chainId]) diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsTable.tsx b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsTable.tsx index 0cf17b3dd104..d07e67358201 100644 --- a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsTable.tsx +++ b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsTable.tsx @@ -8,7 +8,10 @@ import type { ChainId, Web3 } from '@masknet/web3-shared-evm' import { ProviderIconURLs } from './IconURL' import { useI18N } from '../../../utils' import { SavingsProtocol, TabType } from '../types' -import { useAccount, useWeb3, useFungibleAssets } from '@masknet/plugin-infra/web3' +import { useAccount, useWeb3, useBalance, useFungibleAssets } from '@masknet/plugin-infra/web3' +import { useMemo } from 'react' +import BigNumber from 'bignumber.js' +import { SchemaType } from '@masknet/web3-shared-evm' const useStyles = makeStyles()((theme, props) => ({ containerWrap: { @@ -58,6 +61,7 @@ const useStyles = makeStyles()((theme, props) => ({ position: 'absolute', bottom: 0, right: '-5px', + borderRadius: '16px', }, protocolLabel: {}, placeholder: { @@ -107,17 +111,38 @@ export function SavingsTable({ chainId, tab, protocols, setTab, setSelectedProto const web3 = useWeb3(NetworkPluginID.PLUGIN_EVM, { chainId }) const account = useAccount(NetworkPluginID.PLUGIN_EVM) + const { value: balance = '0', loading: loadingBalance } = useBalance(NetworkPluginID.PLUGIN_EVM) + const { value: assets, loading: getAssetsLoading } = useFungibleAssets(NetworkPluginID.PLUGIN_EVM) // Only fetch protocol APR and Balance on chainId change const { loading } = useAsync(async () => { await Promise.all( protocols.map(async (protocol) => { - await protocol.updateApr(chainId, web3 as Web3) - await protocol.updateBalance(chainId, web3 as Web3, account) + return tab === TabType.Deposit + ? protocol.updateApr(chainId, web3 as Web3) + : protocol.updateBalance(chainId, web3 as Web3, account) }), ) }, [chainId, web3, account, protocols]) + + const hiddenZeroAssetProtocol = true + + const displayProtocols = useMemo(() => { + return tab === TabType.Deposit + ? protocols.filter((protocol) => { + if (!assets) return false + const bareToken = protocol.bareToken + // protocol has balance + const isNative = bareToken.schema === SchemaType.Native + const assetBalance = isNative + ? balance + : assets!.find((x) => isSameAddress(x.address, bareToken.address))?.balance + return hiddenZeroAssetProtocol ? assetBalance && !new BigNumber(assetBalance).isZero() : true + }) + : protocols.filter((x) => !x.balance.isZero()) + }, [protocols, loading, assets, balance]) + return ( @@ -142,65 +167,65 @@ export function SavingsTable({ chainId, tab, protocols, setTab, setSelectedProto {t('popups_loading')} - ) : protocols.length ? ( + ) : displayProtocols.length ? (
- {protocols - .filter((x) => !x.balance.isZero()) - .map((protocol, index) => ( - - -
- - -
-
- - {protocol.bareToken.symbol} - -
+ {displayProtocols.map((protocol, index) => ( + + +
+ + +
+
+ + {protocol.bareToken.symbol} + +
+
+ {tab === TabType.Deposit ? ( + + {protocol.apr}% - {tab === TabType.Deposit ? ( - - {protocol.apr}% - - ) : null} - - - + ) : null} + + + isSameAddress(x.address, protocol.bareToken.address), )?.balance - : protocol.balance - } - decimals={protocol.bareToken.decimals} - significant={6} - minimumBalance={rightShift(10, protocol.bareToken.decimals - 6)} - formatter={formatBalance} - /> - - - - - + : protocol.balance + } + decimals={protocol.bareToken.decimals} + significant={6} + minimumBalance={rightShift(10, protocol.bareToken.decimals - 6)} + formatter={formatBalance} + /> + + + + - ))} +
+ ))}
) : (
diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/assets/alpaca.png b/packages/mask/src/plugins/Savings/SNSAdaptor/assets/alpaca.png new file mode 100644 index 0000000000000000000000000000000000000000..363fb15ae4b7153d763b352714e5a9ac93e54f21 GIT binary patch literal 33421 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�-s+ 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 literal 0 HcmV?d00001 diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/assets/aurigami.png b/packages/mask/src/plugins/Savings/SNSAdaptor/assets/aurigami.png new file mode 100644 index 0000000000000000000000000000000000000000..3a02c00936b43211e057ec1fc118312345cf7694 GIT binary patch literal 8874 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 OT2$2!)SBew?Dj6N4BC9AuMp+#zvNJM| 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

nqXsoKx3ICf@a`*Z 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 HeCPiG_w?>= literal 0 HcmV?d00001 diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/assets/compound.png b/packages/mask/src/plugins/Savings/SNSAdaptor/assets/compound.png new file mode 100644 index 0000000000000000000000000000000000000000..8e6658dca60021a2d288acc5b764c8a31d81cfbb GIT binary patch literal 4201 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 literal 0 HcmV?d00001 diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/assets/giest.png b/packages/mask/src/plugins/Savings/SNSAdaptor/assets/giest.png new file mode 100644 index 0000000000000000000000000000000000000000..21ba007db4d9b0276795169fb1ec83dea512ddc1 GIT binary patch literal 4146 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 literal 0 HcmV?d00001 diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/assets/tranquil.png b/packages/mask/src/plugins/Savings/SNSAdaptor/assets/tranquil.png new file mode 100644 index 0000000000000000000000000000000000000000..055fca4958d2629e76f6edad09bfbbeadc30b9b3 GIT binary patch literal 12583 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, FungibleToke createERC20Tokens('aFEI_ADDRESS', 'aFEI', 'aFEI', 18)[ChainId.Mainnet], ], ] + +export const COMPOUND_COMPTROLLER = getCompoundConstants(ChainId.Mainnet).COMPTROLLER || ZERO_ADDRESS + +export const BENQI_COMPTROLLER = getBenQiConstants(ChainId.Avalanche).COMPTROLLER || ZERO_ADDRESS +export const BENQI_ChainlinkOracle = getBenQiConstants(ChainId.Avalanche).ORACLE || ZERO_ADDRESS diff --git a/packages/mask/src/plugins/Savings/protocols/AAVEProtocol.ts b/packages/mask/src/plugins/Savings/protocols/AAVEProtocol.ts deleted file mode 100644 index 4c1ddaf1e699..000000000000 --- a/packages/mask/src/plugins/Savings/protocols/AAVEProtocol.ts +++ /dev/null @@ -1,254 +0,0 @@ -import BigNumber from 'bignumber.js' -import type Web3 from 'web3' -import type { AbiItem } from 'web3-utils' -import AaveLendingPoolABI from '@masknet/web3-contracts/abis/AaveLendingPool.json' -import AaveLendingPoolAddressProviderABI from '@masknet/web3-contracts/abis/AaveLendingPoolAddressProvider.json' -import ERC20ABI from '@masknet/web3-contracts/abis/ERC20.json' -import type { AaveLendingPool } from '@masknet/web3-contracts/types/AaveLendingPool' -import type { AaveLendingPoolAddressProvider } from '@masknet/web3-contracts/types/AaveLendingPoolAddressProvider' -import type { ERC20 } from '@masknet/web3-contracts/types/ERC20' -import { FungibleToken, pow10, ZERO } from '@masknet/web3-shared-base' -import { - ChainId, - createContract, - getAaveConstants, - SchemaType, - TransactionEventType, - ZERO_ADDRESS, -} from '@masknet/web3-shared-evm' -import { ProtocolType, SavingsProtocol } from '../types' - -export class AAVEProtocol implements SavingsProtocol { - static DEFAULT_APR = '0.17' - - private _apr = '0.00' - private _balance = ZERO - - constructor(readonly pair: [FungibleToken, FungibleToken]) {} - - get type() { - return ProtocolType.AAVE - } - - get apr() { - return this._apr - } - - get balance() { - return this._balance - } - - get bareToken() { - return this.pair[0] - } - - get stakeToken() { - return this.pair[1] - } - - public async updateApr(chainId: ChainId, web3: Web3) { - try { - const subgraphUrl = getAaveConstants(chainId).AAVE_SUBGRAPHS || '' - - if (!subgraphUrl) { - this._apr = AAVEProtocol.DEFAULT_APR - return - } - - const body = JSON.stringify({ - query: `{ - reserves (where: { - underlyingAsset: "${this.bareToken.address}" - pool: "0xb53c1a33016b2dc2ff3653530bff1848a515c8c5" - }) { - id - name - underlyingAsset - price { - id - } - liquidityRate - } - }`, - }) - const response = await fetch(subgraphUrl, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body, - }) - const fullResponse: { - data: { - reserves: Array<{ - id: string - name: string - decimals: number - underlyingAsset: string - liquidityRate: number - }> - } - } = await response.json() - const liquidityRate = +fullResponse.data.reserves[0].liquidityRate - - const RAY = pow10(27) // 10 to the power 27 - - // APY and APR are returned here as decimals, multiply by 100 to get the percents - this._apr = new BigNumber(liquidityRate).times(100).div(RAY).toFixed(2) - } catch (error) { - console.error('AAVE: Apr Error:', error) - this._apr = AAVEProtocol.DEFAULT_APR - } - } - - public async updateBalance(chainId: ChainId, web3: Web3, account: string) { - try { - const subgraphUrl = getAaveConstants(chainId).AAVE_SUBGRAPHS || '' - - if (!subgraphUrl) { - this._apr = AAVEProtocol.DEFAULT_APR - return - } - - const body = JSON.stringify({ - query: `{ - reserves (where: { - underlyingAsset: "${this.bareToken.address}" - pool : "0xb53c1a33016b2dc2ff3653530bff1848a515c8c5" - }) { - id - aToken { - id - } - } - }`, - }) - const response = await fetch(subgraphUrl, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body, - }) - - const fullResponse: { - data: { - reserves: Array<{ - aToken: { - id: string - } - }> - } - } = await response.json() - - const aTokenId = fullResponse.data.reserves[0].aToken.id - const contract = createContract(web3, aTokenId || ZERO_ADDRESS, ERC20ABI as AbiItem[]) - this._balance = new BigNumber((await contract?.methods.balanceOf(account).call()) ?? '0') - } catch (error) { - console.error('AAVE BALANCE ERROR: ', error) - this._balance = ZERO - } - } - - public async depositEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { - try { - const operation = await this.createDepositTokenOperation(account, chainId, web3, value) - const gasEstimate = await operation?.estimateGas({ - from: account, - }) - - return new BigNumber(gasEstimate || 0) - } catch (error) { - console.error('AAVE deposit estimate ERROR: ', error) - return ZERO - } - } - - private async createDepositTokenOperation(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { - const aaveLPoolAddress = - getAaveConstants(chainId).AAVE_LENDING_POOL_ADDRESSES_PROVIDER_CONTRACT_ADDRESS || ZERO_ADDRESS - const lPoolAddressProviderContract = createContract( - web3, - aaveLPoolAddress, - AaveLendingPoolAddressProviderABI as AbiItem[], - ) - - const poolAddress = await lPoolAddressProviderContract?.methods.getLendingPool().call() - - const contract = createContract( - web3, - poolAddress || ZERO_ADDRESS, - AaveLendingPoolABI as AbiItem[], - ) - return contract?.methods.deposit(this.bareToken.address, new BigNumber(value).toFixed(), account, '0') - } - - public async deposit(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { - const gasEstimate = await this.depositEstimate(account, chainId, web3, value) - const operation = await this.createDepositTokenOperation(account, chainId, web3, value) - if (!operation) { - throw new Error("Can't create deposit operation") - } - return new Promise((resolve, reject) => { - operation - .send({ - from: account, - gas: gasEstimate.toNumber(), - }) - .once(TransactionEventType.ERROR, reject) - .once(TransactionEventType.CONFIRMATION, (_, receipt) => { - resolve(receipt.transactionHash) - }) - }) - } - - public async withdrawEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { - try { - const lPoolAddressProviderContract = createContract( - web3, - getAaveConstants(chainId).AAVE_LENDING_POOL_ADDRESSES_PROVIDER_CONTRACT_ADDRESS || ZERO_ADDRESS, - AaveLendingPoolAddressProviderABI as AbiItem[], - ) - - const poolAddress = await lPoolAddressProviderContract?.methods.getLendingPool().call() - - const contract = createContract( - web3, - poolAddress || ZERO_ADDRESS, - AaveLendingPoolABI as AbiItem[], - ) - const gasEstimate = await contract?.methods - .withdraw(this.bareToken.address, new BigNumber(value).toFixed(), account) - .estimateGas({ - from: account, - }) - return new BigNumber(gasEstimate || 0) - } catch (error) { - return ZERO - } - } - - public async withdraw(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { - const lPoolAddressProviderContract = createContract( - web3, - getAaveConstants(chainId).AAVE_LENDING_POOL_ADDRESSES_PROVIDER_CONTRACT_ADDRESS || ZERO_ADDRESS, - AaveLendingPoolAddressProviderABI as AbiItem[], - ) - - const poolAddress = await lPoolAddressProviderContract?.methods.getLendingPool().call() - - const gasEstimate = await this.withdrawEstimate(account, chainId, web3, value) - const contract = createContract( - web3, - poolAddress || ZERO_ADDRESS, - AaveLendingPoolABI as AbiItem[], - ) - return new Promise((resolve) => - contract?.methods - .withdraw(this.bareToken.address, new BigNumber(value).toFixed(), account) - .send({ - from: account, - gas: gasEstimate.toNumber(), - }) - .once(TransactionEventType.CONFIRMATION, (_, receipt) => { - resolve(receipt.transactionHash) - }), - ) - } -} diff --git a/packages/mask/src/plugins/Savings/protocols/aave/AAVEProtocol.ts b/packages/mask/src/plugins/Savings/protocols/aave/AAVEProtocol.ts new file mode 100644 index 000000000000..6b5ce198ec98 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/aave/AAVEProtocol.ts @@ -0,0 +1,8 @@ +import { ProtocolType } from '../../types' +import AAVELikeProtocol from '../common/protocol/AAVELikeProtocol' + +export class AAVEProtocol extends AAVELikeProtocol { + override get type() { + return ProtocolType.AAVE + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/aave/pairs.ts b/packages/mask/src/plugins/Savings/protocols/aave/pairs.ts new file mode 100644 index 000000000000..b3aabe1d8c4c --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/aave/pairs.ts @@ -0,0 +1,38 @@ +import type Web3 from 'web3' +import { ChainId, getAaveConstants, ZERO_ADDRESS } from '@masknet/web3-shared-evm' +import type { SavingsProtocol, ProtocolPairsResolver, PairToken } from '../../types' +import AAVELikeFetcher from '../common/AAVELikeFetcher' +import { AAVEProtocol } from './AAVEProtocol' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +const AaveProtocolDataProvider = + getAaveConstants(ChainId.Mainnet).AAVE_PROTOCOL_DATA_PROVIDER_CONTRACT_ADDRESS || ZERO_ADDRESS +const LendingPoolAddressProvider = + getAaveConstants(ChainId.Mainnet).AAVE_LENDING_POOL_ADDRESSES_PROVIDER_CONTRACT_ADDRESS || ZERO_ADDRESS + +export class AAVEResolver implements ProtocolPairsResolver { + public supportChains: ChainId[] = [ChainId.Mainnet] + public async resolve( + chainId: ChainId, + web3: Web3, + connection: Web3Helper.Web3ConnectionScope, + ): Promise { + if (!this.supportChains.includes(chainId)) { + return [] + } + + const allPairsWithArgs = await AAVELikeFetcher.fetch( + AaveProtocolDataProvider, + LendingPoolAddressProvider, + chainId, + web3, + connection, + ) + return allPairsWithArgs.map((args) => { + const [pair, pool, dataProvider] = args + return new AAVEProtocol(pair as PairToken, pool as string, dataProvider as string) + }) + } +} + +export const aaveLazyResolver = new AAVEResolver() diff --git a/packages/mask/src/plugins/Savings/protocols/alpaca/AlpacaProtocol.ts b/packages/mask/src/plugins/Savings/protocols/alpaca/AlpacaProtocol.ts new file mode 100644 index 000000000000..2e7cf6ec3ba2 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/alpaca/AlpacaProtocol.ts @@ -0,0 +1,211 @@ +import type Web3 from 'web3' +import type { AbiItem } from 'web3-utils' +import BigNumber from 'bignumber.js' +import { ZERO } from '@masknet/web3-shared-base' +import { ChainId, createContract, TransactionEventType } from '@masknet/web3-shared-evm' +import { ProtocolType, PairToken, SavingsProtocol } from '../../types' +import type { AlpacaVault } from '@masknet/web3-contracts/types/AlpacaVault' +import AlpacaVaultABI from '@masknet/web3-contracts/abis/AlpacaVault.json' +import type { AlpacaVaultConfig } from '@masknet/web3-contracts/types/AlpacaVaultConfig' +import AlpacaVaultConfigABI from '@masknet/web3-contracts/abis/AlpacaVaultConfig.json' +import { SUMMARY_API } from './pairs' + +export const TIMESTAMPS_PER_DAY = 60 * 60 * 24 +export const DAYS_PER_YEAR = 365 + +export function createAlpacaContract(address: string, web3: Web3) { + return createContract(web3, address, AlpacaVaultABI as AbiItem[]) +} + +export function createAlpacaConfigContract(address: string, web3: Web3) { + return createContract(web3, address, AlpacaVaultConfigABI as AbiItem[]) +} + +export class AlpacaProtocol implements SavingsProtocol { + static DEFAULT_APR = '0.00' + + private _apr = '0.00' + private _balance = ZERO + static nativeToken = 'ibBNB' + + constructor(readonly pair: PairToken) {} + + get type() { + return ProtocolType.Alpaca + } + + get apr() { + return this._apr + } + + get balance() { + return this._balance + } + + get bareToken() { + return this.pair[0] + } + + get stakeToken() { + return this.pair[1] + } + + get approveAddress() { + return this.stakeToken.address + } + + get isNativeToken() { + return this.stakeToken.symbol === AlpacaProtocol.nativeToken + } + + public getPoolContract(web3: Web3) { + return createAlpacaContract(this.stakeToken.address, web3) + } + + public async updateApr(chainId: ChainId, web3: Web3) { + try { + if (!SUMMARY_API) { + this._apr = AlpacaProtocol.DEFAULT_APR + return + } + const req = await fetch(SUMMARY_API) + const response = await req.json() + const { lendingPools } = response.data + const summary = lendingPools.find((_: any) => _.ibToken.address === this.stakeToken.address) + this._apr = new BigNumber(summary.lendingApr).toFixed(2) + } catch (error) { + this._apr = AlpacaProtocol.DEFAULT_APR + } + } + + public async updateBalance(chainId: ChainId, web3: Web3, account: string) { + try { + const contract = this.getPoolContract(web3) + if (contract === null) { + this._balance = ZERO + return + } + const [shares, sharePrice] = await Promise.all([ + contract.methods.balanceOf(account).call(), + this.getSharePrice(web3), + ]) + // balance = shares * sharePrice + this._balance = new BigNumber(shares).multipliedBy(new BigNumber(sharePrice)).shiftedBy(-18) + } catch (error) { + this._balance = ZERO + } + } + + private async getSharePrice(web3: Web3): Promise { + try { + const contract = this.getPoolContract(web3) + if (contract === null) { + return ZERO + } + const [totalToken, totalSupply] = await Promise.all([ + contract.methods.totalToken().call(), + contract.methods.totalSupply().call(), + ]) + // sharePrice = totalToken / totalSupply + return new BigNumber(totalToken).shiftedBy(18).dividedBy(new BigNumber(totalSupply)) + } catch (error) { + return ZERO + } + } + + private async amountToShares(web3: Web3, value: BigNumber.Value) { + const sharePrice = await this.getSharePrice(web3) + // shares = amount / sharePrice + const shares = new BigNumber(value).shiftedBy(18).div(new BigNumber(sharePrice)) + return shares.toFixed(0) + } + + public async depositEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + try { + const operation = await this.createDepositTokenOperation(web3, value) + const gasEstimate = await operation?.estimateGas( + this.isNativeToken + ? { + value: value.toString(), + from: account, + } + : { + from: account, + }, + ) + return new BigNumber(gasEstimate || 0) + } catch (error) { + return ZERO + } + } + + private async createDepositTokenOperation(web3: Web3, value: BigNumber.Value) { + const contract = this.getPoolContract(web3) + return contract?.methods.deposit(value.toString()) + } + + public async deposit(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + const gasEstimate = await this.depositEstimate(account, chainId, web3, value) + const operation = await this.createDepositTokenOperation(web3, value) + const args = this.isNativeToken + ? { + value: value.toString(), + from: account, + gas: gasEstimate.toNumber(), + } + : { + from: account, + gas: gasEstimate.toNumber(), + } + + if (!operation) { + throw new Error("Can't create deposit operation") + } + return new Promise((resolve, reject) => { + operation + .send(args) + .once(TransactionEventType.ERROR, reject) + .once(TransactionEventType.CONFIRMATION, (_, receipt) => { + resolve(receipt.transactionHash) + }) + }) + } + + private async createWithdrawTokenOperation(web3: Web3, value: BigNumber.Value) { + const contract = this.getPoolContract(web3) + const sharesToWithdraw = await this.amountToShares(web3, value) + return contract?.methods.withdraw(sharesToWithdraw) + } + + public async withdrawEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + try { + const operation = await this.createWithdrawTokenOperation(web3, value) + const gasEstimate = await operation?.estimateGas({ + from: account, + }) + return new BigNumber(gasEstimate || 0) + } catch (error) { + return ZERO + } + } + + public async withdraw(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + const gasEstimate = await this.withdrawEstimate(account, chainId, web3, value) + const operation = await this.createWithdrawTokenOperation(web3, value) + + if (!operation) { + throw new Error("Can't create withdraw operation") + } + + return new Promise((resolve) => + operation + .send({ + from: account, + gas: gasEstimate.toNumber(), + }) + .once(TransactionEventType.CONFIRMATION, (_, receipt) => { + resolve(receipt.transactionHash) + }), + ) + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/alpaca/pairs.ts b/packages/mask/src/plugins/Savings/protocols/alpaca/pairs.ts new file mode 100644 index 000000000000..0335d3ae90d8 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/alpaca/pairs.ts @@ -0,0 +1,56 @@ +import { getAlpacaConstants, createNativeToken, ChainId } from '@masknet/web3-shared-evm' +import { AlpacaProtocol } from './AlpacaProtocol' +import type Web3 from 'web3' +import type { SavingsProtocol, PairToken, ProtocolPairsResolver } from '../../types' +import { flatten, chunk } from 'lodash-unified' +import { getFungibleTokensDetailed } from '../common/tokens' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +export const SUMMARY_API = getAlpacaConstants(ChainId.BSC).SUMMARY_API + +export class PairResolver implements ProtocolPairsResolver { + public supportChains: ChainId[] = [ChainId.BSC] + public async resolve( + chainId: ChainId, + web3: Web3, + connection: Web3Helper.Web3ConnectionScope, + ): Promise { + if (!this.supportChains.includes(chainId)) { + return [] + } + if (!SUMMARY_API) return [] + const response = await fetch(SUMMARY_API) + const fullResponse: { + data: { + lendingPools: Array<{ + baseToken: { + address: string + symbol: string + } + ibToken: { + address: string + symbol: string + } + }> + } + } = await response.json() + const allTokens = flatten( + fullResponse.data.lendingPools.map((_) => { + return [_.baseToken.address, _.ibToken.address] + }), + ).map((m) => { + return m + }) + + const detailedTokens = await getFungibleTokensDetailed(allTokens, connection, chainId) + return chunk(detailedTokens, 2).map((pair) => { + const [bareToken, stakeToken] = pair + if (stakeToken.symbol === AlpacaProtocol.nativeToken) { + pair[0] = createNativeToken(ChainId.BSC) + } + return new AlpacaProtocol(pair as PairToken) + }) + } +} + +export const alpacaLazyResolver = new PairResolver() diff --git a/packages/mask/src/plugins/Savings/protocols/aurigami/AurigamiProtocol.ts b/packages/mask/src/plugins/Savings/protocols/aurigami/AurigamiProtocol.ts new file mode 100644 index 000000000000..90702d97ffd0 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/aurigami/AurigamiProtocol.ts @@ -0,0 +1,91 @@ +import type Web3 from 'web3' +import type { AbiItem } from 'web3-utils' +import { createContract } from '@masknet/web3-shared-evm' +import { ProtocolType, PairToken, TokenDetail } from '../../types' +import { + default as BenQiRewardProtocol, + RewardToken, + MarketStatus, + emptyRewardType, + PairConfig, +} from '../common/protocol/BenQiRewardProtocol' +import BigNumber from 'bignumber.js' + +import type { AuriLens } from '@masknet/web3-contracts/types/AuriLens' +import AuriLensABI from '@masknet/web3-contracts/abis/AuriLens.json' +import { MARKETS_NOT_IN_PRICE_ORACLE, getNoneInPriceOraclePrices } from './price' + +export function getLensContract(address: string, web3: Web3) { + return createContract(web3, address, AuriLensABI as AbiItem[]) +} + +const auRewardTokenSymbol = 'auPLY' +const rewardTokens: RewardToken[] = [ + { + symbol: auRewardTokenSymbol, + rewardType: emptyRewardType, + }, +] + +export default class AurigamiProtocol extends BenQiRewardProtocol { + static nativeToken = 'auETH' + + constructor(pair: PairToken, allPairs: PairToken[], config: PairConfig) { + super(pair, AurigamiProtocol.nativeToken, allPairs, rewardTokens, config) + } + override get type() { + return ProtocolType.Aurigami + } + + // load price + public override async fetchPrices( + matchPairs: Array<{ + underlying: TokenDetail + market: TokenDetail + }>, + notInPairTokens: RewardToken[], + web3: Web3, + ) { + if (!this.config.lens) return [] + const lens = getLensContract(this.config.lens, web3) + if (lens === null) return [] + return Promise.all( + matchPairs + .filter((_) => _.market.symbol !== undefined) + .map(async (item) => { + const { underlying, market } = item + const notInOracle = market.symbol ? MARKETS_NOT_IN_PRICE_ORACLE.includes(market.symbol) : false + const price = notInOracle + ? await getNoneInPriceOraclePrices(web3, market.symbol) + : (await lens.methods.auTokenUnderlyingPrice(market.address).call())[1] + // https://github.com/Aurigami-Finance/aurigami-smart-contracts/blob/main/contracts/AuriOracle.sol#L124 + const defaultDecimals = 18 + const decimalDefault = 8 + const paddingDecimals = 10 + const decimalDelta = underlying.decimals - defaultDecimals + const divideDecimals = + underlying.decimals <= defaultDecimals + ? decimalDefault + paddingDecimals + defaultDecimals - underlying.decimals + : decimalDefault + paddingDecimals - decimalDelta + return { + symbol: market.symbol, + price: notInOracle ? price : new BigNumber(price).shiftedBy(-divideDecimals), + } as MarketStatus + }), + ) + } + + public override async fetchSpeeds(web3: Web3) { + if (!this.config.lens) return [] + const lens = getLensContract(this.config.lens, web3) + if (lens === null) return [] + const [plyRewardSupplySpeed, plyRewardBorrowSpeed, auroraRewardSupplySpeed, auroraRewardBorrowSpeed] = + await lens.methods.getRewardSpeeds(this.config.comptroller, this.stakeToken.address).call() + return [ + { + symbol: auRewardTokenSymbol, + speed: new BigNumber(plyRewardSupplySpeed), + }, + ] + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/aurigami/pairs.ts b/packages/mask/src/plugins/Savings/protocols/aurigami/pairs.ts new file mode 100644 index 000000000000..8a00fe157fbb --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/aurigami/pairs.ts @@ -0,0 +1,44 @@ +import type Web3 from 'web3' +import { ChainId, createNativeToken, ZERO_ADDRESS, getAurigamiConstants } from '@masknet/web3-shared-evm' +import type { SavingsProtocol, ProtocolPairsResolver, PairToken } from '../../types' +import CompoundLikeFetcher from '../common/CompoundLikeFetcher' +import AurigamiProtocol from './AurigamiProtocol' +import type { PairConfig } from '../common/protocol/BenQiRewardProtocol' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +export const AURIGAMI_COMPTROLLER = getAurigamiConstants(ChainId.Aurora).COMPTROLLER || ZERO_ADDRESS +export const AURIGAMI_ORACLE = getAurigamiConstants(ChainId.Aurora).ORACLE || ZERO_ADDRESS +export const AURIGAMI_LENS = getAurigamiConstants(ChainId.Aurora).LENS || ZERO_ADDRESS + +const excludePairs = ['DAI', 'USN', 'TRI'] + +const pairConfig = { + comptroller: AURIGAMI_COMPTROLLER, + oracle: AURIGAMI_ORACLE, + lens: AURIGAMI_LENS, +} + +export class AurigamiPairResolver implements ProtocolPairsResolver { + public supportChains: ChainId[] = [ChainId.Aurora] + public async resolve( + chainId: ChainId, + web3: Web3, + connection: Web3Helper.Web3ConnectionScope, + ): Promise { + if (!this.supportChains.includes(ChainId.Aurora)) { + return [] + } + const allPairs = await CompoundLikeFetcher.fetch(AURIGAMI_COMPTROLLER, chainId, web3, connection) + return allPairs + .filter((pair: PairToken) => pair[0]?.symbol && !excludePairs.includes(pair[0].symbol)) + .map((pair: PairToken) => { + const [bareToken, stakeToken] = pair + if (stakeToken.symbol === AurigamiProtocol.nativeToken) { + pair[0] = createNativeToken(ChainId.Aurora) + } + return new AurigamiProtocol(pair, allPairs, pairConfig) + }) + } +} + +export const aurigamiLazyResolver = new AurigamiPairResolver() diff --git a/packages/mask/src/plugins/Savings/protocols/aurigami/price.ts b/packages/mask/src/plugins/Savings/protocols/aurigami/price.ts new file mode 100644 index 000000000000..1691339c0038 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/aurigami/price.ts @@ -0,0 +1,92 @@ +import type Web3 from 'web3' +import { createERC20Tokens, getTraderConstants, ChainId } from '@masknet/web3-shared-evm' +import { getUniswapV2PairPrice } from '../common/tokens' +import type { TokenDetail } from '../../types' +import { ZERO } from '@masknet/web3-shared-base' +import type BigNumber from 'bignumber.js' +import { getPairAddress } from '../../../Trader/helpers/pair' +import { Token } from '@uniswap/sdk-core' + +export const PLY = createERC20Tokens('PLY_ADDRESS', 'PLY', 'PLY', 18)[ChainId.Aurora] +export const NEAR = createERC20Tokens('NEAR_ADDRESS', 'Near', 'NEAR', 24)[ChainId.Aurora] +export const USDT = createERC20Tokens('USDT_ADDRESS', 'Tether USD', 'USDT', 6)[ChainId.Aurora] +export const AURORA = createERC20Tokens('AURORA_ADDRESS', 'AURORA', 'AURORA', 18)[ChainId.Aurora] +export const TRI = createERC20Tokens('TRI_ADDRESS', 'TRI', 'TRI', 18)[ChainId.Aurora] + +const PAIR_PLY = { + token0: PLY, + token1: NEAR, + price: PLY, +} + +const PAIR_NEAR = { + token0: NEAR, + token1: USDT, + price: NEAR, +} + +const PAIR_AURORA = { + token0: AURORA, + token1: NEAR, + price: AURORA, +} + +const PAIR_TRI = { + token0: NEAR, + token1: TRI, + price: TRI, +} + +// get price from dex +export const MARKETS_NOT_IN_PRICE_ORACLE = ['auPLY', 'auNEAR', 'auTRI', 'auAURORA', 'auSTNEAR'] + +export async function getPriceFromTrisolaris( + token0: TokenDetail, + token1: TokenDetail, + priceToken: TokenDetail, + web3: Web3, +) { + const DEX_TRADE = getTraderConstants(ChainId.Aurora) + if (!DEX_TRADE.TRISOLARIS_FACTORY_ADDRESS || !DEX_TRADE.TRISOLARIS_INIT_CODE_HASH) return ZERO + const tokenA = new Token(ChainId.Aurora, token0.address, token0.decimals, token0.symbol, token0.name) + const tokenB = new Token(ChainId.Aurora, token1.address, token1.decimals, token1.symbol, token1.name) + const priceOfToken = new Token( + ChainId.Aurora, + priceToken.address, + priceToken.decimals, + priceToken.symbol, + priceToken.name, + ) + const pairAddress = getPairAddress( + DEX_TRADE.TRISOLARIS_FACTORY_ADDRESS, + DEX_TRADE.TRISOLARIS_INIT_CODE_HASH, + tokenA, + tokenB, + ) + return getUniswapV2PairPrice(pairAddress, tokenA, tokenB, priceOfToken, web3) +} + +export async function getNoneInPriceOraclePrices(web3: Web3, symbol?: string) { + if (!symbol) return ZERO + const plyPriceInNear = await getPriceFromTrisolaris(PAIR_PLY.token0, PAIR_PLY.token1, PAIR_PLY.price, web3) + const auroraPriceInNear = await getPriceFromTrisolaris( + PAIR_AURORA.token0, + PAIR_AURORA.token1, + PAIR_AURORA.price, + web3, + ) + + const triPriceInNear = await getPriceFromTrisolaris(PAIR_TRI.token0, PAIR_TRI.token1, PAIR_TRI.price, web3) + const nearPriceInUsdt = await getPriceFromTrisolaris(PAIR_NEAR.token0, PAIR_NEAR.token1, PAIR_NEAR.price, web3) + if (plyPriceInNear && nearPriceInUsdt && auroraPriceInNear && triPriceInNear) { + const priceList: { [key: string]: BigNumber } = { + auPLY: nearPriceInUsdt.multipliedBy(plyPriceInNear), + auNEAR: nearPriceInUsdt, + auSTNEAR: nearPriceInUsdt, + auTRI: nearPriceInUsdt.multipliedBy(triPriceInNear), + auAURORA: nearPriceInUsdt.multipliedBy(auroraPriceInNear), + } + return priceList[symbol] || ZERO + } + return ZERO +} diff --git a/packages/mask/src/plugins/Savings/protocols/benqi/BenQiProtocol.ts b/packages/mask/src/plugins/Savings/protocols/benqi/BenQiProtocol.ts new file mode 100644 index 000000000000..5ba25b158541 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/benqi/BenQiProtocol.ts @@ -0,0 +1,18 @@ +import { ProtocolType, PairToken } from '../../types' +import { default as BenQiRewardProtocol, RewardToken, PairConfig } from '../common/protocol/BenQiRewardProtocol' +import { BENQI_COMPTROLLER, BENQI_ChainlinkOracle } from '../../constants' + +export default class BenQiProtocol extends BenQiRewardProtocol { + static nativeToken = 'qiAVAX' + + constructor(pair: PairToken, allPairs: PairToken[], rewardTokens: RewardToken[]) { + super(pair, BenQiProtocol.nativeToken, allPairs, rewardTokens, { + comptroller: BENQI_COMPTROLLER, + oracle: BENQI_ChainlinkOracle, + }) + } + + override get type() { + return ProtocolType.BENQI + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/benqi/pairs.ts b/packages/mask/src/plugins/Savings/protocols/benqi/pairs.ts new file mode 100644 index 000000000000..db4129b05b15 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/benqi/pairs.ts @@ -0,0 +1,49 @@ +import type Web3 from 'web3' +import { ChainId, createNativeToken } from '@masknet/web3-shared-evm' +import type { SavingsProtocol, ProtocolPairsResolver, PairToken } from '../../types' +import { BENQI_COMPTROLLER } from '../../constants' +import CompoundLikeFetcher from '../common/CompoundLikeFetcher' +import BenQiProtocol from './BenQiProtocol' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +export type RewardToken = { + symbol: string + rewardType: number +} + +const qiQiReward = 0 +const qiAVAXReward = 1 + +const rewardTokens: RewardToken[] = [ + { + symbol: 'qiQI', + rewardType: qiQiReward, + }, + { + symbol: 'qiAVAX', + rewardType: qiAVAXReward, + }, +] + +export class BenQiPairResolver implements ProtocolPairsResolver { + public supportChains: ChainId[] = [ChainId.Avalanche] + public async resolve( + chainId: ChainId, + web3: Web3, + connection: Web3Helper.Web3ConnectionScope, + ): Promise { + if (!this.supportChains.includes(ChainId.Avalanche)) { + return [] + } + const allPairs = await CompoundLikeFetcher.fetch(BENQI_COMPTROLLER, chainId, web3, connection) + return allPairs.map((pair: PairToken) => { + const [bareToken, stakeToken] = pair + if (stakeToken.symbol === BenQiProtocol.nativeToken) { + pair[0] = createNativeToken(ChainId.Avalanche) + } + return new BenQiProtocol(pair, allPairs, rewardTokens) + }) + } +} + +export const benqiLazyResolver = new BenQiPairResolver() diff --git a/packages/mask/src/plugins/Savings/protocols/common/AAVELikeFetcher.ts b/packages/mask/src/plugins/Savings/protocols/common/AAVELikeFetcher.ts new file mode 100644 index 000000000000..23e9b09fb265 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/common/AAVELikeFetcher.ts @@ -0,0 +1,70 @@ +import type Web3 from 'web3' +import type { AbiItem } from 'web3-utils' +import { createContract, ChainId } from '@masknet/web3-shared-evm' +import type { AaveProtocolDataProvider } from '@masknet/web3-contracts/types/AaveProtocolDataProvider' +import AaveProtocolDataProviderABI from '@masknet/web3-contracts/abis/AaveProtocolDataProvider.json' +import { flatten, compact, chunk } from 'lodash-unified' +import type { AaveLendingPoolAddressProvider } from '@masknet/web3-contracts/types/AaveLendingPoolAddressProvider' +import AaveLendingPoolAddressProviderABI from '@masknet/web3-contracts/abis/AaveLendingPoolAddressProvider.json' +import { getFungibleTokensDetailed } from './tokens' +import type { PairToken } from '../../types' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +export default class AAVELikeFetcher { + static getAaveLendingPoolAddressProviderContract(aaveLPoolAddress: string, chainId: ChainId, web3: Web3) { + const lPoolAddressProviderContract = createContract( + web3, + aaveLPoolAddress, + AaveLendingPoolAddressProviderABI as AbiItem[], + ) + return lPoolAddressProviderContract + } + + static getProtocolDataContract(dataAddress: string, chainId: ChainId, web3: Web3) { + return createContract(web3, dataAddress, AaveProtocolDataProviderABI as AbiItem[]) + } + + static async lookupPoolAddress(aaveLPoolAddress: string, chainId: ChainId, web3: Web3) { + const lPoolAddressProviderContract = this.getAaveLendingPoolAddressProviderContract( + aaveLPoolAddress, + chainId, + web3, + ) + if (lPoolAddressProviderContract === null) return null + return lPoolAddressProviderContract.methods.getLendingPool().call() + } + + static async lookupTokens(dataProviderAddress: string, chainId: ChainId, web3: Web3) { + const protocolDataContract = this.getProtocolDataContract(dataProviderAddress, chainId, web3) + if (protocolDataContract === null) return [] + const tokens = await protocolDataContract?.methods.getAllReservesTokens().call() + const aaveTokens = await Promise.all( + tokens?.map(async (token) => { + const tokenAddress = await protocolDataContract.methods.getReserveTokensAddresses(token[1]).call() + return [token[1], tokenAddress?.aTokenAddress] + }), + ) + const allTokens = compact(flatten(aaveTokens ?? [])) ?? [] + return allTokens + } + + static async fetch( + dataProviderAddress: string, + poolProviderAddress: string, + chainId: ChainId, + web3: Web3, + connection: Web3Helper.Web3ConnectionScope, + ) { + const [allTokens, poolAddress] = await Promise.all([ + this.lookupTokens(dataProviderAddress, chainId, web3), + this.lookupPoolAddress(poolProviderAddress, chainId, web3), + ]) + + if (poolAddress === null) return [] + const detailedAaveTokens = await getFungibleTokensDetailed(allTokens, connection, chainId) + const allPairs = chunk(detailedAaveTokens, 2) + return allPairs.map((pair) => { + return [pair as PairToken, poolAddress, dataProviderAddress] + }) + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/common/CompoundLikeFetcher.ts b/packages/mask/src/plugins/Savings/protocols/common/CompoundLikeFetcher.ts new file mode 100644 index 000000000000..ab6893e206ca --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/common/CompoundLikeFetcher.ts @@ -0,0 +1,47 @@ +import type Web3 from 'web3' +import type { AbiItem } from 'web3-utils' +import { createContract, ChainId, SchemaType, ZERO_ADDRESS } from '@masknet/web3-shared-evm' +import type { Comptroller } from '@masknet/web3-contracts/types/Comptroller' +import ComptrollerABI from '@masknet/web3-contracts/abis/Comptroller.json' +import { getFungibleTokensDetailed } from './tokens' +import type { CERC20 } from '@masknet/web3-contracts/types/CERC20' +import CERC20ABI from '@masknet/web3-contracts/abis/CERC20.json' +import { flatten, compact, chunk } from 'lodash-unified' +import type { Web3Helper } from '@masknet/plugin-infra/web3' +import type { FungibleToken } from '@masknet/web3-shared-base' + +export default class CompoundLikeFetcher { + static getComptrollerContract(address: string, web3: Web3) { + return createContract(web3, address, ComptrollerABI as AbiItem[]) + } + + static async lookupMeta(marketAddress: string, web3: Web3) { + const contract = createContract(web3, marketAddress, CERC20ABI as AbiItem[]) + try { + const underlying = await contract?.methods.underlying().call() + return [underlying, marketAddress] + } catch (error) { + // native token will throw error + console.error('CompoundLikeFetcher.lookupMeta failed', error) + } + return [ZERO_ADDRESS, marketAddress] + } + + static async lookupTokens(compAddress: string, web3: Web3) { + const comptroller = CompoundLikeFetcher.getComptrollerContract(compAddress, web3) + if (comptroller === null) { + return [] + } + const allMarkets = await comptroller.methods.getAllMarkets().call() + const allMarketsPairs = await Promise.all(allMarkets.map((market: string) => this.lookupMeta(market, web3))) + const allTokens = compact(flatten(allMarketsPairs ?? [])) ?? [] + return allTokens + } + + static async fetch(compAddress: string, chainId: ChainId, web3: Web3, connection: Web3Helper.Web3ConnectionScope) { + const allTokens = await this.lookupTokens(compAddress, web3) + const detailedTokens = await getFungibleTokensDetailed(allTokens, connection, chainId) + const allPairs = chunk(detailedTokens, 2) + return allPairs.map((pair) => pair as [FungibleToken, FungibleToken]) + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/common/protocol/AAVELikeProtocol.ts b/packages/mask/src/plugins/Savings/protocols/common/protocol/AAVELikeProtocol.ts new file mode 100644 index 000000000000..63a768e9f710 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/common/protocol/AAVELikeProtocol.ts @@ -0,0 +1,146 @@ +import type Web3 from 'web3' +import type { AbiItem } from 'web3-utils' +import BigNumber from 'bignumber.js' +import { pow10, ZERO } from '@masknet/web3-shared-base' +import { ChainId, createContract, TransactionEventType } from '@masknet/web3-shared-evm' +import type { AaveLendingPool } from '@masknet/web3-contracts/types/AaveLendingPool' +import AaveLendingPoolABI from '@masknet/web3-contracts/abis/AaveLendingPool.json' +import { ProtocolType, SavingsProtocol, PairToken } from '../../../types' +import AAVELikeFetcher from '../AAVELikeFetcher' + +export default class AAVELikeProtocol implements SavingsProtocol { + static DEFAULT_APR = '0.00' + + private _apr = '0.00' + private _balance = ZERO + private poolAddress + private dataProviderAddr + + constructor(readonly pair: PairToken, poolAddress: string, dataProviderAddr: string) { + this.poolAddress = poolAddress + this.dataProviderAddr = dataProviderAddr + } + + get type() { + return ProtocolType.AAVE + } + + get apr() { + return this._apr + } + + get balance() { + return this._balance + } + + get bareToken() { + return this.pair[0] + } + + get stakeToken() { + return this.pair[1] + } + + get approveAddress() { + return this.poolAddress + } + + public async updateApr(chainId: ChainId, web3: Web3) { + try { + const contract = AAVELikeFetcher.getProtocolDataContract(this.dataProviderAddr, chainId, web3) + if (contract === null) { + return + } + const reserveData = await contract?.methods.getReserveData(this.bareToken.address).call() + const liquidityRate = reserveData.liquidityRate + const RAY = pow10(27) // 10 to the power 27 + // // APY and APR are returned here as decimals, multiply by 100 to get the percents + this._apr = new BigNumber(liquidityRate).times(100).div(RAY).toFixed(2) + } catch (error) { + console.error('AAVELikeProtocol: Apr Error:', error) + this._apr = AAVELikeProtocol.DEFAULT_APR + } + } + + public async updateBalance(chainId: ChainId, web3: Web3, account: string) { + try { + const contract = AAVELikeFetcher.getProtocolDataContract(this.dataProviderAddr, chainId, web3) + if (contract === null) { + return + } + const userReserveData = await contract?.methods.getUserReserveData(this.bareToken.address, account).call() + this._balance = new BigNumber(userReserveData.currentATokenBalance) + } catch (error) { + console.error('AAVELikeProtocol BALANCE ERROR: ', error) + this._balance = ZERO + } + } + + public async depositEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + try { + const operation = await this.createDepositTokenOperation(account, chainId, web3, value) + const gasEstimate = await operation?.estimateGas({ + from: account, + }) + + return new BigNumber(gasEstimate || 0) + } catch (error) { + console.error('AAVELikeProtocol deposit estimate ERROR: ', error) + return ZERO + } + } + + private async createDepositTokenOperation(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + const contract = createContract(web3, this.poolAddress, AaveLendingPoolABI as AbiItem[]) + return contract?.methods.deposit(this.bareToken.address, new BigNumber(value).toFixed(), account, '0') + } + + public async deposit(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + const gasEstimate = await this.depositEstimate(account, chainId, web3, value) + const operation = await this.createDepositTokenOperation(account, chainId, web3, value) + if (!operation) { + throw new Error("Can't create deposit operation") + } + return new Promise((resolve, reject) => { + operation + .send({ + from: account, + gas: gasEstimate.toNumber(), + }) + .once(TransactionEventType.ERROR, reject) + .once(TransactionEventType.CONFIRMATION, (_, receipt) => { + resolve(receipt.transactionHash) + }) + }) + } + + public async withdrawEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + try { + const contract = createContract(web3, this.poolAddress, AaveLendingPoolABI as AbiItem[]) + const gasEstimate = await contract?.methods + .withdraw(this.bareToken.address, new BigNumber(value).toFixed(), account) + .estimateGas({ + from: account, + }) + return new BigNumber(gasEstimate || 0) + } catch (error) { + return ZERO + } + } + + public async withdraw(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + const gasEstimate = await this.withdrawEstimate(account, chainId, web3, value) + const contract = createContract(web3, this.poolAddress, AaveLendingPoolABI as AbiItem[]) + return new Promise((resolve) => + contract?.methods + .withdraw(this.bareToken.address, new BigNumber(value).toFixed(), account) + .send({ + from: account, + gas: gasEstimate.toNumber(), + }) + .once(TransactionEventType.CONFIRMATION, (_, receipt) => { + resolve(receipt.transactionHash) + }), + ) + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/common/protocol/BenQiRewardProtocol.ts b/packages/mask/src/plugins/Savings/protocols/common/protocol/BenQiRewardProtocol.ts new file mode 100644 index 000000000000..0a68fca01026 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/common/protocol/BenQiRewardProtocol.ts @@ -0,0 +1,233 @@ +import type Web3 from 'web3' +import type { AbiItem } from 'web3-utils' +import BigNumber from 'bignumber.js' +import type { PairToken, TokenDetail } from '../../../types' +import CompoundTimestampBasedProtocol from './CompoundTimestampBasedProtocol' +import type { ChainId } from '@masknet/web3-shared-evm' +import { createContract } from '@masknet/web3-shared-evm' +import { isZero, ZERO } from '@masknet/web3-shared-base' +import type { BenQiComptroller } from '@masknet/web3-contracts/types/BenQiComptroller' +import BenQiComptrollerABI from '@masknet/web3-contracts/abis/BenQiComptroller.json' +import type { BenqiChainlinkOracle } from '@masknet/web3-contracts/types/BenqiChainlinkOracle' +import BenqiChainlinkOracleABI from '@masknet/web3-contracts/abis/BenqiChainlinkOracle.json' + +export const emptyRewardType = -1 +export type RewardToken = { + symbol: string + rewardType: number +} + +export type RewardSpeed = { + symbol: string + speed: BigNumber +} + +export type PairConfig = { + oracle: string + comptroller: string + lens?: string +} +export type MarketStatus = { + symbol: string + price: BigNumber +} + +export type IndexWithStatus = { + [key: string]: MarketStatus +} + +export function getBenQiComptrollerContract(address: string, web3: Web3) { + return createContract(web3, address, BenQiComptrollerABI as AbiItem[]) +} + +export function getBenQiOracleComptrollerContract(address: string, web3: Web3) { + return createContract(web3, address, BenqiChainlinkOracleABI as AbiItem[]) +} + +export default class BenQiRewardProtocol extends CompoundTimestampBasedProtocol { + constructor( + pair: PairToken, + nativeToken: string, + readonly allPairs: PairToken[], + readonly rewardTokens: RewardToken[], + readonly config: PairConfig, + ) { + super(pair, nativeToken) + } + + // load price + public async fetchPrices( + matchPairs: Array<{ + underlying: TokenDetail + market: TokenDetail + }>, + notInPairTokens: RewardToken[], + web3: Web3, + ) { + const oracle = getBenQiOracleComptrollerContract(this.config.oracle, web3) + if (oracle === null) return [] + return Promise.all( + matchPairs + .filter((_) => _.market.symbol !== undefined) + .map(async (item) => { + const { underlying, market } = item + const price = await oracle.methods.getUnderlyingPrice(market.address).call() + // https://github.com/Benqi-fi/BENQI-Smart-Contracts/blob/master/Chainlink/BenqiChainlinkOracle.sol#L43 + // https://github.com/tranquil-finance/core-contracts/blob/master/contracts/Chainlink/TranquilChainlinkOracle.sol#L53 + const defaultDecimals = 18 + const decimalDelta = defaultDecimals - underlying.decimals + const divideDecimals = decimalDelta > 0 ? defaultDecimals + decimalDelta : defaultDecimals + return { + symbol: market.symbol, + price: new BigNumber(price).shiftedBy(-divideDecimals), + } as MarketStatus + }), + ) + } + + // load reward token speed + public async fetchSpeeds(web3: Web3) { + const comptroller = getBenQiComptrollerContract(this.config.comptroller, web3) + if (comptroller === null) return [] + return Promise.all( + this.rewardTokens.map(async ({ rewardType, symbol }) => { + // https://snowtrace.io/tx/0x68a0a82884299df30c33a4ac36d32d247db7e3fa379cd41a1a1bc2f07f4cb173 + // `rewardSpeeds` renamed `supplyRewardSpeeds` since May-02-2022 09:47:38 AM + const speed = await comptroller.methods.supplyRewardSpeeds(rewardType, this.stakeToken.address).call() + return { + speed: new BigNumber(speed), + symbol, + } as RewardSpeed + }), + ) + } + + // include rewardToken and stakeToken + public async getAllNeedFetchPricePairs() { + const allTokens = [ + { + symbol: this.stakeToken.symbol, + rewardType: emptyRewardType, + }, + ].concat(this.rewardTokens) + const matchPairs = this.allPairs + .filter((pair: PairToken) => pair[1]?.symbol && allTokens.find((item) => item.symbol === pair[1].symbol)) + .map((pair: PairToken) => { + return { + underlying: pair[0], + market: pair[1], + } + }) + + const notMatchTokens = this.rewardTokens.filter( + (rewardToken: RewardToken) => !this.allPairs.find((item) => rewardToken.symbol === item[1].symbol), + ) + + return { + matchPairs, + notMatchTokens, + } + } + + public async loadMarketPriceAndSpeed(comptroller: BenQiComptroller, web3: Web3) { + const { matchPairs: needLoadPricePairs, notMatchTokens: notInPairTokens } = + await this.getAllNeedFetchPricePairs() + let allPrice: MarketStatus[] = [] + try { + allPrice = await this.fetchPrices(needLoadPricePairs, notInPairTokens, web3) + } catch (error) { + console.error('BenQiRewardProtocol.fetchPrices', error) + } + let currentMarketSpeeds: RewardSpeed[] = [] + try { + currentMarketSpeeds = await this.fetchSpeeds(web3) + } catch (error) { + console.error('BenQiRewardProtocol.fetchSpeeds', error) + } + const indexBySymbol: IndexWithStatus = {} + allPrice.forEach((item: MarketStatus) => { + indexBySymbol[item.symbol] = item + }) + return { + allPrices: indexBySymbol, + currentMarketSpeeds, + } + } + + // curRewardsPerDay = curRewardSpeed * 60 * 60 * 24 + // curBaseSupply = curRewardPrice * curRewardsPerDay / assetTotalSupply * assetPrice + // curRewardSupplyAPR = curBaseSupply * 365 + public override async getDistributionAPR(chainId: ChainId, web3: Web3): Promise { + const comptroller = getBenQiComptrollerContract(this.config.comptroller, web3) + const market = this.getPoolContract(web3) + if (market === null) return ZERO + if (comptroller === null) return ZERO + + try { + const { allPrices: symbolWithPrice, currentMarketSpeeds } = await this.loadMarketPriceAndSpeed( + comptroller, + web3, + ) + + // market supply + const [totalSupply, exchangeRate] = await Promise.all([ + market.methods.totalSupply().call(), + market.methods.exchangeRateStored().call(), + ]) + + const bareTokenDecimals = 18 + this.bareToken.decimals + const totalSupplyAmount = new BigNumber(totalSupply) + .times(new BigNumber(exchangeRate)) + .shiftedBy(-bareTokenDecimals) + + const marketPrice = this.stakeToken.symbol && symbolWithPrice[this.stakeToken.symbol].price + // can not fetch the price + if (!marketPrice) return ZERO + if (marketPrice && isZero(marketPrice)) { + return ZERO + } + + const totalPrice = marketPrice ? totalSupplyAmount.times(marketPrice) : ZERO + const rewardsAPR = this.rewardTokens.map(({ symbol }) => { + // price not found + if (!symbolWithPrice[symbol]) { + return { + apr: ZERO, + } + } + const { price: rewardPrice } = symbolWithPrice[symbol] + const speedItem = currentMarketSpeeds.find((_) => _.symbol === symbol) + if (!speedItem) + return { + apr: ZERO, + } + + const { speed: rewardSpeed } = speedItem + const rewardPerDay = rewardSpeed.shiftedBy(-18).times(60 * 60 * 24) + const rewardValue = rewardPerDay.times(rewardPrice) + const supplyBase = rewardValue.div(totalPrice) + const supply = supplyBase.times(365).times(100) + return { + symbol, + marketPrice: marketPrice ? marketPrice.toString(10) : 0, + rewardPrice: rewardPrice.toString(10), + rewardPerDay: rewardPerDay.toString(10), + rewardValue: rewardValue.toString(10), + supplyBase: supplyBase.toString(10), + rewardSpeed: rewardSpeed.toString(10), + totalPrice: totalPrice.toString(10), + aprDisplay: supply.toString(10), + apr: supply, + } + }) + let totalDistributionAPR = ZERO + rewardsAPR.forEach((item) => { + totalDistributionAPR = totalDistributionAPR.plus(item.apr) + }) + return totalDistributionAPR + } catch (error) { + console.error('getDistributionAPR', error) + return ZERO + } + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/common/protocol/CompoundBlockBasedProtocol.ts b/packages/mask/src/plugins/Savings/protocols/common/protocol/CompoundBlockBasedProtocol.ts new file mode 100644 index 000000000000..3a4bff36e4da --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/common/protocol/CompoundBlockBasedProtocol.ts @@ -0,0 +1,170 @@ +import type Web3 from 'web3' +import type { AbiItem } from 'web3-utils' +import BigNumber from 'bignumber.js' +import { ZERO } from '@masknet/web3-shared-base' +import { ChainId, createContract, TransactionEventType } from '@masknet/web3-shared-evm' +import { ProtocolType, SavingsProtocol, PairToken } from '../../../types' +import type { CERC20 } from '@masknet/web3-contracts/types/CERC20' +import type { CEther } from '@masknet/web3-contracts/types/CEther' +import CERC20ABI from '@masknet/web3-contracts/abis/CERC20.json' +import CEtherABI from '@masknet/web3-contracts/abis/CEther.json' + +export const BLOCKS_PER_DAY = 6570 +export const DAYS_PER_YEAR = 365 + +export default class CompoundBlockBasedProtocol implements SavingsProtocol { + private DEFAULT_APR = '0.00' + + private _apr = '0.00' + private _balance = ZERO + + constructor(readonly pair: PairToken, readonly nativeToken: string) {} + + get type() { + return ProtocolType.Compound + } + + get apr() { + return this._apr + } + + get balance() { + return this._balance + } + + get bareToken() { + return this.pair[0] + } + + get stakeToken() { + return this.pair[1] + } + + get isNativeToken() { + return this.stakeToken.symbol === this.nativeToken + } + + get approveAddress() { + return this.stakeToken.address + } + + public getPoolContract(web3: Web3) { + const contract = this.isNativeToken + ? createContract(web3, this.stakeToken.address, CEtherABI as AbiItem[]) + : createContract(web3, this.stakeToken.address, CERC20ABI as AbiItem[]) + return contract + } + + public async updateApr(chainId: ChainId, web3: Web3) { + try { + const contract = this.getPoolContract(web3) + if (contract === null) { + this._apr = this.DEFAULT_APR + return + } + const supplyRate = await contract.methods.supplyRatePerBlock().call() + const supplyBase = new BigNumber(supplyRate).times(BLOCKS_PER_DAY) + const apy = supplyBase.times(DAYS_PER_YEAR).shiftedBy(-16) + this._apr = apy.toFixed(2) + } catch (error) { + this._apr = this.DEFAULT_APR + } + } + + public async updateBalance(chainId: ChainId, web3: Web3, account: string) { + try { + const contract = this.getPoolContract(web3) + if (contract === null) { + this._balance = ZERO + return + } + const balance = await contract.methods.balanceOfUnderlying(account).call() + this._balance = new BigNumber(balance) + } catch (error) { + this._balance = ZERO + } + } + + public async depositEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + try { + const operation = await this.createDepositTokenOperation(web3, value) + const args = this.isNativeToken + ? { + value: value.toString(), + from: account, + } + : { + from: account, + } + const gasEstimate = await operation?.estimateGas(args) + return new BigNumber(gasEstimate || 0) + } catch (error) { + return ZERO + } + } + + private async createDepositTokenOperation(web3: Web3, value: BigNumber.Value) { + const contract = this.getPoolContract(web3) + if (this.isNativeToken) { + return (contract as CEther)?.methods.mint() + } else { + return contract?.methods.mint(value.toString()) + } + } + + public async deposit(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + const gasEstimate = await this.depositEstimate(account, chainId, web3, value) + const operation = await this.createDepositTokenOperation(web3, value) + const args = this.isNativeToken + ? { + from: account, + value: value.toString(), + gas: gasEstimate.toNumber(), + } + : { + from: account, + gas: gasEstimate.toNumber(), + } + + if (!operation) { + throw new Error("Can't create deposit operation") + } + return new Promise((resolve, reject) => { + operation + .send(args) + .once(TransactionEventType.ERROR, reject) + .once(TransactionEventType.CONFIRMATION, (_, receipt) => { + resolve(receipt.transactionHash) + }) + }) + } + + public async withdrawEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + try { + const contract = this.getPoolContract(web3) + const operation = contract?.methods.redeemUnderlying(value.toString()) + const gasEstimate = await operation?.estimateGas({ + from: account, + }) + return new BigNumber(gasEstimate || 0) + } catch (error) { + return ZERO + } + } + + public async withdraw(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + const gasEstimate = await this.withdrawEstimate(account, chainId, web3, value) + const contract = this.getPoolContract(web3) + return new Promise((resolve) => + contract?.methods + .redeemUnderlying(value.toString()) + .send({ + from: account, + gas: gasEstimate.toNumber(), + }) + .once(TransactionEventType.CONFIRMATION, (_, receipt) => { + resolve(receipt.transactionHash) + }), + ) + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/common/protocol/CompoundTimestampBasedProtocol.ts b/packages/mask/src/plugins/Savings/protocols/common/protocol/CompoundTimestampBasedProtocol.ts new file mode 100644 index 000000000000..e36125cb4065 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/common/protocol/CompoundTimestampBasedProtocol.ts @@ -0,0 +1,176 @@ +import type Web3 from 'web3' +import type { AbiItem } from 'web3-utils' +import BigNumber from 'bignumber.js' +import { ZERO } from '@masknet/web3-shared-base' +import { ChainId, createContract, TransactionEventType } from '@masknet/web3-shared-evm' +import { ProtocolType, SavingsProtocol, PairToken } from '../../../types' +import type { QiERC20 } from '@masknet/web3-contracts/types/QiERC20' +import type { QiAvax } from '@masknet/web3-contracts/types/QiAvax' +import QiERC20ABI from '@masknet/web3-contracts/abis/QiERC20.json' +import QiAvaxABI from '@masknet/web3-contracts/abis/QiAvax.json' + +export const TIMESTAMPS_PER_DAY = 60 * 60 * 24 +export const DAYS_PER_YEAR = 365 + +export default class CompoundTimestampBasedProtocol implements SavingsProtocol { + private DEFAULT_APR = '0.00' + + private _apr = '0.00' + private _balance = ZERO + + constructor(readonly pair: PairToken, readonly nativeToken: string) {} + + get type() { + return ProtocolType.BENQI + } + + get apr() { + return this._apr + } + + get balance() { + return this._balance + } + + get bareToken() { + return this.pair[0] + } + + get stakeToken() { + return this.pair[1] + } + + get approveAddress() { + return this.stakeToken.address + } + + get isNativeToken() { + return this.stakeToken.symbol === this.nativeToken + } + + public getPoolContract(web3: Web3) { + const contract = this.isNativeToken + ? createContract(web3, this.stakeToken.address, QiAvaxABI as AbiItem[]) + : createContract(web3, this.stakeToken.address, QiERC20ABI as AbiItem[]) + return contract + } + + public async getDistributionAPR(chainId: ChainId, web3: Web3): Promise { + return ZERO + } + + public async updateApr(chainId: ChainId, web3: Web3) { + try { + const contract = this.getPoolContract(web3) + if (contract === null) { + this._apr = this.DEFAULT_APR + return + } + const [supplyRate, distributionAPR] = await Promise.all([ + contract.methods.supplyRatePerTimestamp().call(), + this.getDistributionAPR(chainId, web3), + ]) + const supplyBase = new BigNumber(supplyRate).times(TIMESTAMPS_PER_DAY) + const apy = supplyBase.times(DAYS_PER_YEAR).shiftedBy(-16) + this._apr = apy.plus(distributionAPR).toFixed(2) + } catch (error) { + this._apr = this.DEFAULT_APR + } + } + + public async updateBalance(chainId: ChainId, web3: Web3, account: string) { + try { + const contract = this.getPoolContract(web3) + if (contract === null) { + this._balance = ZERO + return + } + const balance = await contract.methods.balanceOfUnderlying(account).call() + this._balance = new BigNumber(balance) + } catch (error) { + this._balance = ZERO + } + } + + public async depositEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + try { + const operation = await this.createDepositTokenOperation(web3, value) + const args = this.isNativeToken + ? { + value: value.toString(), + from: account, + } + : { + from: account, + } + const gasEstimate = await operation?.estimateGas(args) + return new BigNumber(gasEstimate || 0) + } catch (error) { + return ZERO + } + } + + private async createDepositTokenOperation(web3: Web3, value: BigNumber.Value) { + const contract = this.getPoolContract(web3) + if (this.isNativeToken) { + return (contract as QiAvax)?.methods.mint() + } else { + return contract?.methods.mint(value.toString()) + } + } + + public async deposit(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + const gasEstimate = await this.depositEstimate(account, chainId, web3, value) + const operation = await this.createDepositTokenOperation(web3, value) + const args = this.isNativeToken + ? { + from: account, + value: value.toString(), + gas: gasEstimate.toNumber(), + } + : { + from: account, + gas: gasEstimate.toNumber(), + } + if (!operation) { + throw new Error("Can't create deposit operation") + } + return new Promise((resolve, reject) => { + operation + .send(args) + .once(TransactionEventType.ERROR, reject) + .once(TransactionEventType.CONFIRMATION, (_, receipt) => { + resolve(receipt.transactionHash) + }) + }) + } + + public async withdrawEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + try { + const contract = this.getPoolContract(web3) + const operation = contract?.methods.redeemUnderlying(value.toString()) + const gasEstimate = await operation?.estimateGas({ + from: account, + }) + return new BigNumber(gasEstimate || 0) + } catch (error) { + return ZERO + } + } + + public async withdraw(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value) { + const gasEstimate = await this.withdrawEstimate(account, chainId, web3, value) + const contract = this.getPoolContract(web3) + return new Promise((resolve) => + contract?.methods + .redeemUnderlying(value.toString()) + .send({ + from: account, + gas: gasEstimate.toNumber(), + }) + .once(TransactionEventType.CONFIRMATION, (_, receipt) => { + resolve(receipt.transactionHash) + }), + ) + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/common/tokens.ts b/packages/mask/src/plugins/Savings/protocols/common/tokens.ts new file mode 100644 index 000000000000..22e8191ccb84 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/common/tokens.ts @@ -0,0 +1,51 @@ +import { ChainId, createContract } from '@masknet/web3-shared-evm' +import type { NetworkPluginID } from '@masknet/web3-shared-base' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +import { Pair as UniswapPair } from '@uniswap/v2-sdk' +import { CurrencyAmount, Token } from '@uniswap/sdk-core' +import type Web3 from 'web3' +import type { AbiItem } from 'web3-utils' +import type { Pair } from '@masknet/web3-contracts/types/Pair' +import PairABI from '@masknet/web3-contracts/abis/Pair.json' +import BigNumber from 'bignumber.js' + +export async function getUniswapV2PairPrice( + pairAddress: string, + token0: Token, + token1: Token, + priceToken: Token, + web3: Web3, +) { + const pair = createContract(web3, pairAddress, PairABI as AbiItem[]) + const [reserves] = await Promise.all([pair?.methods.getReserves().call()]) + if (!reserves) return null + + const uniPair = new UniswapPair( + CurrencyAmount.fromRawAmount(token0, reserves._reserve0), + CurrencyAmount.fromRawAmount(token1, reserves._reserve1), + ) + const paddingDecimalsLimit = 18 + const pricePaddingDecimals = + token0.decimals < paddingDecimalsLimit || token1.decimals < paddingDecimalsLimit + ? paddingDecimalsLimit - token1.decimals + token0.decimals + : 0 + const curPrice = new BigNumber( + (priceToken.symbol === token0.symbol ? uniPair.token0Price : uniPair.token1Price).toSignificant(10), + ).shiftedBy(pricePaddingDecimals) + return curPrice +} + +export async function getFungibleTokensDetailed( + allTokens: string[], + connection: Web3Helper.Web3ConnectionScope, + chainId: ChainId, +): Promise>> { + return Promise.all( + allTokens.map(async (address, i) => { + return connection.getFungibleToken?.(address ?? '', { + chainId, + }) + }), + ) +} diff --git a/packages/mask/src/plugins/Savings/protocols/compound/CompoundProtocol.ts b/packages/mask/src/plugins/Savings/protocols/compound/CompoundProtocol.ts new file mode 100644 index 000000000000..44beafab5285 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/compound/CompoundProtocol.ts @@ -0,0 +1,14 @@ +import { ProtocolType, PairToken } from '../../types' +import CompoundBlockBasedProtocol from '../common/protocol/CompoundBlockBasedProtocol' + +export default class CompoundProtocol extends CompoundBlockBasedProtocol { + static nativeToken = 'cETH' + + constructor(pair: PairToken) { + super(pair, CompoundProtocol.nativeToken) + } + + override get type() { + return ProtocolType.Compound + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/compound/pairs.ts b/packages/mask/src/plugins/Savings/protocols/compound/pairs.ts new file mode 100644 index 000000000000..a27c21096bca --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/compound/pairs.ts @@ -0,0 +1,30 @@ +import type Web3 from 'web3' +import { ChainId, createNativeToken } from '@masknet/web3-shared-evm' +import type { SavingsProtocol, ProtocolPairsResolver, PairToken } from '../../types' +import { COMPOUND_COMPTROLLER } from '../../constants' +import CompoundLikeFetcher from '../common/CompoundLikeFetcher' +import CompoundProtocol from './CompoundProtocol' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +export class CompoundPairResolver implements ProtocolPairsResolver { + public supportChains: ChainId[] = [ChainId.Mainnet] + public async resolve( + chainId: ChainId, + web3: Web3, + connection: Web3Helper.Web3ConnectionScope, + ): Promise { + if (!this.supportChains.includes(ChainId.Mainnet)) { + return [] + } + const allPairs = await CompoundLikeFetcher.fetch(COMPOUND_COMPTROLLER, chainId, web3, connection) + return allPairs.map((pair: PairToken) => { + const [bareToken, stakeToken] = pair + if (stakeToken.symbol === CompoundProtocol.nativeToken) { + pair[0] = createNativeToken(ChainId.Mainnet) + } + return new CompoundProtocol(pair) + }) + } +} + +export const compoundLazyResolver = new CompoundPairResolver() diff --git a/packages/mask/src/plugins/Savings/protocols/giest/GiestProtocol.ts b/packages/mask/src/plugins/Savings/protocols/giest/GiestProtocol.ts new file mode 100644 index 000000000000..bc3faac925b4 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/giest/GiestProtocol.ts @@ -0,0 +1,8 @@ +import { ProtocolType } from '../../types' +import AAVELikeProtocol from '../common/protocol/AAVELikeProtocol' + +export class GiestProtocol extends AAVELikeProtocol { + override get type() { + return ProtocolType.Giest + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/giest/pairs.ts b/packages/mask/src/plugins/Savings/protocols/giest/pairs.ts new file mode 100644 index 000000000000..05c8a40f9b7c --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/giest/pairs.ts @@ -0,0 +1,43 @@ +import type Web3 from 'web3' +import { ChainId, getGiestConstants, ZERO_ADDRESS } from '@masknet/web3-shared-evm' +import type { SavingsProtocol, PairToken, ProtocolPairsResolver } from '../../types' +import AAVELikeFetcher from '../common/AAVELikeFetcher' +import { GiestProtocol } from './GiestProtocol' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +// Metadata +// addresses: +// https://docs.geist.finance/useful-info/deployments-addresses +// + +export const AaveProtocolDataProvider = getGiestConstants(ChainId.Fantom).PROTOCOL_DATA_PROVIDER || ZERO_ADDRESS +export const LendingPoolAddressProvider = + getGiestConstants(ChainId.Fantom).LENDING_POOL_ADDRESSES_PROVIDER || ZERO_ADDRESS + +export class GiestPairResolver implements ProtocolPairsResolver { + public supportChains: ChainId[] = [ChainId.Fantom] + + public async resolve( + chainId: ChainId, + web3: Web3, + connection: Web3Helper.Web3ConnectionScope, + ): Promise { + if (!this.supportChains.includes(chainId)) { + return [] + } + + const allPairsWithArgs = await AAVELikeFetcher.fetch( + AaveProtocolDataProvider, + LendingPoolAddressProvider, + chainId, + web3, + connection, + ) + return allPairsWithArgs.map((args) => { + const [pair, pool, dataProvider] = args + return new GiestProtocol(pair as PairToken, pool as string, dataProvider as string) + }) + } +} + +export const giestLazyResolver = new GiestPairResolver() diff --git a/packages/mask/src/plugins/Savings/protocols/index.ts b/packages/mask/src/plugins/Savings/protocols/index.ts index c4e741db42d2..fb8a4236c520 100644 --- a/packages/mask/src/plugins/Savings/protocols/index.ts +++ b/packages/mask/src/plugins/Savings/protocols/index.ts @@ -1,8 +1,25 @@ -import { AAVE_PAIRS, LDO_PAIRS } from '../constants' -import { LidoProtocol } from './LDOProtocol' -import { AAVEProtocol } from './AAVEProtocol' - -export const SavingsProtocols = [ - ...LDO_PAIRS.map((pair) => new LidoProtocol(pair)), - ...AAVE_PAIRS.map((pair) => new AAVEProtocol(pair)), -] +import { LDO_PAIRS } from './ldo/pairs' +import type { ProtocolPairsResolver } from '../types' + +import { aaveLazyResolver } from './aave/pairs' +import { compoundLazyResolver } from './compound/pairs' +import { benqiLazyResolver } from './benqi/pairs' + +import { alpacaLazyResolver } from './alpaca/pairs' +import { moolaLazyResolver } from './moola/pairs' +import { aurigamiLazyResolver } from './aurigami/pairs' +import { giestLazyResolver } from './giest/pairs' +import { tranquilLazyResolver } from './tranquil/pairs' + +export const SavingsProtocols = [...LDO_PAIRS] +export const LazyProtocolsResolvers: ProtocolPairsResolver[] = [] + +LazyProtocolsResolvers.push(aaveLazyResolver) + +LazyProtocolsResolvers.push(compoundLazyResolver) +LazyProtocolsResolvers.push(benqiLazyResolver) +LazyProtocolsResolvers.push(alpacaLazyResolver) +LazyProtocolsResolvers.push(moolaLazyResolver) +LazyProtocolsResolvers.push(aurigamiLazyResolver) +LazyProtocolsResolvers.push(giestLazyResolver) +LazyProtocolsResolvers.push(tranquilLazyResolver) diff --git a/packages/mask/src/plugins/Savings/protocols/LDOProtocol.ts b/packages/mask/src/plugins/Savings/protocols/ldo/LDOProtocol.ts similarity index 97% rename from packages/mask/src/plugins/Savings/protocols/LDOProtocol.ts rename to packages/mask/src/plugins/Savings/protocols/ldo/LDOProtocol.ts index c13f8025566b..2bb27b80ca51 100644 --- a/packages/mask/src/plugins/Savings/protocols/LDOProtocol.ts +++ b/packages/mask/src/plugins/Savings/protocols/ldo/LDOProtocol.ts @@ -12,13 +12,14 @@ import { import { FungibleToken, ZERO } from '@masknet/web3-shared-base' import type { Lido } from '@masknet/web3-contracts/types/Lido' import LidoABI from '@masknet/web3-contracts/abis/Lido.json' -import { ProtocolType, SavingsProtocol } from '../types' +import { ProtocolType, SavingsProtocol } from '../../types' export class LidoProtocol implements SavingsProtocol { private _apr = '0.00' private _balance = ZERO readonly type = ProtocolType.Lido + approveAddress: string | undefined constructor(readonly pair: [FungibleToken, FungibleToken]) {} diff --git a/packages/mask/src/plugins/Savings/protocols/ldo/pairs.ts b/packages/mask/src/plugins/Savings/protocols/ldo/pairs.ts new file mode 100644 index 000000000000..1ccb9593dcbb --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/ldo/pairs.ts @@ -0,0 +1,12 @@ +import { LidoProtocol } from './LDOProtocol' +import type { FungibleToken } from '@masknet/web3-shared-base' +import { ChainId, createERC20Tokens, createNativeToken, SchemaType } from '@masknet/web3-shared-evm' + +export const LDO_PAIRS_LIST: Array<[FungibleToken, FungibleToken]> = [ + [ + createNativeToken(ChainId.Mainnet), + createERC20Tokens('LDO_stETH_ADDRESS', 'Liquid staked Ether 2.0', 'stETH', 18)[ChainId.Mainnet], + ], +] + +export const LDO_PAIRS = LDO_PAIRS_LIST.map((pair) => new LidoProtocol(pair)) diff --git a/packages/mask/src/plugins/Savings/protocols/moola/MoolaProtocol.ts b/packages/mask/src/plugins/Savings/protocols/moola/MoolaProtocol.ts new file mode 100644 index 000000000000..eda3ef548151 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/moola/MoolaProtocol.ts @@ -0,0 +1,8 @@ +import { ProtocolType } from '../../types' +import AAVELikeProtocol from '../common/protocol/AAVELikeProtocol' + +export class MoolaProtocol extends AAVELikeProtocol { + override get type() { + return ProtocolType.Moola + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/moola/pairs.ts b/packages/mask/src/plugins/Savings/protocols/moola/pairs.ts new file mode 100644 index 000000000000..46174a1c8e8f --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/moola/pairs.ts @@ -0,0 +1,40 @@ +import type Web3 from 'web3' +import { ChainId, getMoolaConstants, ZERO_ADDRESS } from '@masknet/web3-shared-evm' +import type { SavingsProtocol, PairToken, ProtocolPairsResolver } from '../../types' +import AAVELikeFetcher from '../common/AAVELikeFetcher' +import { MoolaProtocol } from './MoolaProtocol' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +// Metadata +// address from: +// https://github.com/moolamarket/moola-v2/blob/main/cli.js#L290 +// +const AaveProtocolDataProvider = getMoolaConstants(ChainId.Celo).PROTOCOL_DATA_PROVIDER || ZERO_ADDRESS +const LendingPoolAddressProvider = getMoolaConstants(ChainId.Celo)?.LENDING_POOL_ADDRESSES_PROVIDER || ZERO_ADDRESS + +export class MoolaPairResolver implements ProtocolPairsResolver { + public supportChains: ChainId[] = [ChainId.Celo] + public async resolve( + chainId: ChainId, + web3: Web3, + connection: Web3Helper.Web3ConnectionScope, + ): Promise { + if (!this.supportChains.includes(chainId)) { + return [] + } + + const allPairsWithArgs = await AAVELikeFetcher.fetch( + AaveProtocolDataProvider, + LendingPoolAddressProvider, + chainId, + web3, + connection, + ) + return allPairsWithArgs.map((args) => { + const [pair, pool, dataProvider] = args + return new MoolaProtocol(pair as PairToken, pool as string, dataProvider as string) + }) + } +} + +export const moolaLazyResolver = new MoolaPairResolver() diff --git a/packages/mask/src/plugins/Savings/protocols/tranquil/TranquilProtocol.ts b/packages/mask/src/plugins/Savings/protocols/tranquil/TranquilProtocol.ts new file mode 100644 index 000000000000..1993b50ac990 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/tranquil/TranquilProtocol.ts @@ -0,0 +1,68 @@ +import type Web3 from 'web3' +import type { AbiItem } from 'web3-utils' +import { ChainId, getTranquilConstants, ZERO_ADDRESS, createContract } from '@masknet/web3-shared-evm' +import { ProtocolType, PairToken, TokenDetail } from '../../types' +import BigNumber from 'bignumber.js' +import { + default as BenQiRewardProtocol, + MarketStatus, + RewardToken, + PairConfig, +} from '../common/protocol/BenQiRewardProtocol' +import type { TranquilPriceOracleV2 } from '@masknet/web3-contracts/types/TranquilPriceOracleV2' +import TranquilPriceOracleV2ABI from '@masknet/web3-contracts/abis/TranquilPriceOracleV2.json' + +export const TRANQ_ADDRESS = getTranquilConstants(ChainId.Harmony).TRANQ || ZERO_ADDRESS + +export function getComptrollerContract(address: string, web3: Web3) { + return createContract(web3, address, TranquilPriceOracleV2ABI as AbiItem[]) +} + +export default class TranquilProtocol extends BenQiRewardProtocol { + static nativeToken = 'tqONE' + + constructor(pair: PairToken, allPairs: PairToken[], rewardTokens: RewardToken[], config: PairConfig) { + super(pair, TranquilProtocol.nativeToken, allPairs, rewardTokens, config) + } + + override get type() { + return ProtocolType.Tranquil + } + + public override async fetchPrices( + matchPairs: Array<{ + underlying: TokenDetail + market: TokenDetail + }>, + notInPairTokens: RewardToken[], + web3: Web3, + ) { + const oracle = getComptrollerContract(this.config.oracle, web3) + if (oracle === null) return [] + const allResults = await Promise.all( + matchPairs + .filter((_) => _.market.symbol !== undefined) + .map(async (item) => { + const { underlying, market } = item + const price = await oracle.methods.getUnderlyingPrice(market.address).call() + // https://github.com/tranquil-finance/core-contracts/blob/master/contracts/Chainlink/TranquilChainlinkOracle.sol#L53 + const defaultDecimals = 18 + const decimalDelta = defaultDecimals - underlying.decimals + const divideDecimals = decimalDelta > 0 ? defaultDecimals + decimalDelta : defaultDecimals + return { + symbol: market.symbol, + price: new BigNumber(price).shiftedBy(-divideDecimals), + } as MarketStatus + }), + ) + + // TRANQ not in tranquil pair list + const price = await oracle.methods.getPrice(TRANQ_ADDRESS).call() + allResults.push({ + symbol: 'TRANQ', + price: new BigNumber(price).shiftedBy(-18), + }) + + return allResults + } +} diff --git a/packages/mask/src/plugins/Savings/protocols/tranquil/pairs.ts b/packages/mask/src/plugins/Savings/protocols/tranquil/pairs.ts new file mode 100644 index 000000000000..ba519a749621 --- /dev/null +++ b/packages/mask/src/plugins/Savings/protocols/tranquil/pairs.ts @@ -0,0 +1,56 @@ +import type Web3 from 'web3' +import { ChainId, ZERO_ADDRESS, getTranquilConstants, createNativeToken } from '@masknet/web3-shared-evm' +import type { SavingsProtocol, ProtocolPairsResolver } from '../../types' +import CompoundLikeFetcher from '../common/CompoundLikeFetcher' +import TranquilProtocol from './TranquilProtocol' +import type { RewardToken, PairConfig } from '../common/protocol/BenQiRewardProtocol' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +export const TRANQUIL_COMPTROLLER = getTranquilConstants(ChainId.Harmony).COMPTROLLER || ZERO_ADDRESS +export const TRANQUIL_Oracle = getTranquilConstants(ChainId.Harmony).ORACLE || ZERO_ADDRESS + +const TRANQ_INDEX = 0 +const tqONE_INDEX = 1 + +export const rewardTokens: RewardToken[] = [ + { + symbol: 'TRANQ', + rewardType: TRANQ_INDEX, + }, + { + symbol: 'tqONE', + rewardType: tqONE_INDEX, + }, +] + +const pairConfig = { + comptroller: TRANQUIL_COMPTROLLER, + oracle: TRANQUIL_Oracle, +} + +const defaultChain = ChainId.Harmony + +export class TranquilPairResolver implements ProtocolPairsResolver { + public supportChains: ChainId[] = [defaultChain] + public rewardTokens: RewardToken[] = rewardTokens + + public async resolve( + chainId: ChainId, + web3: Web3, + connection: Web3Helper.Web3ConnectionScope, + ): Promise { + if (!this.supportChains.includes(defaultChain)) { + return [] + } + const allPairs = await CompoundLikeFetcher.fetch(TRANQUIL_COMPTROLLER, chainId, web3, connection) + return allPairs.map((pair) => { + const [bareToken, stakeToken] = pair + if (stakeToken.symbol === TranquilProtocol.nativeToken) { + pair[0] = createNativeToken(defaultChain) + } + return new TranquilProtocol(pair, allPairs, this.rewardTokens, pairConfig) + }) + } +} + +export const tranquilLazyResolver = new TranquilPairResolver() diff --git a/packages/mask/src/plugins/Savings/types.ts b/packages/mask/src/plugins/Savings/types.ts index 135b796a111d..104b7bc396f7 100644 --- a/packages/mask/src/plugins/Savings/types.ts +++ b/packages/mask/src/plugins/Savings/types.ts @@ -2,6 +2,10 @@ import type Web3 from 'web3' import type BigNumber from 'bignumber.js' import type { ChainId, SchemaType } from '@masknet/web3-shared-evm' import type { FungibleToken } from '@masknet/web3-shared-base' +import type { Web3Helper } from '@masknet/plugin-infra/web3' + +export type TokenDetail = FungibleToken +export type PairToken = [FungibleToken, FungibleToken] export enum TabType { Deposit = 'deposit', @@ -11,7 +15,15 @@ export enum TabType { export enum ProtocolType { Lido = 0, AAVE = 1, + BENQI = 2, + Compound = 3, + Giest = 4, + Moola = 5, + Alpaca = 6, + Aurigami = 7, + Tranquil = 8, } + export interface SavingsProtocol { readonly type: ProtocolType @@ -32,6 +44,7 @@ export interface SavingsProtocol { readonly bareToken: FungibleToken readonly stakeToken: FungibleToken + readonly approveAddress: string | undefined updateApr(chainId: ChainId, web3: Web3): Promise updateBalance(chainId: ChainId, web3: Web3, account: string): Promise @@ -41,3 +54,8 @@ export interface SavingsProtocol { withdrawEstimate(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value): Promise withdraw(account: string, chainId: ChainId, web3: Web3, value: BigNumber.Value): Promise } + +export interface ProtocolPairsResolver { + supportChains: ChainId[] + resolve(chainId: ChainId, web3: Web3, connection: Web3Helper.Web3ConnectionScope): Promise +} diff --git a/packages/plugins/EVM/src/state/Hub/TokenIconSpecialIconList.json b/packages/plugins/EVM/src/state/Hub/TokenIconSpecialIconList.json index 2909c44aacdf..c3250ea89997 100644 --- a/packages/plugins/EVM/src/state/Hub/TokenIconSpecialIconList.json +++ b/packages/plugins/EVM/src/state/Hub/TokenIconSpecialIconList.json @@ -193,5 +193,160 @@ "name": "AVAX", "address": "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7", "logo_url": "https://raw.githubusercontent.com/sushiswap/icons/master/network/avalanche.jpg'" + }, + { + "name": "STNEAR", + "address": "0x07f9f7f963c5cd2bbffd30ccfb964be114332e30", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0x07f9f7f963c5cd2bbffd30ccfb964be114332e30/625cb2649588721db770dc0f54379a43.png" + }, + { + "name": "USDT", + "address": "0x4988a896b1227218e4a686fde5eabdcabd91571f", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0x4988a896b1227218e4a686fde5eabdcabd91571f/3c1a718331e468abe1fc2ebe319f6c77.png" + }, + { + "name": "AURORA", + "address": "0x8bec47865ade3b172a928df8f990bc7f2a3b9f79", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0x8bec47865ade3b172a928df8f990bc7f2a3b9f79/ec63b91b7247ce338caa842eb6439530.png" + }, + { + "name": "USDC", + "address": "0xb12bfca5a55806aaf64e99521918a4bf0fc40802", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0xb12bfca5a55806aaf64e99521918a4bf0fc40802/43cebbf7a996ebbb31c6b1513e282f0b.png" + }, + { + "name": "NEAR", + "address": "0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d/af4e945c578e905bd2e9dd50deb46972.png" + }, + { + "name": "WBTC", + "address": "0xf4eb217ba2454613b15dbdea6e5f22276410e89e", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0xf4eb217ba2454613b15dbdea6e5f22276410e89e/4b8dce79188a892a6ebf6caeec886bed.png" + }, + { + "name": "TRI", + "address": "0xfa94348467f64d5a457f75f8bc40495d33c65abb", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0xfa94348467f64d5a457f75f8bc40495d33c65abb/f529cbfca541546078d1aa49ecf81056.png" + }, + { + "name": "stONE", + "address": "0x22d62b19b7039333ad773b7185bb61294f3adc19", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0x22d62b19b7039333ad773b7185bb61294f3adc19/2f50553aafc56d830f636a2d67487786.png" + }, + { + "name": "1WBTC", + "address": "0x3095c7557bcb296ccc6e363de01b760ba031f2d9", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0x3095c7557bcb296ccc6e363de01b760ba031f2d9/4b8dce79188a892a6ebf6caeec886bed.png" + }, + { + "name": "1USDT", + "address": "0x3c2b8be99c50593081eaa2a724f0b8285f5aba8f", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0x3c2b8be99c50593081eaa2a724f0b8285f5aba8f/3c1a718331e468abe1fc2ebe319f6c77.png" + }, + { + "name": "1ETH", + "address": "0x6983d1e6def3690c4d616b13597a09e6193ea013", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0x6983d1e6def3690c4d616b13597a09e6193ea013/56f5de0d16e8848bb9ff27cbd8f73f30.png" + }, + { + "name": "1USDC", + "address": "0x985458e523db3d53125813ed68c274899e9dfab4", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0x985458e523db3d53125813ed68c274899e9dfab4/43cebbf7a996ebbb31c6b1513e282f0b.png" + }, + { + "name": "1BTC", + "address": "0xdc54046c0451f9269fee1840aec808d36015697d", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0xdc54046c0451f9269fee1840aec808d36015697d/ed6d39af4cdeca39b6d19dab162b5c02.png" + }, + { + "name": "1DAI", + "address": "0xef977d2f931c1978db5f6747666fa1eacb0d0339", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0xef977d2f931c1978db5f6747666fa1eacb0d0339/61b18dee6896c6dab0684a78d0eee10a.png" + }, + { + "address": "0x2b2C81e08f1Af8835a78Bb2A90AE924ACE0eA4bE", + "name": "sAVAX", + "logo_url": "https://app.benqi.fi/images/assets/savax.png" + }, + { + "address": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", + "name": "USDt", + "logo_url": "https://app.benqi.fi/images/assets/usdt.png" + }, + { + "address": "0x17700282592d6917f6a73d0bf8accf4d578c131e", + "name": "MOO", + "logo_url": "https://static.debank.com/image/celo_token/logo_url/0x17700282592d6917f6a73d0bf8accf4d578c131e/7ed8826cb36d17b032528714ce908b20.png" + }, + { + "address": "0x471ece3750da237f93b8e339c536989b8978a438", + "name": "CELO", + "logo_url": "https://static.debank.com/image/celo_token/logo_url/0x471ece3750da237f93b8e339c536989b8978a438/6f524d91db674876ba0f5767cf0124cc.png" + }, + { + "address": "0x765de816845861e75a25fca122bb6898b8b1282a", + "name": "cUSD", + "logo_url": "https://static.debank.com/image/celo_token/logo_url/0x765de816845861e75a25fca122bb6898b8b1282a/17f6d58bd2a344a2098ef8123be88693.png" + }, + { + "address": "0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73", + "name": "cEUR", + "logo_url": "https://static.debank.com/image/celo_token/logo_url/0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73/f00fcdbf2e75d1d5a8dbbe57653ecbb5.png" + }, + { + "address": "0xe8537a3d056da446677b9e9d6c5db704eaab4787", + "name": "cREAL", + "logo_url": "https://s2.coinmarketcap.com/static/img/coins/128x128/16385.png" + }, + { + "address": "0x04068da6c83afcfa0e13ba15a6696662335d5b75", + "name": "USDC", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x04068da6c83afcfa0e13ba15a6696662335d5b75/fffcd27b9efff5a86ab942084c05924d.png" + }, + { + "address": "0x049d68029688eabf473097a2fc38ef61633a3c7a", + "name": "fUSDT", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x049d68029688eabf473097a2fc38ef61633a3c7a/66eadee7b7bb16b75e02b570ab8d5c01.png" + }, + { + "address": "0x1e4f97b9f9f913c46f1632781732927b9019c68b", + "name": "CRV", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x1e4f97b9f9f913c46f1632781732927b9019c68b/38f4cbac8fb4ac70c384a65ae0cca337.png" + }, + { + "address": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83", + "name": "WFTM", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83/2b7d91858f9c62aafc8d7778b9c22f57.png" + }, + { + "address": "0x321162cd933e2be498cd2267a90534a804051b11", + "name": "BTC", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x321162cd933e2be498cd2267a90534a804051b11/d3c52e7c7449afa8bd4fad1c93f50d93.png" + }, + { + "address": "0x74b23882a30290451a17c44f4f05243b6b58c76d", + "name": "ETH", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x74b23882a30290451a17c44f4f05243b6b58c76d/61844453e63cf81301f845d7864236f6.png" + }, + { + "address": "0x82f0b8b456c1a451378467398982d4834b6829c1", + "name": "MIM", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x82f0b8b456c1a451378467398982d4834b6829c1/7d0c0fb6eab1b7a8a9bfb7dcc04cb11e.png" + }, + { + "address": "0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e", + "name": "DAI", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e/549c4205dbb199f1b8b03af783f35e71.png" + }, + { + "address": "0xb3654dc3d10ea7645f8319668e8f54d2574fbdc8", + "name": "LINK", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0xb3654dc3d10ea7645f8319668e8f54d2574fbdc8/69425617db0ef93a7c21c4f9b81c7ca5.png" + }, + { + "address": "0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f", + "name": "PLY", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f/3a56718d2d1c32b1b12c95b2f1e5806c.png" } ] diff --git a/packages/shared/src/UI/components/TokenIcon/TokenIconSpecialIconList.json b/packages/shared/src/UI/components/TokenIcon/TokenIconSpecialIconList.json index 2909c44aacdf..c3250ea89997 100644 --- a/packages/shared/src/UI/components/TokenIcon/TokenIconSpecialIconList.json +++ b/packages/shared/src/UI/components/TokenIcon/TokenIconSpecialIconList.json @@ -193,5 +193,160 @@ "name": "AVAX", "address": "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7", "logo_url": "https://raw.githubusercontent.com/sushiswap/icons/master/network/avalanche.jpg'" + }, + { + "name": "STNEAR", + "address": "0x07f9f7f963c5cd2bbffd30ccfb964be114332e30", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0x07f9f7f963c5cd2bbffd30ccfb964be114332e30/625cb2649588721db770dc0f54379a43.png" + }, + { + "name": "USDT", + "address": "0x4988a896b1227218e4a686fde5eabdcabd91571f", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0x4988a896b1227218e4a686fde5eabdcabd91571f/3c1a718331e468abe1fc2ebe319f6c77.png" + }, + { + "name": "AURORA", + "address": "0x8bec47865ade3b172a928df8f990bc7f2a3b9f79", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0x8bec47865ade3b172a928df8f990bc7f2a3b9f79/ec63b91b7247ce338caa842eb6439530.png" + }, + { + "name": "USDC", + "address": "0xb12bfca5a55806aaf64e99521918a4bf0fc40802", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0xb12bfca5a55806aaf64e99521918a4bf0fc40802/43cebbf7a996ebbb31c6b1513e282f0b.png" + }, + { + "name": "NEAR", + "address": "0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d/af4e945c578e905bd2e9dd50deb46972.png" + }, + { + "name": "WBTC", + "address": "0xf4eb217ba2454613b15dbdea6e5f22276410e89e", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0xf4eb217ba2454613b15dbdea6e5f22276410e89e/4b8dce79188a892a6ebf6caeec886bed.png" + }, + { + "name": "TRI", + "address": "0xfa94348467f64d5a457f75f8bc40495d33c65abb", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0xfa94348467f64d5a457f75f8bc40495d33c65abb/f529cbfca541546078d1aa49ecf81056.png" + }, + { + "name": "stONE", + "address": "0x22d62b19b7039333ad773b7185bb61294f3adc19", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0x22d62b19b7039333ad773b7185bb61294f3adc19/2f50553aafc56d830f636a2d67487786.png" + }, + { + "name": "1WBTC", + "address": "0x3095c7557bcb296ccc6e363de01b760ba031f2d9", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0x3095c7557bcb296ccc6e363de01b760ba031f2d9/4b8dce79188a892a6ebf6caeec886bed.png" + }, + { + "name": "1USDT", + "address": "0x3c2b8be99c50593081eaa2a724f0b8285f5aba8f", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0x3c2b8be99c50593081eaa2a724f0b8285f5aba8f/3c1a718331e468abe1fc2ebe319f6c77.png" + }, + { + "name": "1ETH", + "address": "0x6983d1e6def3690c4d616b13597a09e6193ea013", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0x6983d1e6def3690c4d616b13597a09e6193ea013/56f5de0d16e8848bb9ff27cbd8f73f30.png" + }, + { + "name": "1USDC", + "address": "0x985458e523db3d53125813ed68c274899e9dfab4", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0x985458e523db3d53125813ed68c274899e9dfab4/43cebbf7a996ebbb31c6b1513e282f0b.png" + }, + { + "name": "1BTC", + "address": "0xdc54046c0451f9269fee1840aec808d36015697d", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0xdc54046c0451f9269fee1840aec808d36015697d/ed6d39af4cdeca39b6d19dab162b5c02.png" + }, + { + "name": "1DAI", + "address": "0xef977d2f931c1978db5f6747666fa1eacb0d0339", + "logo_url": "https://static.debank.com/image/hmy_token/logo_url/0xef977d2f931c1978db5f6747666fa1eacb0d0339/61b18dee6896c6dab0684a78d0eee10a.png" + }, + { + "address": "0x2b2C81e08f1Af8835a78Bb2A90AE924ACE0eA4bE", + "name": "sAVAX", + "logo_url": "https://app.benqi.fi/images/assets/savax.png" + }, + { + "address": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", + "name": "USDt", + "logo_url": "https://app.benqi.fi/images/assets/usdt.png" + }, + { + "address": "0x17700282592d6917f6a73d0bf8accf4d578c131e", + "name": "MOO", + "logo_url": "https://static.debank.com/image/celo_token/logo_url/0x17700282592d6917f6a73d0bf8accf4d578c131e/7ed8826cb36d17b032528714ce908b20.png" + }, + { + "address": "0x471ece3750da237f93b8e339c536989b8978a438", + "name": "CELO", + "logo_url": "https://static.debank.com/image/celo_token/logo_url/0x471ece3750da237f93b8e339c536989b8978a438/6f524d91db674876ba0f5767cf0124cc.png" + }, + { + "address": "0x765de816845861e75a25fca122bb6898b8b1282a", + "name": "cUSD", + "logo_url": "https://static.debank.com/image/celo_token/logo_url/0x765de816845861e75a25fca122bb6898b8b1282a/17f6d58bd2a344a2098ef8123be88693.png" + }, + { + "address": "0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73", + "name": "cEUR", + "logo_url": "https://static.debank.com/image/celo_token/logo_url/0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73/f00fcdbf2e75d1d5a8dbbe57653ecbb5.png" + }, + { + "address": "0xe8537a3d056da446677b9e9d6c5db704eaab4787", + "name": "cREAL", + "logo_url": "https://s2.coinmarketcap.com/static/img/coins/128x128/16385.png" + }, + { + "address": "0x04068da6c83afcfa0e13ba15a6696662335d5b75", + "name": "USDC", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x04068da6c83afcfa0e13ba15a6696662335d5b75/fffcd27b9efff5a86ab942084c05924d.png" + }, + { + "address": "0x049d68029688eabf473097a2fc38ef61633a3c7a", + "name": "fUSDT", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x049d68029688eabf473097a2fc38ef61633a3c7a/66eadee7b7bb16b75e02b570ab8d5c01.png" + }, + { + "address": "0x1e4f97b9f9f913c46f1632781732927b9019c68b", + "name": "CRV", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x1e4f97b9f9f913c46f1632781732927b9019c68b/38f4cbac8fb4ac70c384a65ae0cca337.png" + }, + { + "address": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83", + "name": "WFTM", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83/2b7d91858f9c62aafc8d7778b9c22f57.png" + }, + { + "address": "0x321162cd933e2be498cd2267a90534a804051b11", + "name": "BTC", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x321162cd933e2be498cd2267a90534a804051b11/d3c52e7c7449afa8bd4fad1c93f50d93.png" + }, + { + "address": "0x74b23882a30290451a17c44f4f05243b6b58c76d", + "name": "ETH", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x74b23882a30290451a17c44f4f05243b6b58c76d/61844453e63cf81301f845d7864236f6.png" + }, + { + "address": "0x82f0b8b456c1a451378467398982d4834b6829c1", + "name": "MIM", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x82f0b8b456c1a451378467398982d4834b6829c1/7d0c0fb6eab1b7a8a9bfb7dcc04cb11e.png" + }, + { + "address": "0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e", + "name": "DAI", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e/549c4205dbb199f1b8b03af783f35e71.png" + }, + { + "address": "0xb3654dc3d10ea7645f8319668e8f54d2574fbdc8", + "name": "LINK", + "logo_url": "https://static.debank.com/image/ftm_token/logo_url/0xb3654dc3d10ea7645f8319668e8f54d2574fbdc8/69425617db0ef93a7c21c4f9b81c7ca5.png" + }, + { + "address": "0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f", + "name": "PLY", + "logo_url": "https://static.debank.com/image/aurora_token/logo_url/0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f/3a56718d2d1c32b1b12c95b2f1e5806c.png" } ] diff --git a/packages/typed-message/dom/Metadata/index.ts b/packages/typed-message/dom/Metadata/index.ts index 04a24b6f91c9..62fded24f070 100644 --- a/packages/typed-message/dom/Metadata/index.ts +++ b/packages/typed-message/dom/Metadata/index.ts @@ -2,8 +2,8 @@ import { Result, Ok, Err, Some, Option, None } from 'ts-results' import type { ReactElement, ReactNode } from 'react' import type { TypedMessage } from '../../base/index.js' import z_schema from 'z-schema' -import draft, { enableMapSet, Draft } from 'immer' -enableMapSet() +import draft, { Draft } from 'immer' +// enableMapSet() const metadataSchemaStore = new Map() export function getKnownMetadataKeys() { diff --git a/packages/web3-constants/evm/alpaca.json b/packages/web3-constants/evm/alpaca.json new file mode 100644 index 000000000000..1a805b4538e3 --- /dev/null +++ b/packages/web3-constants/evm/alpaca.json @@ -0,0 +1,25 @@ +{ + "SUMMARY_API": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "https://alpaca-static-api.alpacafinance.org/bsc/v1/landing/summary.json", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + } +} diff --git a/packages/web3-constants/evm/aurigami.json b/packages/web3-constants/evm/aurigami.json new file mode 100644 index 000000000000..981bb804aa69 --- /dev/null +++ b/packages/web3-constants/evm/aurigami.json @@ -0,0 +1,163 @@ +{ + "COMPTROLLER": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0x817af6cfAF35BdC1A634d6cC94eE9e4c68369Aeb", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "ORACLE": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0xC6e5185438e1730959c1eF3551059A3feC744E90", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "LENS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0xC41a5C1625d492436600789469c1CE2eA20CEA6B", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "AURORA_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0x8BEc47865aDe3B172A928df8f990Bc7f2A3b9f79", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "PLY_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "NEAR_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "TRI_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0xfa94348467f64d5a457f75f8bc40495d33c65abb", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + } +} diff --git a/packages/web3-constants/evm/benqi.json b/packages/web3-constants/evm/benqi.json new file mode 100644 index 000000000000..8da5a43c638e --- /dev/null +++ b/packages/web3-constants/evm/benqi.json @@ -0,0 +1,48 @@ +{ + "COMPTROLLER": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "0x486Af39519B4Dc9a7fCcd318217352830E8AD9b4", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "ORACLE": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "0x316ae55ec59e0beb2121c0e41d4bdef8bf66b32b", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + } +} diff --git a/packages/web3-constants/evm/compound.json b/packages/web3-constants/evm/compound.json new file mode 100644 index 000000000000..3370b179bd7a --- /dev/null +++ b/packages/web3-constants/evm/compound.json @@ -0,0 +1,25 @@ +{ + "COMPTROLLER": { + "Mainnet": "0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + } +} diff --git a/packages/web3-constants/evm/giest.json b/packages/web3-constants/evm/giest.json new file mode 100644 index 000000000000..be28cc53fd50 --- /dev/null +++ b/packages/web3-constants/evm/giest.json @@ -0,0 +1,48 @@ +{ + "LENDING_POOL_ADDRESSES_PROVIDER": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "0x6c793c628Fe2b480c5e6FB7957dDa4b9291F9c9b", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "PROTOCOL_DATA_PROVIDER": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "0xf3B0611e2E4D2cd6aB4bb3e01aDe211c3f42A8C3", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + } +} diff --git a/packages/web3-constants/evm/moola.json b/packages/web3-constants/evm/moola.json new file mode 100644 index 000000000000..7043ea01d586 --- /dev/null +++ b/packages/web3-constants/evm/moola.json @@ -0,0 +1,48 @@ +{ + "LENDING_POOL_ADDRESSES_PROVIDER": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "0xD1088091A174d33412a968Fa34Cb67131188B332", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "PROTOCOL_DATA_PROVIDER": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "0x43d067ed784D9DD2ffEda73775e2CC4c560103A1", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + } +} diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 1486158cf340..cfbea9e0eb04 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -2436,5 +2436,97 @@ "Conflux": "0x0000000000000000000000000000000000000000", "Harmony": "", "Harmony_Test": "" + }, + "AURORA_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0x8BEc47865aDe3B172A928df8f990Bc7f2A3b9f79", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "PLY_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "NEAR_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "TRI_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "0xfa94348467f64d5a457f75f8bc40495d33c65abb", + "Aurora_Testnet": "", + "Conflux": "0x0000000000000000000000000000000000000000", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/tranquil.json b/packages/web3-constants/evm/tranquil.json new file mode 100644 index 000000000000..5556bcf22a30 --- /dev/null +++ b/packages/web3-constants/evm/tranquil.json @@ -0,0 +1,71 @@ +{ + "COMPTROLLER": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0x6a82A17B48EF6be278BBC56138F35d04594587E3", + "Harmony_Test": "" + }, + "ORACLE": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0x0C99E05CD2dCb52A583a3694F4d91813eFb5B071", + "Harmony_Test": "" + }, + "TRANQ": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0xcf1709ad76a79d5a60210f23e81ce2460542a836", + "Harmony_Test": "" + } +} diff --git a/packages/web3-contracts/abis/AlpacaVault.json b/packages/web3-contracts/abis/AlpacaVault.json new file mode 100644 index 000000000000..708efa82f0a5 --- /dev/null +++ b/packages/web3-contracts/abis/AlpacaVault.json @@ -0,0 +1,430 @@ +[ + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "healthBefore", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "healthAfter", "type": "uint256" } + ], + "name": "AddCollateral", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "debtShare", "type": "uint256" } + ], + "name": "AddDebt", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, + { "indexed": true, "internalType": "address", "name": "killer", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "owner", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "posVal", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "debt", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "prize", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "left", "type": "uint256" } + ], + "name": "Kill", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "debtShare", "type": "uint256" } + ], + "name": "RemoveDebt", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "loan", "type": "uint256" } + ], + "name": "Work", + "type": "event" + }, + { + "inputs": [], + "name": "POSITION_ID", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STRATEGY", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_IN_EXEC_LOCK", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "id", "type": "uint256" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "internalType": "bool", "name": "goRogue", "type": "bool" }, + { "internalType": "bytes", "name": "data", "type": "bytes" } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "address", "name": "spender", "type": "address" } + ], + "name": "allowance", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "approve", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "balanceOf", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "config", + "outputs": [{ "internalType": "contract IVaultConfig", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "debtShare", "type": "uint256" }], + "name": "debtShareToVal", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "debtToken", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "debtVal", "type": "uint256" }], + "name": "debtValToShare", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } + ], + "name": "decreaseAllowance", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "amountToken", "type": "uint256" }], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "fairLaunchPoolId", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "addedValue", "type": "uint256" } + ], + "name": "increaseAllowance", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "contract IVaultConfig", "name": "_config", "type": "address" }, + { "internalType": "address", "name": "_token", "type": "address" }, + { "internalType": "string", "name": "_name", "type": "string" }, + { "internalType": "string", "name": "_symbol", "type": "string" }, + { "internalType": "uint8", "name": "_decimals", "type": "uint8" }, + { "internalType": "address", "name": "_debtToken", "type": "address" } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "id", "type": "uint256" }], + "name": "kill", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lastAccrueTime", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nextPositionID", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "value", "type": "uint256" }], + "name": "pendingInterest", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "id", "type": "uint256" }], + "name": "positionInfo", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "positions", + "outputs": [ + { "internalType": "address", "name": "worker", "type": "address" }, + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "uint256", "name": "debtShare", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "value", "type": "uint256" }], + "name": "reduceReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { "internalType": "address", "name": "targetedToken", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "requestFunds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "reservePool", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "_poolId", "type": "uint256" }], + "name": "setFairLaunchPoolId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalToken", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "transfer", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "contract IVaultConfig", "name": "_config", "type": "address" }], + "name": "updateConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vaultDebtShare", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vaultDebtVal", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "share", "type": "uint256" }], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "withdrawReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "id", "type": "uint256" }, + { "internalType": "address", "name": "worker", "type": "address" }, + { "internalType": "uint256", "name": "principalAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "borrowAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "maxReturn", "type": "uint256" }, + { "internalType": "bytes", "name": "data", "type": "bytes" } + ], + "name": "work", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { "stateMutability": "payable", "type": "receive" } +] diff --git a/packages/web3-contracts/abis/AlpacaVaultConfig.json b/packages/web3-contracts/abis/AlpacaVaultConfig.json new file mode 100644 index 000000000000..4e9487208434 --- /dev/null +++ b/packages/web3-contracts/abis/AlpacaVaultConfig.json @@ -0,0 +1,346 @@ +[ + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "addStrat", "type": "address" }, + { "indexed": false, "internalType": "bool", "name": "ok", "type": "bool" } + ], + "name": "SetApprovedAddStrategy", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "maxKillBps", "type": "uint256" } + ], + "name": "SetMaxKillBps", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "minDebtSize", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "reservePoolBps", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "killBps", "type": "uint256" }, + { "indexed": false, "internalType": "address", "name": "interestModel", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "wrappedNative", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "wNativeRelayer", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "fairLaunch", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "killTreasuryBps", "type": "uint256" }, + { "indexed": false, "internalType": "address", "name": "treasury", "type": "address" } + ], + "name": "SetParams", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "addr", "type": "address" }, + { "indexed": false, "internalType": "bool", "name": "ok", "type": "bool" } + ], + "name": "SetWhitelistedCaller", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "addr", "type": "address" }, + { "indexed": false, "internalType": "bool", "name": "ok", "type": "bool" } + ], + "name": "SetWhitelistedLiquidator", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "worker", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "workerConfig", "type": "address" } + ], + "name": "SetWorkers", + "type": "event" + }, + { + "inputs": [{ "internalType": "address", "name": "worker", "type": "address" }], + "name": "acceptDebt", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "approvedAddStrategies", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFairLaunchAddr", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "debt", "type": "uint256" }, + { "internalType": "uint256", "name": "floating", "type": "uint256" } + ], + "name": "getInterestRate", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getKillBps", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getKillTreasuryBps", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReservePoolBps", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTreasuryAddr", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWNativeRelayer", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedNativeAddr", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_minDebtSize", "type": "uint256" }, + { "internalType": "uint256", "name": "_reservePoolBps", "type": "uint256" }, + { "internalType": "uint256", "name": "_killBps", "type": "uint256" }, + { "internalType": "contract InterestModel", "name": "_interestModel", "type": "address" }, + { "internalType": "address", "name": "_getWrappedNativeAddr", "type": "address" }, + { "internalType": "address", "name": "_getWNativeRelayer", "type": "address" }, + { "internalType": "address", "name": "_getFairLaunchAddr", "type": "address" }, + { "internalType": "uint256", "name": "_getKillTreasuryBps", "type": "uint256" }, + { "internalType": "address", "name": "_treasury", "type": "address" } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "interestModel", + "outputs": [{ "internalType": "contract InterestModel", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "worker", "type": "address" }], + "name": "isWorker", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "worker", "type": "address" }], + "name": "isWorkerReserveConsistent", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "worker", "type": "address" }], + "name": "isWorkerStable", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "worker", "type": "address" }, + { "internalType": "uint256", "name": "debt", "type": "uint256" } + ], + "name": "killFactor", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxKillBps", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minDebtSize", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "worker", "type": "address" }, + { "internalType": "uint256", "name": "debt", "type": "uint256" } + ], + "name": "rawKillFactor", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { "internalType": "address[]", "name": "addStrats", "type": "address[]" }, + { "internalType": "bool", "name": "ok", "type": "bool" } + ], + "name": "setApprovedAddStrategy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "_maxKillBps", "type": "uint256" }], + "name": "setMaxKillBps", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_minDebtSize", "type": "uint256" }, + { "internalType": "uint256", "name": "_reservePoolBps", "type": "uint256" }, + { "internalType": "uint256", "name": "_killBps", "type": "uint256" }, + { "internalType": "contract InterestModel", "name": "_interestModel", "type": "address" }, + { "internalType": "address", "name": "_getWrappedNativeAddr", "type": "address" }, + { "internalType": "address", "name": "_getWNativeRelayer", "type": "address" }, + { "internalType": "address", "name": "_getFairLaunchAddr", "type": "address" }, + { "internalType": "uint256", "name": "_getKillTreasuryBps", "type": "uint256" }, + { "internalType": "address", "name": "_treasury", "type": "address" } + ], + "name": "setParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address[]", "name": "callers", "type": "address[]" }, + { "internalType": "bool", "name": "ok", "type": "bool" } + ], + "name": "setWhitelistedCallers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address[]", "name": "callers", "type": "address[]" }, + { "internalType": "bool", "name": "ok", "type": "bool" } + ], + "name": "setWhitelistedLiquidators", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address[]", "name": "addrs", "type": "address[]" }, + { "internalType": "contract IWorkerConfig[]", "name": "configs", "type": "address[]" } + ], + "name": "setWorkers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "whitelistedCallers", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "whitelistedLiquidators", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "worker", "type": "address" }, + { "internalType": "uint256", "name": "debt", "type": "uint256" } + ], + "name": "workFactor", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "workers", + "outputs": [{ "internalType": "contract IWorkerConfig", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/web3-contracts/abis/AuriLens.json b/packages/web3-contracts/abis/AuriLens.json new file mode 100644 index 000000000000..463d6723d1e2 --- /dev/null +++ b/packages/web3-contracts/abis/AuriLens.json @@ -0,0 +1,108 @@ +[ + { + "inputs": [ + { + "internalType": "contract AuToken", + "name": "auToken", + "type": "address" + } + ], + "name": "auTokenUnderlyingPrice", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "auToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "underlyingPrice", + "type": "uint256" + } + ], + "internalType": "struct AuriLens.AuTokenUnderlyingPrice", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ComptrollerLensInterface", + "name": "comptroller", + "type": "address" + } + ], + "name": "getAddresses", + "outputs": [ + { + "internalType": "address", + "name": "ply", + "type": "address" + }, + { + "internalType": "address", + "name": "aurora", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenLock", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ComptrollerLensInterface", + "name": "comptroller", + "type": "address" + }, + { + "internalType": "contract AuToken", + "name": "auToken", + "type": "address" + } + ], + "name": "getRewardSpeeds", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "plyRewardSupplySpeed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "plyRewardBorrowSpeed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "auroraRewardSupplySpeed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "auroraRewardBorrowSpeed", + "type": "uint256" + } + ], + "internalType": "struct AuriLens.RewardSpeeds", + "name": "rewardSpeeds", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/web3-contracts/abis/BenQiComptroller.json b/packages/web3-contracts/abis/BenQiComptroller.json new file mode 100644 index 000000000000..29b5ab392e10 --- /dev/null +++ b/packages/web3-contracts/abis/BenQiComptroller.json @@ -0,0 +1,1000 @@ +[ + { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "string", "name": "action", "type": "string" }, + { "indexed": false, "internalType": "bool", "name": "pauseState", "type": "bool" } + ], + "name": "ActionPaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "indexed": false, "internalType": "string", "name": "action", "type": "string" }, + { "indexed": false, "internalType": "bool", "name": "pauseState", "type": "bool" } + ], + "name": "ActionPaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "contributor", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "newSpeed", "type": "uint256" } + ], + "name": "ContributorQiSpeedUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "uint8", "name": "tokenType", "type": "uint8" }, + { "indexed": true, "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "qiDelta", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "qiBorrowIndex", "type": "uint256" } + ], + "name": "DistributedBorrowerReward", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "uint8", "name": "tokenType", "type": "uint8" }, + { "indexed": true, "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "qiDelta", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "qiBorrowIndex", "type": "uint256" } + ], + "name": "DistributedSupplierReward", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "error", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "info", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "detail", "type": "uint256" } + ], + "name": "Failure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "account", "type": "address" } + ], + "name": "MarketEntered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "account", "type": "address" } + ], + "name": "MarketExited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "contract QiToken", "name": "qiToken", "type": "address" }], + "name": "MarketListed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "newBorrowCap", "type": "uint256" } + ], + "name": "NewBorrowCap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldBorrowCapGuardian", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newBorrowCapGuardian", "type": "address" } + ], + "name": "NewBorrowCapGuardian", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "oldCloseFactorMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newCloseFactorMantissa", "type": "uint256" } + ], + "name": "NewCloseFactor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "oldCollateralFactorMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newCollateralFactorMantissa", "type": "uint256" } + ], + "name": "NewCollateralFactor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldLiquidationIncentiveMantissa", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newLiquidationIncentiveMantissa", + "type": "uint256" + } + ], + "name": "NewLiquidationIncentive", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldPauseGuardian", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newPauseGuardian", "type": "address" } + ], + "name": "NewPauseGuardian", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract PriceOracle", "name": "oldPriceOracle", "type": "address" }, + { "indexed": false, "internalType": "contract PriceOracle", "name": "newPriceOracle", "type": "address" } + ], + "name": "NewPriceOracle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "recipient", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "QiGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint8", "name": "tokenType", "type": "uint8" }, + { "indexed": true, "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "newSpeed", "type": "uint256" } + ], + "name": "SpeedUpdated", + "type": "event" + }, + { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { + "constant": false, + "inputs": [{ "internalType": "contract Unitroller", "name": "unitroller", "type": "address" }], + "name": "_become", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_borrowGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address payable", "name": "recipient", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "_grantQi", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_mintGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "newBorrowCapGuardian", "type": "address" }], + "name": "_setBorrowCapGuardian", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "internalType": "bool", "name": "state", "type": "bool" } + ], + "name": "_setBorrowPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "newCloseFactorMantissa", "type": "uint256" }], + "name": "_setCloseFactor", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "internalType": "uint256", "name": "newCollateralFactorMantissa", "type": "uint256" } + ], + "name": "_setCollateralFactor", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "newLiquidationIncentiveMantissa", "type": "uint256" }], + "name": "_setLiquidationIncentive", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract QiToken[]", "name": "qiTokens", "type": "address[]" }, + { "internalType": "uint256[]", "name": "newBorrowCaps", "type": "uint256[]" } + ], + "name": "_setMarketBorrowCaps", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "internalType": "bool", "name": "state", "type": "bool" } + ], + "name": "_setMintPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "newPauseGuardian", "type": "address" }], + "name": "_setPauseGuardian", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract PriceOracle", "name": "newOracle", "type": "address" }], + "name": "_setPriceOracle", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "uint8", "name": "rewardType", "type": "uint8" }, + { "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "internalType": "uint256", "name": "rewardSpeed", "type": "uint256" } + ], + "name": "_setRewardSpeed", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "bool", "name": "state", "type": "bool" }], + "name": "_setSeizePaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "bool", "name": "state", "type": "bool" }], + "name": "_setTransferPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract QiToken", "name": "qiToken", "type": "address" }], + "name": "_supportMarket", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "name": "accountAssets", + "outputs": [{ "internalType": "contract QiToken", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "admin", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "allMarkets", + "outputs": [{ "internalType": "contract QiToken", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiToken", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "borrowAmount", "type": "uint256" } + ], + "name": "borrowAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "borrowCapGuardian", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "borrowCaps", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "borrowGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiToken", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "borrowAmount", "type": "uint256" } + ], + "name": "borrowVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "account", "type": "address" }, + { "internalType": "contract QiToken", "name": "qiToken", "type": "address" } + ], + "name": "checkMembership", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "uint8", "name": "rewardType", "type": "uint8" }, + { "internalType": "address payable", "name": "holder", "type": "address" } + ], + "name": "claimReward", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "uint8", "name": "rewardType", "type": "uint8" }, + { "internalType": "address payable", "name": "holder", "type": "address" }, + { "internalType": "contract QiToken[]", "name": "qiTokens", "type": "address[]" } + ], + "name": "claimReward", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "uint8", "name": "rewardType", "type": "uint8" }, + { "internalType": "address payable[]", "name": "holders", "type": "address[]" }, + { "internalType": "contract QiToken[]", "name": "qiTokens", "type": "address[]" }, + { "internalType": "bool", "name": "borrowers", "type": "bool" }, + { "internalType": "bool", "name": "suppliers", "type": "bool" } + ], + "name": "claimReward", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "closeFactorMantissa", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "comptrollerImplementation", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address[]", "name": "qiTokens", "type": "address[]" }], + "name": "enterMarkets", + "outputs": [{ "internalType": "uint256[]", "name": "", "type": "uint256[]" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "qiTokenAddress", "type": "address" }], + "name": "exitMarket", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "getAccountLiquidity", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getAllMarkets", + "outputs": [{ "internalType": "contract QiToken[]", "name": "", "type": "address[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "getAssetsIn", + "outputs": [{ "internalType": "contract QiToken[]", "name": "", "type": "address[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getBlockTimestamp", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "account", "type": "address" }, + { "internalType": "address", "name": "qiTokenModify", "type": "address" }, + { "internalType": "uint256", "name": "redeemTokens", "type": "uint256" }, + { "internalType": "uint256", "name": "borrowAmount", "type": "uint256" } + ], + "name": "getHypotheticalAccountLiquidity", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "initialIndexConstant", + "outputs": [{ "internalType": "uint224", "name": "", "type": "uint224" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isComptroller", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiTokenBorrowed", "type": "address" }, + { "internalType": "address", "name": "qiTokenCollateral", "type": "address" }, + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "repayAmount", "type": "uint256" } + ], + "name": "liquidateBorrowAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiTokenBorrowed", "type": "address" }, + { "internalType": "address", "name": "qiTokenCollateral", "type": "address" }, + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "actualRepayAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "liquidateBorrowVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "qiTokenBorrowed", "type": "address" }, + { "internalType": "address", "name": "qiTokenCollateral", "type": "address" }, + { "internalType": "uint256", "name": "actualRepayAmount", "type": "uint256" } + ], + "name": "liquidateCalculateSeizeTokens", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "liquidationIncentiveMantissa", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "markets", + "outputs": [ + { "internalType": "bool", "name": "isListed", "type": "bool" }, + { "internalType": "uint256", "name": "collateralFactorMantissa", "type": "uint256" }, + { "internalType": "bool", "name": "isQied", "type": "bool" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "maxAssets", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiToken", "type": "address" }, + { "internalType": "address", "name": "minter", "type": "address" }, + { "internalType": "uint256", "name": "mintAmount", "type": "uint256" } + ], + "name": "mintAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "mintGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiToken", "type": "address" }, + { "internalType": "address", "name": "minter", "type": "address" }, + { "internalType": "uint256", "name": "actualMintAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "mintTokens", "type": "uint256" } + ], + "name": "mintVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "oracle", + "outputs": [{ "internalType": "contract PriceOracle", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "pauseGuardian", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "pendingAdmin", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "pendingComptrollerImplementation", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "qiAddress", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiToken", "type": "address" }, + { "internalType": "address", "name": "redeemer", "type": "address" }, + { "internalType": "uint256", "name": "redeemTokens", "type": "uint256" } + ], + "name": "redeemAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiToken", "type": "address" }, + { "internalType": "address", "name": "redeemer", "type": "address" }, + { "internalType": "uint256", "name": "redeemAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "redeemTokens", "type": "uint256" } + ], + "name": "redeemVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiToken", "type": "address" }, + { "internalType": "address", "name": "payer", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "repayAmount", "type": "uint256" } + ], + "name": "repayBorrowAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiToken", "type": "address" }, + { "internalType": "address", "name": "payer", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "actualRepayAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "borrowerIndex", "type": "uint256" } + ], + "name": "repayBorrowVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "uint8", "name": "", "type": "uint8" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "name": "rewardAccrued", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "rewardAvax", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "uint8", "name": "", "type": "uint8" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "name": "rewardBorrowState", + "outputs": [ + { "internalType": "uint224", "name": "index", "type": "uint224" }, + { "internalType": "uint32", "name": "timestamp", "type": "uint32" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "uint8", "name": "", "type": "uint8" }, + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "name": "rewardBorrowerIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "rewardQi", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "uint8", "name": "", "type": "uint8" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "name": "supplyRewardSpeeds", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "uint8", "name": "", "type": "uint8" }, + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "name": "rewardSupplierIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "uint8", "name": "", "type": "uint8" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "name": "rewardSupplyState", + "outputs": [ + { "internalType": "uint224", "name": "index", "type": "uint224" }, + { "internalType": "uint32", "name": "timestamp", "type": "uint32" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiTokenCollateral", "type": "address" }, + { "internalType": "address", "name": "qiTokenBorrowed", "type": "address" }, + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "seizeAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "seizeGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiTokenCollateral", "type": "address" }, + { "internalType": "address", "name": "qiTokenBorrowed", "type": "address" }, + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "seizeVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "newQiAddress", "type": "address" }], + "name": "setQiAddress", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiToken", "type": "address" }, + { "internalType": "address", "name": "src", "type": "address" }, + { "internalType": "address", "name": "dst", "type": "address" }, + { "internalType": "uint256", "name": "transferTokens", "type": "uint256" } + ], + "name": "transferAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "transferGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "qiToken", "type": "address" }, + { "internalType": "address", "name": "src", "type": "address" }, + { "internalType": "address", "name": "dst", "type": "address" }, + { "internalType": "uint256", "name": "transferTokens", "type": "uint256" } + ], + "name": "transferVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/web3-contracts/abis/BenqiChainlinkOracle.json b/packages/web3-contracts/abis/BenqiChainlinkOracle.json new file mode 100644 index 000000000000..42820a4d817f --- /dev/null +++ b/packages/web3-contracts/abis/BenqiChainlinkOracle.json @@ -0,0 +1,122 @@ +[ + { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "feed", "type": "address" }, + { "indexed": false, "internalType": "string", "name": "symbol", "type": "string" } + ], + "name": "FeedSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldAdmin", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newAdmin", "type": "address" } + ], + "name": "NewAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "asset", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "previousPriceMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "requestedPriceMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newPriceMantissa", "type": "uint256" } + ], + "name": "PricePosted", + "type": "event" + }, + { + "constant": true, + "inputs": [], + "name": "admin", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "asset", "type": "address" }], + "name": "assetPrices", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "string", "name": "symbol", "type": "string" }], + "name": "getFeed", + "outputs": [{ "internalType": "contract AggregatorV2V3Interface", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "contract QiToken", "name": "qiToken", "type": "address" }], + "name": "getUnderlyingPrice", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isPriceOracle", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "newAdmin", "type": "address" }], + "name": "setAdmin", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "asset", "type": "address" }, + { "internalType": "uint256", "name": "price", "type": "uint256" } + ], + "name": "setDirectPrice", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "string", "name": "symbol", "type": "string" }, + { "internalType": "address", "name": "feed", "type": "address" } + ], + "name": "setFeed", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract QiToken", "name": "qiToken", "type": "address" }, + { "internalType": "uint256", "name": "underlyingPriceMantissa", "type": "uint256" } + ], + "name": "setUnderlyingPrice", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/web3-contracts/abis/CERC20.json b/packages/web3-contracts/abis/CERC20.json new file mode 100644 index 000000000000..4df8805ceeec --- /dev/null +++ b/packages/web3-contracts/abis/CERC20.json @@ -0,0 +1,711 @@ +[ + { + "inputs": [ + { "internalType": "address", "name": "underlying_", "type": "address" }, + { "internalType": "contract ComptrollerInterface", "name": "comptroller_", "type": "address" }, + { "internalType": "contract InterestRateModel", "name": "interestRateModel_", "type": "address" }, + { "internalType": "uint256", "name": "initialExchangeRateMantissa_", "type": "uint256" }, + { "internalType": "string", "name": "name_", "type": "string" }, + { "internalType": "string", "name": "symbol_", "type": "string" }, + { "internalType": "uint8", "name": "decimals_", "type": "uint8" }, + { "internalType": "address payable", "name": "admin_", "type": "address" }, + { "internalType": "address", "name": "implementation_", "type": "address" }, + { "internalType": "bytes", "name": "becomeImplementationData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "cashPrior", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "interestAccumulated", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "borrowIndex", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "totalBorrows", "type": "uint256" } + ], + "name": "AccrueInterest", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "borrowAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "accountBorrows", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "totalBorrows", "type": "uint256" } + ], + "name": "Borrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "error", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "info", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "detail", "type": "uint256" } + ], + "name": "Failure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "liquidator", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "repayAmount", "type": "uint256" }, + { "indexed": false, "internalType": "address", "name": "cTokenCollateral", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "LiquidateBorrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "minter", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "mintAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "mintTokens", "type": "uint256" } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldAdmin", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newAdmin", "type": "address" } + ], + "name": "NewAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract ComptrollerInterface", + "name": "oldComptroller", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract ComptrollerInterface", + "name": "newComptroller", + "type": "address" + } + ], + "name": "NewComptroller", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldImplementation", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newImplementation", "type": "address" } + ], + "name": "NewImplementation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract InterestRateModel", + "name": "oldInterestRateModel", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract InterestRateModel", + "name": "newInterestRateModel", + "type": "address" + } + ], + "name": "NewMarketInterestRateModel", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldPendingAdmin", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newPendingAdmin", "type": "address" } + ], + "name": "NewPendingAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "oldReserveFactorMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newReserveFactorMantissa", "type": "uint256" } + ], + "name": "NewReserveFactor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "redeemer", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "redeemAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "redeemTokens", "type": "uint256" } + ], + "name": "Redeem", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "payer", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "repayAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "accountBorrows", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "totalBorrows", "type": "uint256" } + ], + "name": "RepayBorrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "benefactor", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "addAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newTotalReserves", "type": "uint256" } + ], + "name": "ReservesAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "admin", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "reduceAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newTotalReserves", "type": "uint256" } + ], + "name": "ReservesReduced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "Transfer", + "type": "event" + }, + { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { + "constant": false, + "inputs": [], + "name": "_acceptAdmin", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "addAmount", "type": "uint256" }], + "name": "_addReserves", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "reduceAmount", "type": "uint256" }], + "name": "_reduceReserves", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract ComptrollerInterface", "name": "newComptroller", "type": "address" }], + "name": "_setComptroller", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "implementation_", "type": "address" }, + { "internalType": "bool", "name": "allowResign", "type": "bool" }, + { "internalType": "bytes", "name": "becomeImplementationData", "type": "bytes" } + ], + "name": "_setImplementation", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract InterestRateModel", "name": "newInterestRateModel", "type": "address" }], + "name": "_setInterestRateModel", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address payable", "name": "newPendingAdmin", "type": "address" }], + "name": "_setPendingAdmin", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "newReserveFactorMantissa", "type": "uint256" }], + "name": "_setReserveFactor", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "accrualBlockNumber", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "accrueInterest", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "admin", + "outputs": [{ "internalType": "address payable", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "address", "name": "spender", "type": "address" } + ], + "name": "allowance", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "approve", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "name": "balanceOf", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "name": "balanceOfUnderlying", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "borrowAmount", "type": "uint256" }], + "name": "borrow", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "borrowBalanceCurrent", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "borrowBalanceStored", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "borrowIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "borrowRatePerBlock", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "comptroller", + "outputs": [{ "internalType": "contract ComptrollerInterface", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "bytes", "name": "data", "type": "bytes" }], + "name": "delegateToImplementation", + "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "data", "type": "bytes" }], + "name": "delegateToViewImplementation", + "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "exchangeRateCurrent", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "exchangeRateStored", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "getAccountSnapshot", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCash", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "implementation", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "interestRateModel", + "outputs": [{ "internalType": "contract InterestRateModel", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isCToken", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "repayAmount", "type": "uint256" }, + { "internalType": "contract CTokenInterface", "name": "cTokenCollateral", "type": "address" } + ], + "name": "liquidateBorrow", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "mintAmount", "type": "uint256" }], + "name": "mint", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "pendingAdmin", + "outputs": [{ "internalType": "address payable", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "protocolSeizeShareMantissa", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "redeemTokens", "type": "uint256" }], + "name": "redeem", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "redeemAmount", "type": "uint256" }], + "name": "redeemUnderlying", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "repayAmount", "type": "uint256" }], + "name": "repayBorrow", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "repayAmount", "type": "uint256" } + ], + "name": "repayBorrowBehalf", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "reserveFactorMantissa", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "seize", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "supplyRatePerBlock", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract EIP20NonStandardInterface", "name": "token", "type": "address" }], + "name": "sweepToken", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalBorrows", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "totalBorrowsCurrent", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalReserves", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "dst", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "transfer", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "src", "type": "address" }, + { "internalType": "address", "name": "dst", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "underlying", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/web3-contracts/abis/CEther.json b/packages/web3-contracts/abis/CEther.json new file mode 100644 index 000000000000..95b40811ee17 --- /dev/null +++ b/packages/web3-contracts/abis/CEther.json @@ -0,0 +1,596 @@ +[ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [{ "name": "", "type": "string" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "spender", "type": "address" }, + { "name": "amount", "type": "uint256" } + ], + "name": "approve", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "mint", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "reserveFactorMantissa", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "account", "type": "address" }], + "name": "borrowBalanceCurrent", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "exchangeRateStored", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "src", "type": "address" }, + { "name": "dst", "type": "address" }, + { "name": "amount", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "pendingAdmin", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "owner", "type": "address" }], + "name": "balanceOfUnderlying", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCash", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "newComptroller", "type": "address" }], + "name": "_setComptroller", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalBorrows", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "repayBorrow", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "comptroller", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "reduceAmount", "type": "uint256" }], + "name": "_reduceReserves", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "initialExchangeRateMantissa", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "accrualBlockNumber", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "owner", "type": "address" }], + "name": "balanceOf", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "totalBorrowsCurrent", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "redeemAmount", "type": "uint256" }], + "name": "redeemUnderlying", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalReserves", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [{ "name": "", "type": "string" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "account", "type": "address" }], + "name": "borrowBalanceStored", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "accrueInterest", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "dst", "type": "address" }, + { "name": "amount", "type": "uint256" } + ], + "name": "transfer", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "borrowIndex", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "borrower", "type": "address" }, + { "name": "cTokenCollateral", "type": "address" } + ], + "name": "liquidateBorrow", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "supplyRatePerBlock", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "name": "liquidator", "type": "address" }, + { "name": "borrower", "type": "address" }, + { "name": "seizeTokens", "type": "uint256" } + ], + "name": "seize", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "newPendingAdmin", "type": "address" }], + "name": "_setPendingAdmin", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "exchangeRateCurrent", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "account", "type": "address" }], + "name": "getAccountSnapshot", + "outputs": [ + { "name": "", "type": "uint256" }, + { "name": "", "type": "uint256" }, + { "name": "", "type": "uint256" }, + { "name": "", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "borrowAmount", "type": "uint256" }], + "name": "borrow", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "redeemTokens", "type": "uint256" }], + "name": "redeem", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "name": "owner", "type": "address" }, + { "name": "spender", "type": "address" } + ], + "name": "allowance", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "borrower", "type": "address" }], + "name": "repayBorrowBehalf", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "_acceptAdmin", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "newInterestRateModel", "type": "address" }], + "name": "_setInterestRateModel", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "interestRateModel", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "admin", + "outputs": [{ "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "borrowRatePerBlock", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "name": "newReserveFactorMantissa", "type": "uint256" }], + "name": "_setReserveFactor", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isCToken", + "outputs": [{ "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "name": "comptroller_", "type": "address" }, + { "name": "interestRateModel_", "type": "address" }, + { "name": "initialExchangeRateMantissa_", "type": "uint256" }, + { "name": "name_", "type": "string" }, + { "name": "symbol_", "type": "string" }, + { "name": "decimals_", "type": "uint256" } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "interestAccumulated", "type": "uint256" }, + { "indexed": false, "name": "borrowIndex", "type": "uint256" }, + { "indexed": false, "name": "totalBorrows", "type": "uint256" } + ], + "name": "AccrueInterest", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "minter", "type": "address" }, + { "indexed": false, "name": "mintAmount", "type": "uint256" }, + { "indexed": false, "name": "mintTokens", "type": "uint256" } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "redeemer", "type": "address" }, + { "indexed": false, "name": "redeemAmount", "type": "uint256" }, + { "indexed": false, "name": "redeemTokens", "type": "uint256" } + ], + "name": "Redeem", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "borrower", "type": "address" }, + { "indexed": false, "name": "borrowAmount", "type": "uint256" }, + { "indexed": false, "name": "accountBorrows", "type": "uint256" }, + { "indexed": false, "name": "totalBorrows", "type": "uint256" } + ], + "name": "Borrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "payer", "type": "address" }, + { "indexed": false, "name": "borrower", "type": "address" }, + { "indexed": false, "name": "repayAmount", "type": "uint256" }, + { "indexed": false, "name": "accountBorrows", "type": "uint256" }, + { "indexed": false, "name": "totalBorrows", "type": "uint256" } + ], + "name": "RepayBorrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "liquidator", "type": "address" }, + { "indexed": false, "name": "borrower", "type": "address" }, + { "indexed": false, "name": "repayAmount", "type": "uint256" }, + { "indexed": false, "name": "cTokenCollateral", "type": "address" }, + { "indexed": false, "name": "seizeTokens", "type": "uint256" } + ], + "name": "LiquidateBorrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "oldPendingAdmin", "type": "address" }, + { "indexed": false, "name": "newPendingAdmin", "type": "address" } + ], + "name": "NewPendingAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "oldAdmin", "type": "address" }, + { "indexed": false, "name": "newAdmin", "type": "address" } + ], + "name": "NewAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "oldComptroller", "type": "address" }, + { "indexed": false, "name": "newComptroller", "type": "address" } + ], + "name": "NewComptroller", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "oldInterestRateModel", "type": "address" }, + { "indexed": false, "name": "newInterestRateModel", "type": "address" } + ], + "name": "NewMarketInterestRateModel", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "oldReserveFactorMantissa", "type": "uint256" }, + { "indexed": false, "name": "newReserveFactorMantissa", "type": "uint256" } + ], + "name": "NewReserveFactor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "admin", "type": "address" }, + { "indexed": false, "name": "reduceAmount", "type": "uint256" }, + { "indexed": false, "name": "newTotalReserves", "type": "uint256" } + ], + "name": "ReservesReduced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "name": "error", "type": "uint256" }, + { "indexed": false, "name": "info", "type": "uint256" }, + { "indexed": false, "name": "detail", "type": "uint256" } + ], + "name": "Failure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "from", "type": "address" }, + { "indexed": true, "name": "to", "type": "address" }, + { "indexed": false, "name": "amount", "type": "uint256" } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "name": "owner", "type": "address" }, + { "indexed": true, "name": "spender", "type": "address" }, + { "indexed": false, "name": "amount", "type": "uint256" } + ], + "name": "Approval", + "type": "event" + } +] diff --git a/packages/web3-contracts/abis/Comptroller.json b/packages/web3-contracts/abis/Comptroller.json new file mode 100644 index 000000000000..4ab6879f4b4a --- /dev/null +++ b/packages/web3-contracts/abis/Comptroller.json @@ -0,0 +1,1084 @@ +[ + { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "string", "name": "action", "type": "string" }, + { "indexed": false, "internalType": "bool", "name": "pauseState", "type": "bool" } + ], + "name": "ActionPaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "indexed": false, "internalType": "string", "name": "action", "type": "string" }, + { "indexed": false, "internalType": "bool", "name": "pauseState", "type": "bool" } + ], + "name": "ActionPaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "oldCompAccrued", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newCompAccrued", "type": "uint256" } + ], + "name": "CompAccruedAdjusted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "newSpeed", "type": "uint256" } + ], + "name": "CompBorrowSpeedUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "recipient", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "CompGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "oldCompReceivable", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newCompReceivable", "type": "uint256" } + ], + "name": "CompReceivableUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "newSpeed", "type": "uint256" } + ], + "name": "CompSupplySpeedUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "contributor", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "newSpeed", "type": "uint256" } + ], + "name": "ContributorCompSpeedUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "compDelta", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "compBorrowIndex", "type": "uint256" } + ], + "name": "DistributedBorrowerComp", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "supplier", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "compDelta", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "compSupplyIndex", "type": "uint256" } + ], + "name": "DistributedSupplierComp", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "error", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "info", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "detail", "type": "uint256" } + ], + "name": "Failure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "account", "type": "address" } + ], + "name": "MarketEntered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "account", "type": "address" } + ], + "name": "MarketExited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "contract CToken", "name": "cToken", "type": "address" }], + "name": "MarketListed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "newBorrowCap", "type": "uint256" } + ], + "name": "NewBorrowCap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldBorrowCapGuardian", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newBorrowCapGuardian", "type": "address" } + ], + "name": "NewBorrowCapGuardian", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "oldCloseFactorMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newCloseFactorMantissa", "type": "uint256" } + ], + "name": "NewCloseFactor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "oldCollateralFactorMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newCollateralFactorMantissa", "type": "uint256" } + ], + "name": "NewCollateralFactor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldLiquidationIncentiveMantissa", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newLiquidationIncentiveMantissa", + "type": "uint256" + } + ], + "name": "NewLiquidationIncentive", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldPauseGuardian", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newPauseGuardian", "type": "address" } + ], + "name": "NewPauseGuardian", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "contract PriceOracle", "name": "oldPriceOracle", "type": "address" }, + { "indexed": false, "internalType": "contract PriceOracle", "name": "newPriceOracle", "type": "address" } + ], + "name": "NewPriceOracle", + "type": "event" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract Unitroller", "name": "unitroller", "type": "address" }], + "name": "_become", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_borrowGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "_grantComp", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_mintGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "newBorrowCapGuardian", "type": "address" }], + "name": "_setBorrowCapGuardian", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "internalType": "bool", "name": "state", "type": "bool" } + ], + "name": "_setBorrowPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "newCloseFactorMantissa", "type": "uint256" }], + "name": "_setCloseFactor", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "internalType": "uint256", "name": "newCollateralFactorMantissa", "type": "uint256" } + ], + "name": "_setCollateralFactor", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract CToken[]", "name": "cTokens", "type": "address[]" }, + { "internalType": "uint256[]", "name": "supplySpeeds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "borrowSpeeds", "type": "uint256[]" } + ], + "name": "_setCompSpeeds", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "contributor", "type": "address" }, + { "internalType": "uint256", "name": "compSpeed", "type": "uint256" } + ], + "name": "_setContributorCompSpeed", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "newLiquidationIncentiveMantissa", "type": "uint256" }], + "name": "_setLiquidationIncentive", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract CToken[]", "name": "cTokens", "type": "address[]" }, + { "internalType": "uint256[]", "name": "newBorrowCaps", "type": "uint256[]" } + ], + "name": "_setMarketBorrowCaps", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract CToken", "name": "cToken", "type": "address" }, + { "internalType": "bool", "name": "state", "type": "bool" } + ], + "name": "_setMintPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "newPauseGuardian", "type": "address" }], + "name": "_setPauseGuardian", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract PriceOracle", "name": "newOracle", "type": "address" }], + "name": "_setPriceOracle", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "bool", "name": "state", "type": "bool" }], + "name": "_setSeizePaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "bool", "name": "state", "type": "bool" }], + "name": "_setTransferPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract CToken", "name": "cToken", "type": "address" }], + "name": "_supportMarket", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "name": "accountAssets", + "outputs": [{ "internalType": "contract CToken", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "admin", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "allMarkets", + "outputs": [{ "internalType": "contract CToken", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cToken", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "borrowAmount", "type": "uint256" } + ], + "name": "borrowAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "borrowCapGuardian", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "borrowCaps", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "borrowGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cToken", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "borrowAmount", "type": "uint256" } + ], + "name": "borrowVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "account", "type": "address" }, + { "internalType": "contract CToken", "name": "cToken", "type": "address" } + ], + "name": "checkMembership", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "holder", "type": "address" }, + { "internalType": "contract CToken[]", "name": "cTokens", "type": "address[]" } + ], + "name": "claimComp", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address[]", "name": "holders", "type": "address[]" }, + { "internalType": "contract CToken[]", "name": "cTokens", "type": "address[]" }, + { "internalType": "bool", "name": "borrowers", "type": "bool" }, + { "internalType": "bool", "name": "suppliers", "type": "bool" } + ], + "name": "claimComp", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "holder", "type": "address" }], + "name": "claimComp", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "closeFactorMantissa", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "compAccrued", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "compBorrowSpeeds", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "compBorrowState", + "outputs": [ + { "internalType": "uint224", "name": "index", "type": "uint224" }, + { "internalType": "uint32", "name": "block", "type": "uint32" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "name": "compBorrowerIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "compContributorSpeeds", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "compInitialIndex", + "outputs": [{ "internalType": "uint224", "name": "", "type": "uint224" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "compRate", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "compReceivable", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "compSpeeds", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "name": "compSupplierIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "compSupplySpeeds", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "compSupplyState", + "outputs": [ + { "internalType": "uint224", "name": "index", "type": "uint224" }, + { "internalType": "uint32", "name": "block", "type": "uint32" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "comptrollerImplementation", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address[]", "name": "cTokens", "type": "address[]" }], + "name": "enterMarkets", + "outputs": [{ "internalType": "uint256[]", "name": "", "type": "uint256[]" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "cTokenAddress", "type": "address" }], + "name": "exitMarket", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address[]", "name": "affectedUsers", "type": "address[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "name": "fixBadAccruals", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "getAccountLiquidity", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getAllMarkets", + "outputs": [{ "internalType": "contract CToken[]", "name": "", "type": "address[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "getAssetsIn", + "outputs": [{ "internalType": "contract CToken[]", "name": "", "type": "address[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getBlockNumber", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCompAddress", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "account", "type": "address" }, + { "internalType": "address", "name": "cTokenModify", "type": "address" }, + { "internalType": "uint256", "name": "redeemTokens", "type": "uint256" }, + { "internalType": "uint256", "name": "borrowAmount", "type": "uint256" } + ], + "name": "getHypotheticalAccountLiquidity", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isComptroller", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "contract CToken", "name": "cToken", "type": "address" }], + "name": "isDeprecated", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "lastContributorBlock", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cTokenBorrowed", "type": "address" }, + { "internalType": "address", "name": "cTokenCollateral", "type": "address" }, + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "repayAmount", "type": "uint256" } + ], + "name": "liquidateBorrowAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cTokenBorrowed", "type": "address" }, + { "internalType": "address", "name": "cTokenCollateral", "type": "address" }, + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "actualRepayAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "liquidateBorrowVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "cTokenBorrowed", "type": "address" }, + { "internalType": "address", "name": "cTokenCollateral", "type": "address" }, + { "internalType": "uint256", "name": "actualRepayAmount", "type": "uint256" } + ], + "name": "liquidateCalculateSeizeTokens", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "liquidationIncentiveMantissa", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "markets", + "outputs": [ + { "internalType": "bool", "name": "isListed", "type": "bool" }, + { "internalType": "uint256", "name": "collateralFactorMantissa", "type": "uint256" }, + { "internalType": "bool", "name": "isComped", "type": "bool" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "maxAssets", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cToken", "type": "address" }, + { "internalType": "address", "name": "minter", "type": "address" }, + { "internalType": "uint256", "name": "mintAmount", "type": "uint256" } + ], + "name": "mintAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "mintGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cToken", "type": "address" }, + { "internalType": "address", "name": "minter", "type": "address" }, + { "internalType": "uint256", "name": "actualMintAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "mintTokens", "type": "uint256" } + ], + "name": "mintVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "oracle", + "outputs": [{ "internalType": "contract PriceOracle", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "pauseGuardian", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "pendingAdmin", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "pendingComptrollerImplementation", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "proposal65FixExecuted", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cToken", "type": "address" }, + { "internalType": "address", "name": "redeemer", "type": "address" }, + { "internalType": "uint256", "name": "redeemTokens", "type": "uint256" } + ], + "name": "redeemAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cToken", "type": "address" }, + { "internalType": "address", "name": "redeemer", "type": "address" }, + { "internalType": "uint256", "name": "redeemAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "redeemTokens", "type": "uint256" } + ], + "name": "redeemVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cToken", "type": "address" }, + { "internalType": "address", "name": "payer", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "repayAmount", "type": "uint256" } + ], + "name": "repayBorrowAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cToken", "type": "address" }, + { "internalType": "address", "name": "payer", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "actualRepayAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "borrowerIndex", "type": "uint256" } + ], + "name": "repayBorrowVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cTokenCollateral", "type": "address" }, + { "internalType": "address", "name": "cTokenBorrowed", "type": "address" }, + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "seizeAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "seizeGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cTokenCollateral", "type": "address" }, + { "internalType": "address", "name": "cTokenBorrowed", "type": "address" }, + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "seizeVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cToken", "type": "address" }, + { "internalType": "address", "name": "src", "type": "address" }, + { "internalType": "address", "name": "dst", "type": "address" }, + { "internalType": "uint256", "name": "transferTokens", "type": "uint256" } + ], + "name": "transferAllowed", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "transferGuardianPaused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "cToken", "type": "address" }, + { "internalType": "address", "name": "src", "type": "address" }, + { "internalType": "address", "name": "dst", "type": "address" }, + { "internalType": "uint256", "name": "transferTokens", "type": "uint256" } + ], + "name": "transferVerify", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "contributor", "type": "address" }], + "name": "updateContributorRewards", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/web3-contracts/abis/QiAvax.json b/packages/web3-contracts/abis/QiAvax.json new file mode 100644 index 000000000000..316618eb915d --- /dev/null +++ b/packages/web3-contracts/abis/QiAvax.json @@ -0,0 +1,671 @@ +[ + { + "inputs": [ + { "internalType": "contract ComptrollerInterface", "name": "comptroller_", "type": "address" }, + { "internalType": "contract InterestRateModel", "name": "interestRateModel_", "type": "address" }, + { "internalType": "uint256", "name": "initialExchangeRateMantissa_", "type": "uint256" }, + { "internalType": "string", "name": "name_", "type": "string" }, + { "internalType": "string", "name": "symbol_", "type": "string" }, + { "internalType": "uint8", "name": "decimals_", "type": "uint8" }, + { "internalType": "address payable", "name": "admin_", "type": "address" } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "cashPrior", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "interestAccumulated", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "borrowIndex", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "totalBorrows", "type": "uint256" } + ], + "name": "AccrueInterest", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "borrowAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "accountBorrows", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "totalBorrows", "type": "uint256" } + ], + "name": "Borrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "error", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "info", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "detail", "type": "uint256" } + ], + "name": "Failure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "liquidator", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "repayAmount", "type": "uint256" }, + { "indexed": false, "internalType": "address", "name": "qiTokenCollateral", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "LiquidateBorrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "minter", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "mintAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "mintTokens", "type": "uint256" } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldAdmin", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newAdmin", "type": "address" } + ], + "name": "NewAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract ComptrollerInterface", + "name": "oldComptroller", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract ComptrollerInterface", + "name": "newComptroller", + "type": "address" + } + ], + "name": "NewComptroller", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract InterestRateModel", + "name": "oldInterestRateModel", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract InterestRateModel", + "name": "newInterestRateModel", + "type": "address" + } + ], + "name": "NewMarketInterestRateModel", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldPendingAdmin", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newPendingAdmin", "type": "address" } + ], + "name": "NewPendingAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "oldProtocolSeizeShareMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newProtocolSeizeShareMantissa", "type": "uint256" } + ], + "name": "NewProtocolSeizeShare", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "oldReserveFactorMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newReserveFactorMantissa", "type": "uint256" } + ], + "name": "NewReserveFactor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "redeemer", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "redeemAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "redeemTokens", "type": "uint256" } + ], + "name": "Redeem", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "payer", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "repayAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "accountBorrows", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "totalBorrows", "type": "uint256" } + ], + "name": "RepayBorrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "benefactor", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "addAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newTotalReserves", "type": "uint256" } + ], + "name": "ReservesAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "admin", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "reduceAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newTotalReserves", "type": "uint256" } + ], + "name": "ReservesReduced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "Transfer", + "type": "event" + }, + { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { + "constant": false, + "inputs": [], + "name": "_acceptAdmin", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "_addReserves", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "reduceAmount", "type": "uint256" }], + "name": "_reduceReserves", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract ComptrollerInterface", "name": "newComptroller", "type": "address" }], + "name": "_setComptroller", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract InterestRateModel", "name": "newInterestRateModel", "type": "address" }], + "name": "_setInterestRateModel", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address payable", "name": "newPendingAdmin", "type": "address" }], + "name": "_setPendingAdmin", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "newProtocolSeizeShareMantissa", "type": "uint256" }], + "name": "_setProtocolSeizeShare", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "newReserveFactorMantissa", "type": "uint256" }], + "name": "_setReserveFactor", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "accrualBlockTimestamp", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "accrueInterest", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "admin", + "outputs": [{ "internalType": "address payable", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "address", "name": "spender", "type": "address" } + ], + "name": "allowance", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "approve", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "name": "balanceOf", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "name": "balanceOfUnderlying", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "borrowAmount", "type": "uint256" }], + "name": "borrow", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "borrowBalanceCurrent", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "borrowBalanceStored", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "borrowIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "borrowRatePerTimestamp", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "comptroller", + "outputs": [{ "internalType": "contract ComptrollerInterface", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "exchangeRateCurrent", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "exchangeRateStored", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "getAccountSnapshot", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCash", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "contract ComptrollerInterface", "name": "comptroller_", "type": "address" }, + { "internalType": "contract InterestRateModel", "name": "interestRateModel_", "type": "address" }, + { "internalType": "uint256", "name": "initialExchangeRateMantissa_", "type": "uint256" }, + { "internalType": "string", "name": "name_", "type": "string" }, + { "internalType": "string", "name": "symbol_", "type": "string" }, + { "internalType": "uint8", "name": "decimals_", "type": "uint8" } + ], + "name": "initialize", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "interestRateModel", + "outputs": [{ "internalType": "contract InterestRateModel", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isQiToken", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "contract QiToken", "name": "qiTokenCollateral", "type": "address" } + ], + "name": "liquidateBorrow", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "mint", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "pendingAdmin", + "outputs": [{ "internalType": "address payable", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "protocolSeizeShareMantissa", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "redeemTokens", "type": "uint256" }], + "name": "redeem", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "redeemAmount", "type": "uint256" }], + "name": "redeemUnderlying", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "repayBorrow", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "borrower", "type": "address" }], + "name": "repayBorrowBehalf", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "reserveFactorMantissa", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "seize", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "supplyRatePerTimestamp", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalBorrows", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "totalBorrowsCurrent", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalReserves", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "dst", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "transfer", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "src", "type": "address" }, + { "internalType": "address", "name": "dst", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/web3-contracts/abis/QiERC20.json b/packages/web3-contracts/abis/QiERC20.json new file mode 100644 index 000000000000..ab344fe39f6c --- /dev/null +++ b/packages/web3-contracts/abis/QiERC20.json @@ -0,0 +1,729 @@ +[ + { + "inputs": [ + { "internalType": "address", "name": "underlying_", "type": "address" }, + { "internalType": "contract ComptrollerInterface", "name": "comptroller_", "type": "address" }, + { "internalType": "contract InterestRateModel", "name": "interestRateModel_", "type": "address" }, + { "internalType": "uint256", "name": "initialExchangeRateMantissa_", "type": "uint256" }, + { "internalType": "string", "name": "name_", "type": "string" }, + { "internalType": "string", "name": "symbol_", "type": "string" }, + { "internalType": "uint8", "name": "decimals_", "type": "uint8" }, + { "internalType": "address payable", "name": "admin_", "type": "address" }, + { "internalType": "address", "name": "implementation_", "type": "address" }, + { "internalType": "bytes", "name": "becomeImplementationData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "cashPrior", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "interestAccumulated", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "borrowIndex", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "totalBorrows", "type": "uint256" } + ], + "name": "AccrueInterest", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "borrowAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "accountBorrows", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "totalBorrows", "type": "uint256" } + ], + "name": "Borrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "error", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "info", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "detail", "type": "uint256" } + ], + "name": "Failure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "liquidator", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "repayAmount", "type": "uint256" }, + { "indexed": false, "internalType": "address", "name": "qiTokenCollateral", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "LiquidateBorrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "minter", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "mintAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "mintTokens", "type": "uint256" } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldAdmin", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newAdmin", "type": "address" } + ], + "name": "NewAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract ComptrollerInterface", + "name": "oldComptroller", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract ComptrollerInterface", + "name": "newComptroller", + "type": "address" + } + ], + "name": "NewComptroller", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldImplementation", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newImplementation", "type": "address" } + ], + "name": "NewImplementation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract InterestRateModel", + "name": "oldInterestRateModel", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract InterestRateModel", + "name": "newInterestRateModel", + "type": "address" + } + ], + "name": "NewMarketInterestRateModel", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldPendingAdmin", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newPendingAdmin", "type": "address" } + ], + "name": "NewPendingAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "oldProtocolSeizeShareMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newProtocolSeizeShareMantissa", "type": "uint256" } + ], + "name": "NewProtocolSeizeShare", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "oldReserveFactorMantissa", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newReserveFactorMantissa", "type": "uint256" } + ], + "name": "NewReserveFactor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "redeemer", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "redeemAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "redeemTokens", "type": "uint256" } + ], + "name": "Redeem", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "payer", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "borrower", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "repayAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "accountBorrows", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "totalBorrows", "type": "uint256" } + ], + "name": "RepayBorrow", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "benefactor", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "addAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newTotalReserves", "type": "uint256" } + ], + "name": "ReservesAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "admin", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "reduceAmount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newTotalReserves", "type": "uint256" } + ], + "name": "ReservesReduced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "Transfer", + "type": "event" + }, + { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { + "constant": false, + "inputs": [], + "name": "_acceptAdmin", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "addAmount", "type": "uint256" }], + "name": "_addReserves", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "reduceAmount", "type": "uint256" }], + "name": "_reduceReserves", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract ComptrollerInterface", "name": "newComptroller", "type": "address" }], + "name": "_setComptroller", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "implementation_", "type": "address" }, + { "internalType": "bool", "name": "allowResign", "type": "bool" }, + { "internalType": "bytes", "name": "becomeImplementationData", "type": "bytes" } + ], + "name": "_setImplementation", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract InterestRateModel", "name": "newInterestRateModel", "type": "address" }], + "name": "_setInterestRateModel", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address payable", "name": "newPendingAdmin", "type": "address" }], + "name": "_setPendingAdmin", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "newProtocolSeizeShareMantissa", "type": "uint256" }], + "name": "_setProtocolSeizeShare", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "newReserveFactorMantissa", "type": "uint256" }], + "name": "_setReserveFactor", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "accrualBlockTimestamp", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "accrueInterest", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "admin", + "outputs": [{ "internalType": "address payable", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "address", "name": "spender", "type": "address" } + ], + "name": "allowance", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "approve", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "name": "balanceOf", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "name": "balanceOfUnderlying", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "borrowAmount", "type": "uint256" }], + "name": "borrow", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "borrowBalanceCurrent", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "borrowBalanceStored", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "borrowIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "borrowRatePerTimestamp", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "comptroller", + "outputs": [{ "internalType": "contract ComptrollerInterface", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "bytes", "name": "data", "type": "bytes" }], + "name": "delegateToImplementation", + "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "data", "type": "bytes" }], + "name": "delegateToViewImplementation", + "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "exchangeRateCurrent", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "exchangeRateStored", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "getAccountSnapshot", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCash", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "implementation", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "interestRateModel", + "outputs": [{ "internalType": "contract InterestRateModel", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isQiToken", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "repayAmount", "type": "uint256" }, + { "internalType": "contract QiTokenInterface", "name": "qiTokenCollateral", "type": "address" } + ], + "name": "liquidateBorrow", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "mintAmount", "type": "uint256" }], + "name": "mint", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "pendingAdmin", + "outputs": [{ "internalType": "address payable", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "protocolSeizeShareMantissa", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "redeemTokens", "type": "uint256" }], + "name": "redeem", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "redeemAmount", "type": "uint256" }], + "name": "redeemUnderlying", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "uint256", "name": "repayAmount", "type": "uint256" }], + "name": "repayBorrow", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "repayAmount", "type": "uint256" } + ], + "name": "repayBorrowBehalf", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "reserveFactorMantissa", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "liquidator", "type": "address" }, + { "internalType": "address", "name": "borrower", "type": "address" }, + { "internalType": "uint256", "name": "seizeTokens", "type": "uint256" } + ], + "name": "seize", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "supplyRatePerTimestamp", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [{ "internalType": "contract EIP20NonStandardInterface", "name": "token", "type": "address" }], + "name": "sweepToken", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalBorrows", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "totalBorrowsCurrent", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalReserves", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "dst", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "transfer", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "src", "type": "address" }, + { "internalType": "address", "name": "dst", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "underlying", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/web3-contracts/abis/TranquilPriceOracleV2.json b/packages/web3-contracts/abis/TranquilPriceOracleV2.json new file mode 100644 index 000000000000..1dc0259c6d0f --- /dev/null +++ b/packages/web3-contracts/abis/TranquilPriceOracleV2.json @@ -0,0 +1,252 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "name": "OwnershipTransferred", + "type": "event", + "inputs": [ + { + "type": "address", + "name": "previousOwner", + "indexed": true, + "internalType": "address" + }, + { + "type": "address", + "internalType": "address", + "name": "newOwner", + "indexed": true + } + ], + "anonymous": false + }, + { + "inputs": [], + "name": "WONE_ADDRESS", + "outputs": [ + { + "type": "address", + "internalType": "address", + "name": "" + } + ], + "stateMutability": "view", + "type": "function", + "constant": true, + "signature": "0x6a255ac6" + }, + { + "name": "chainlinkOracle", + "stateMutability": "view", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "type": "address", + "name": "" + } + ], + "type": "function", + "inputs": [], + "constant": true, + "signature": "0xef06e72c" + }, + { + "type": "function", + "name": "fallbackOracle", + "outputs": [ + { + "name": "", + "internalType": "contract FallbackOracle", + "type": "address" + } + ], + "inputs": [], + "stateMutability": "view", + "constant": true, + "signature": "0x629838e5" + }, + { + "inputs": [], + "stateMutability": "view", + "name": "isPriceOracle", + "type": "function", + "outputs": [ + { + "name": "", + "internalType": "bool", + "type": "bool" + } + ], + "constant": true, + "signature": "0x66331bba" + }, + { + "stateMutability": "view", + "inputs": [], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "type": "function", + "name": "owner", + "constant": true, + "signature": "0x8da5cb5b" + }, + { + "type": "function", + "inputs": [], + "name": "renounceOwnership", + "stateMutability": "nonpayable", + "outputs": [] + }, + { + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "type": "function", + "name": "specialTokenOracles", + "outputs": [ + { + "type": "address", + "name": "", + "internalType": "contract ITokenOracle" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "name": "transferOwnership", + "outputs": [] + }, + { + "type": "function", + "inputs": [], + "outputs": [ + { + "type": "address", + "name": "", + "internalType": "contract UniswapOracle" + } + ], + "name": "uniswapOracle", + "stateMutability": "view", + "constant": true, + "signature": "0x120c6c5b" + }, + { + "stateMutability": "nonpayable", + "outputs": [], + "inputs": [ + { + "type": "address", + "name": "_token", + "internalType": "address" + }, + { + "type": "address", + "name": "_specialTokenOracle", + "internalType": "contract ITokenOracle" + } + ], + "name": "setSpecialTokenOracle", + "type": "function" + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "setChainlinkOracle", + "outputs": [], + "inputs": [ + { + "name": "_chainlinkOracle", + "type": "address", + "internalType": "contract ChainlinkOracle" + } + ] + }, + { + "type": "function", + "outputs": [], + "name": "setUniswapOracle", + "inputs": [ + { + "type": "address", + "name": "_uniswapOracle", + "internalType": "contract UniswapOracle" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setFallbackOracle", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_fallbackOracle", + "internalType": "contract FallbackOracle", + "type": "address" + } + ], + "outputs": [] + }, + { + "name": "getUnderlyingPrice", + "inputs": [ + { + "internalType": "contract TqToken", + "name": "tqToken", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "type": "function", + "stateMutability": "view" + }, + { + "stateMutability": "view", + "name": "getPrice", + "inputs": [ + { + "name": "token", + "internalType": "address", + "type": "address" + } + ], + "type": "function", + "outputs": [ + { + "type": "uint256", + "internalType": "uint256", + "name": "" + } + ], + "constant": true, + "signature": "0x41976e09" + } +] diff --git a/packages/web3-contracts/types/AlpacaVault.d.ts b/packages/web3-contracts/types/AlpacaVault.d.ts new file mode 100644 index 000000000000..588695e8dcca --- /dev/null +++ b/packages/web3-contracts/types/AlpacaVault.d.ts @@ -0,0 +1,265 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export type AddCollateral = ContractEventLog<{ + id: string + amount: string + healthBefore: string + healthAfter: string + 0: string + 1: string + 2: string + 3: string +}> +export type AddDebt = ContractEventLog<{ + id: string + debtShare: string + 0: string + 1: string +}> +export type Approval = ContractEventLog<{ + owner: string + spender: string + value: string + 0: string + 1: string + 2: string +}> +export type Kill = ContractEventLog<{ + id: string + killer: string + owner: string + posVal: string + debt: string + prize: string + left: string + 0: string + 1: string + 2: string + 3: string + 4: string + 5: string + 6: string +}> +export type OwnershipTransferred = ContractEventLog<{ + previousOwner: string + newOwner: string + 0: string + 1: string +}> +export type RemoveDebt = ContractEventLog<{ + id: string + debtShare: string + 0: string + 1: string +}> +export type Transfer = ContractEventLog<{ + from: string + to: string + value: string + 0: string + 1: string + 2: string +}> +export type Work = ContractEventLog<{ + id: string + loan: string + 0: string + 1: string +}> + +export interface AlpacaVault extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): AlpacaVault + clone(): AlpacaVault + methods: { + POSITION_ID(): NonPayableTransactionObject + + STRATEGY(): NonPayableTransactionObject + + _IN_EXEC_LOCK(): NonPayableTransactionObject + + addCollateral( + id: number | string | BN, + amount: number | string | BN, + goRogue: boolean, + data: string | number[], + ): PayableTransactionObject + + allowance(owner: string, spender: string): NonPayableTransactionObject + + approve(spender: string, amount: number | string | BN): NonPayableTransactionObject + + balanceOf(account: string): NonPayableTransactionObject + + config(): NonPayableTransactionObject + + debtShareToVal(debtShare: number | string | BN): NonPayableTransactionObject + + debtToken(): NonPayableTransactionObject + + debtValToShare(debtVal: number | string | BN): NonPayableTransactionObject + + decimals(): NonPayableTransactionObject + + decreaseAllowance(spender: string, subtractedValue: number | string | BN): NonPayableTransactionObject + + deposit(amountToken: number | string | BN): PayableTransactionObject + + fairLaunchPoolId(): NonPayableTransactionObject + + increaseAllowance(spender: string, addedValue: number | string | BN): NonPayableTransactionObject + + initialize( + _config: string, + _token: string, + _name: string, + _symbol: string, + _decimals: number | string | BN, + _debtToken: string, + ): NonPayableTransactionObject + + kill(id: number | string | BN): NonPayableTransactionObject + + lastAccrueTime(): NonPayableTransactionObject + + name(): NonPayableTransactionObject + + nextPositionID(): NonPayableTransactionObject + + owner(): NonPayableTransactionObject + + pendingInterest(value: number | string | BN): NonPayableTransactionObject + + positionInfo(id: number | string | BN): NonPayableTransactionObject<{ + 0: string + 1: string + }> + + positions(arg0: number | string | BN): NonPayableTransactionObject<{ + worker: string + owner: string + debtShare: string + 0: string + 1: string + 2: string + }> + + reduceReserve(value: number | string | BN): NonPayableTransactionObject + + renounceOwnership(): NonPayableTransactionObject + + requestFunds(targetedToken: string, amount: number | string | BN): NonPayableTransactionObject + + reservePool(): NonPayableTransactionObject + + setFairLaunchPoolId(_poolId: number | string | BN): NonPayableTransactionObject + + symbol(): NonPayableTransactionObject + + token(): NonPayableTransactionObject + + totalSupply(): NonPayableTransactionObject + + totalToken(): NonPayableTransactionObject + + transfer(recipient: string, amount: number | string | BN): NonPayableTransactionObject + + transferFrom( + sender: string, + recipient: string, + amount: number | string | BN, + ): NonPayableTransactionObject + + transferOwnership(newOwner: string): NonPayableTransactionObject + + updateConfig(_config: string): NonPayableTransactionObject + + vaultDebtShare(): NonPayableTransactionObject + + vaultDebtVal(): NonPayableTransactionObject + + withdraw(share: number | string | BN): NonPayableTransactionObject + + withdrawReserve(to: string, value: number | string | BN): NonPayableTransactionObject + + work( + id: number | string | BN, + worker: string, + principalAmount: number | string | BN, + borrowAmount: number | string | BN, + maxReturn: number | string | BN, + data: string | number[], + ): PayableTransactionObject + } + events: { + AddCollateral(cb?: Callback): EventEmitter + AddCollateral(options?: EventOptions, cb?: Callback): EventEmitter + + AddDebt(cb?: Callback): EventEmitter + AddDebt(options?: EventOptions, cb?: Callback): EventEmitter + + Approval(cb?: Callback): EventEmitter + Approval(options?: EventOptions, cb?: Callback): EventEmitter + + Kill(cb?: Callback): EventEmitter + Kill(options?: EventOptions, cb?: Callback): EventEmitter + + OwnershipTransferred(cb?: Callback): EventEmitter + OwnershipTransferred(options?: EventOptions, cb?: Callback): EventEmitter + + RemoveDebt(cb?: Callback): EventEmitter + RemoveDebt(options?: EventOptions, cb?: Callback): EventEmitter + + Transfer(cb?: Callback): EventEmitter + Transfer(options?: EventOptions, cb?: Callback): EventEmitter + + Work(cb?: Callback): EventEmitter + Work(options?: EventOptions, cb?: Callback): EventEmitter + + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } + + once(event: 'AddCollateral', cb: Callback): void + once(event: 'AddCollateral', options: EventOptions, cb: Callback): void + + once(event: 'AddDebt', cb: Callback): void + once(event: 'AddDebt', options: EventOptions, cb: Callback): void + + once(event: 'Approval', cb: Callback): void + once(event: 'Approval', options: EventOptions, cb: Callback): void + + once(event: 'Kill', cb: Callback): void + once(event: 'Kill', options: EventOptions, cb: Callback): void + + once(event: 'OwnershipTransferred', cb: Callback): void + once(event: 'OwnershipTransferred', options: EventOptions, cb: Callback): void + + once(event: 'RemoveDebt', cb: Callback): void + once(event: 'RemoveDebt', options: EventOptions, cb: Callback): void + + once(event: 'Transfer', cb: Callback): void + once(event: 'Transfer', options: EventOptions, cb: Callback): void + + once(event: 'Work', cb: Callback): void + once(event: 'Work', options: EventOptions, cb: Callback): void +} diff --git a/packages/web3-contracts/types/AlpacaVaultConfig.d.ts b/packages/web3-contracts/types/AlpacaVaultConfig.d.ts new file mode 100644 index 000000000000..e62ef53d98d0 --- /dev/null +++ b/packages/web3-contracts/types/AlpacaVaultConfig.d.ts @@ -0,0 +1,226 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export type OwnershipTransferred = ContractEventLog<{ + previousOwner: string + newOwner: string + 0: string + 1: string +}> +export type SetApprovedAddStrategy = ContractEventLog<{ + caller: string + addStrat: string + ok: boolean + 0: string + 1: string + 2: boolean +}> +export type SetMaxKillBps = ContractEventLog<{ + caller: string + maxKillBps: string + 0: string + 1: string +}> +export type SetParams = ContractEventLog<{ + caller: string + minDebtSize: string + reservePoolBps: string + killBps: string + interestModel: string + wrappedNative: string + wNativeRelayer: string + fairLaunch: string + killTreasuryBps: string + treasury: string + 0: string + 1: string + 2: string + 3: string + 4: string + 5: string + 6: string + 7: string + 8: string + 9: string +}> +export type SetWhitelistedCaller = ContractEventLog<{ + caller: string + addr: string + ok: boolean + 0: string + 1: string + 2: boolean +}> +export type SetWhitelistedLiquidator = ContractEventLog<{ + caller: string + addr: string + ok: boolean + 0: string + 1: string + 2: boolean +}> +export type SetWorkers = ContractEventLog<{ + caller: string + worker: string + workerConfig: string + 0: string + 1: string + 2: string +}> + +export interface AlpacaVaultConfig extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): AlpacaVaultConfig + clone(): AlpacaVaultConfig + methods: { + acceptDebt(worker: string): NonPayableTransactionObject + + approvedAddStrategies(arg0: string): NonPayableTransactionObject + + getFairLaunchAddr(): NonPayableTransactionObject + + getInterestRate(debt: number | string | BN, floating: number | string | BN): NonPayableTransactionObject + + getKillBps(): NonPayableTransactionObject + + getKillTreasuryBps(): NonPayableTransactionObject + + getReservePoolBps(): NonPayableTransactionObject + + getTreasuryAddr(): NonPayableTransactionObject + + getWNativeRelayer(): NonPayableTransactionObject + + getWrappedNativeAddr(): NonPayableTransactionObject + + initialize( + _minDebtSize: number | string | BN, + _reservePoolBps: number | string | BN, + _killBps: number | string | BN, + _interestModel: string, + _getWrappedNativeAddr: string, + _getWNativeRelayer: string, + _getFairLaunchAddr: string, + _getKillTreasuryBps: number | string | BN, + _treasury: string, + ): NonPayableTransactionObject + + interestModel(): NonPayableTransactionObject + + isWorker(worker: string): NonPayableTransactionObject + + isWorkerReserveConsistent(worker: string): NonPayableTransactionObject + + isWorkerStable(worker: string): NonPayableTransactionObject + + killFactor(worker: string, debt: number | string | BN): NonPayableTransactionObject + + maxKillBps(): NonPayableTransactionObject + + minDebtSize(): NonPayableTransactionObject + + owner(): NonPayableTransactionObject + + rawKillFactor(worker: string, debt: number | string | BN): NonPayableTransactionObject + + renounceOwnership(): NonPayableTransactionObject + + setApprovedAddStrategy(addStrats: string[], ok: boolean): NonPayableTransactionObject + + setMaxKillBps(_maxKillBps: number | string | BN): NonPayableTransactionObject + + setParams( + _minDebtSize: number | string | BN, + _reservePoolBps: number | string | BN, + _killBps: number | string | BN, + _interestModel: string, + _getWrappedNativeAddr: string, + _getWNativeRelayer: string, + _getFairLaunchAddr: string, + _getKillTreasuryBps: number | string | BN, + _treasury: string, + ): NonPayableTransactionObject + + setWhitelistedCallers(callers: string[], ok: boolean): NonPayableTransactionObject + + setWhitelistedLiquidators(callers: string[], ok: boolean): NonPayableTransactionObject + + setWorkers(addrs: string[], configs: string[]): NonPayableTransactionObject + + transferOwnership(newOwner: string): NonPayableTransactionObject + + treasury(): NonPayableTransactionObject + + whitelistedCallers(arg0: string): NonPayableTransactionObject + + whitelistedLiquidators(arg0: string): NonPayableTransactionObject + + workFactor(worker: string, debt: number | string | BN): NonPayableTransactionObject + + workers(arg0: string): NonPayableTransactionObject + } + events: { + OwnershipTransferred(cb?: Callback): EventEmitter + OwnershipTransferred(options?: EventOptions, cb?: Callback): EventEmitter + + SetApprovedAddStrategy(cb?: Callback): EventEmitter + SetApprovedAddStrategy(options?: EventOptions, cb?: Callback): EventEmitter + + SetMaxKillBps(cb?: Callback): EventEmitter + SetMaxKillBps(options?: EventOptions, cb?: Callback): EventEmitter + + SetParams(cb?: Callback): EventEmitter + SetParams(options?: EventOptions, cb?: Callback): EventEmitter + + SetWhitelistedCaller(cb?: Callback): EventEmitter + SetWhitelistedCaller(options?: EventOptions, cb?: Callback): EventEmitter + + SetWhitelistedLiquidator(cb?: Callback): EventEmitter + SetWhitelistedLiquidator(options?: EventOptions, cb?: Callback): EventEmitter + + SetWorkers(cb?: Callback): EventEmitter + SetWorkers(options?: EventOptions, cb?: Callback): EventEmitter + + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } + + once(event: 'OwnershipTransferred', cb: Callback): void + once(event: 'OwnershipTransferred', options: EventOptions, cb: Callback): void + + once(event: 'SetApprovedAddStrategy', cb: Callback): void + once(event: 'SetApprovedAddStrategy', options: EventOptions, cb: Callback): void + + once(event: 'SetMaxKillBps', cb: Callback): void + once(event: 'SetMaxKillBps', options: EventOptions, cb: Callback): void + + once(event: 'SetParams', cb: Callback): void + once(event: 'SetParams', options: EventOptions, cb: Callback): void + + once(event: 'SetWhitelistedCaller', cb: Callback): void + once(event: 'SetWhitelistedCaller', options: EventOptions, cb: Callback): void + + once(event: 'SetWhitelistedLiquidator', cb: Callback): void + once(event: 'SetWhitelistedLiquidator', options: EventOptions, cb: Callback): void + + once(event: 'SetWorkers', cb: Callback): void + once(event: 'SetWorkers', options: EventOptions, cb: Callback): void +} diff --git a/packages/web3-contracts/types/AuriLens.d.ts b/packages/web3-contracts/types/AuriLens.d.ts new file mode 100644 index 000000000000..99240c5ef658 --- /dev/null +++ b/packages/web3-contracts/types/AuriLens.d.ts @@ -0,0 +1,47 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export interface AuriLens extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): AuriLens + clone(): AuriLens + methods: { + auTokenUnderlyingPrice(auToken: string): NonPayableTransactionObject<[string, string]> + + getAddresses(comptroller: string): NonPayableTransactionObject<{ + ply: string + aurora: string + tokenLock: string + 0: string + 1: string + 2: string + }> + + getRewardSpeeds( + comptroller: string, + auToken: string, + ): NonPayableTransactionObject<[string, string, string, string]> + } + events: { + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } +} diff --git a/packages/web3-contracts/types/BenQiComptroller.d.ts b/packages/web3-contracts/types/BenQiComptroller.d.ts new file mode 100644 index 000000000000..e3ec60ae0713 --- /dev/null +++ b/packages/web3-contracts/types/BenQiComptroller.d.ts @@ -0,0 +1,549 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export type ActionPaused_string_bool = ContractEventLog<{ + action: string + pauseState: boolean + 0: string + 1: boolean +}> +export type ActionPaused_address_string_bool = ContractEventLog<{ + qiToken: string + action: string + pauseState: boolean + 0: string + 1: string + 2: boolean +}> +export type ContributorQiSpeedUpdated = ContractEventLog<{ + contributor: string + newSpeed: string + 0: string + 1: string +}> +export type DistributedBorrowerReward = ContractEventLog<{ + tokenType: string + qiToken: string + borrower: string + qiDelta: string + qiBorrowIndex: string + 0: string + 1: string + 2: string + 3: string + 4: string +}> +export type DistributedSupplierReward = ContractEventLog<{ + tokenType: string + qiToken: string + borrower: string + qiDelta: string + qiBorrowIndex: string + 0: string + 1: string + 2: string + 3: string + 4: string +}> +export type Failure = ContractEventLog<{ + error: string + info: string + detail: string + 0: string + 1: string + 2: string +}> +export type MarketEntered = ContractEventLog<{ + qiToken: string + account: string + 0: string + 1: string +}> +export type MarketExited = ContractEventLog<{ + qiToken: string + account: string + 0: string + 1: string +}> +export type MarketListed = ContractEventLog<{ + qiToken: string + 0: string +}> +export type NewBorrowCap = ContractEventLog<{ + qiToken: string + newBorrowCap: string + 0: string + 1: string +}> +export type NewBorrowCapGuardian = ContractEventLog<{ + oldBorrowCapGuardian: string + newBorrowCapGuardian: string + 0: string + 1: string +}> +export type NewCloseFactor = ContractEventLog<{ + oldCloseFactorMantissa: string + newCloseFactorMantissa: string + 0: string + 1: string +}> +export type NewCollateralFactor = ContractEventLog<{ + qiToken: string + oldCollateralFactorMantissa: string + newCollateralFactorMantissa: string + 0: string + 1: string + 2: string +}> +export type NewLiquidationIncentive = ContractEventLog<{ + oldLiquidationIncentiveMantissa: string + newLiquidationIncentiveMantissa: string + 0: string + 1: string +}> +export type NewPauseGuardian = ContractEventLog<{ + oldPauseGuardian: string + newPauseGuardian: string + 0: string + 1: string +}> +export type NewPriceOracle = ContractEventLog<{ + oldPriceOracle: string + newPriceOracle: string + 0: string + 1: string +}> +export type QiGranted = ContractEventLog<{ + recipient: string + amount: string + 0: string + 1: string +}> +export type SpeedUpdated = ContractEventLog<{ + tokenType: string + qiToken: string + newSpeed: string + 0: string + 1: string + 2: string +}> + +export interface BenQiComptroller extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): BenQiComptroller + clone(): BenQiComptroller + methods: { + _become(unitroller: string): NonPayableTransactionObject + + _borrowGuardianPaused(): NonPayableTransactionObject + + _grantQi(recipient: string, amount: number | string | BN): NonPayableTransactionObject + + _mintGuardianPaused(): NonPayableTransactionObject + + _setBorrowCapGuardian(newBorrowCapGuardian: string): NonPayableTransactionObject + + _setBorrowPaused(qiToken: string, state: boolean): NonPayableTransactionObject + + _setCloseFactor(newCloseFactorMantissa: number | string | BN): NonPayableTransactionObject + + _setCollateralFactor( + qiToken: string, + newCollateralFactorMantissa: number | string | BN, + ): NonPayableTransactionObject + + _setLiquidationIncentive( + newLiquidationIncentiveMantissa: number | string | BN, + ): NonPayableTransactionObject + + _setMarketBorrowCaps( + qiTokens: string[], + newBorrowCaps: (number | string | BN)[], + ): NonPayableTransactionObject + + _setMintPaused(qiToken: string, state: boolean): NonPayableTransactionObject + + _setPauseGuardian(newPauseGuardian: string): NonPayableTransactionObject + + _setPriceOracle(newOracle: string): NonPayableTransactionObject + + _setRewardSpeed( + rewardType: number | string | BN, + qiToken: string, + rewardSpeed: number | string | BN, + ): NonPayableTransactionObject + + _setSeizePaused(state: boolean): NonPayableTransactionObject + + _setTransferPaused(state: boolean): NonPayableTransactionObject + + _supportMarket(qiToken: string): NonPayableTransactionObject + + accountAssets(arg0: string, arg1: number | string | BN): NonPayableTransactionObject + + admin(): NonPayableTransactionObject + + allMarkets(arg0: number | string | BN): NonPayableTransactionObject + + borrowAllowed( + qiToken: string, + borrower: string, + borrowAmount: number | string | BN, + ): NonPayableTransactionObject + + borrowCapGuardian(): NonPayableTransactionObject + + borrowCaps(arg0: string): NonPayableTransactionObject + + borrowGuardianPaused(arg0: string): NonPayableTransactionObject + + borrowVerify( + qiToken: string, + borrower: string, + borrowAmount: number | string | BN, + ): NonPayableTransactionObject + + checkMembership(account: string, qiToken: string): NonPayableTransactionObject + + 'claimReward(uint8,address)'( + rewardType: number | string | BN, + holder: string, + ): NonPayableTransactionObject + + 'claimReward(uint8,address,address[])'( + rewardType: number | string | BN, + holder: string, + qiTokens: string[], + ): NonPayableTransactionObject + + 'claimReward(uint8,address[],address[],bool,bool)'( + rewardType: number | string | BN, + holders: string[], + qiTokens: string[], + borrowers: boolean, + suppliers: boolean, + ): PayableTransactionObject + + closeFactorMantissa(): NonPayableTransactionObject + + comptrollerImplementation(): NonPayableTransactionObject + + enterMarkets(qiTokens: string[]): NonPayableTransactionObject + + exitMarket(qiTokenAddress: string): NonPayableTransactionObject + + getAccountLiquidity(account: string): NonPayableTransactionObject<{ + 0: string + 1: string + 2: string + }> + + getAllMarkets(): NonPayableTransactionObject + + getAssetsIn(account: string): NonPayableTransactionObject + + getBlockTimestamp(): NonPayableTransactionObject + + getHypotheticalAccountLiquidity( + account: string, + qiTokenModify: string, + redeemTokens: number | string | BN, + borrowAmount: number | string | BN, + ): NonPayableTransactionObject<{ + 0: string + 1: string + 2: string + }> + + initialIndexConstant(): NonPayableTransactionObject + + isComptroller(): NonPayableTransactionObject + + liquidateBorrowAllowed( + qiTokenBorrowed: string, + qiTokenCollateral: string, + liquidator: string, + borrower: string, + repayAmount: number | string | BN, + ): NonPayableTransactionObject + + liquidateBorrowVerify( + qiTokenBorrowed: string, + qiTokenCollateral: string, + liquidator: string, + borrower: string, + actualRepayAmount: number | string | BN, + seizeTokens: number | string | BN, + ): NonPayableTransactionObject + + liquidateCalculateSeizeTokens( + qiTokenBorrowed: string, + qiTokenCollateral: string, + actualRepayAmount: number | string | BN, + ): NonPayableTransactionObject<{ + 0: string + 1: string + }> + + liquidationIncentiveMantissa(): NonPayableTransactionObject + + markets(arg0: string): NonPayableTransactionObject<{ + isListed: boolean + collateralFactorMantissa: string + isQied: boolean + 0: boolean + 1: string + 2: boolean + }> + + maxAssets(): NonPayableTransactionObject + + mintAllowed( + qiToken: string, + minter: string, + mintAmount: number | string | BN, + ): NonPayableTransactionObject + + mintGuardianPaused(arg0: string): NonPayableTransactionObject + + mintVerify( + qiToken: string, + minter: string, + actualMintAmount: number | string | BN, + mintTokens: number | string | BN, + ): NonPayableTransactionObject + + oracle(): NonPayableTransactionObject + + pauseGuardian(): NonPayableTransactionObject + + pendingAdmin(): NonPayableTransactionObject + + pendingComptrollerImplementation(): NonPayableTransactionObject + + qiAddress(): NonPayableTransactionObject + + redeemAllowed( + qiToken: string, + redeemer: string, + redeemTokens: number | string | BN, + ): NonPayableTransactionObject + + redeemVerify( + qiToken: string, + redeemer: string, + redeemAmount: number | string | BN, + redeemTokens: number | string | BN, + ): NonPayableTransactionObject + + repayBorrowAllowed( + qiToken: string, + payer: string, + borrower: string, + repayAmount: number | string | BN, + ): NonPayableTransactionObject + + repayBorrowVerify( + qiToken: string, + payer: string, + borrower: string, + actualRepayAmount: number | string | BN, + borrowerIndex: number | string | BN, + ): NonPayableTransactionObject + + rewardAccrued(arg0: number | string | BN, arg1: string): NonPayableTransactionObject + + rewardAvax(): NonPayableTransactionObject + + rewardBorrowState( + arg0: number | string | BN, + arg1: string, + ): NonPayableTransactionObject<{ + index: string + timestamp: string + 0: string + 1: string + }> + + rewardBorrowerIndex(arg0: number | string | BN, arg1: string, arg2: string): NonPayableTransactionObject + + rewardQi(): NonPayableTransactionObject + + supplyRewardSpeeds(arg0: number | string | BN, arg1: string): NonPayableTransactionObject + + rewardSupplierIndex(arg0: number | string | BN, arg1: string, arg2: string): NonPayableTransactionObject + + rewardSupplyState( + arg0: number | string | BN, + arg1: string, + ): NonPayableTransactionObject<{ + index: string + timestamp: string + 0: string + 1: string + }> + + seizeAllowed( + qiTokenCollateral: string, + qiTokenBorrowed: string, + liquidator: string, + borrower: string, + seizeTokens: number | string | BN, + ): NonPayableTransactionObject + + seizeGuardianPaused(): NonPayableTransactionObject + + seizeVerify( + qiTokenCollateral: string, + qiTokenBorrowed: string, + liquidator: string, + borrower: string, + seizeTokens: number | string | BN, + ): NonPayableTransactionObject + + setQiAddress(newQiAddress: string): NonPayableTransactionObject + + transferAllowed( + qiToken: string, + src: string, + dst: string, + transferTokens: number | string | BN, + ): NonPayableTransactionObject + + transferGuardianPaused(): NonPayableTransactionObject + + transferVerify( + qiToken: string, + src: string, + dst: string, + transferTokens: number | string | BN, + ): NonPayableTransactionObject + } + events: { + 'ActionPaused(string,bool)'(cb?: Callback): EventEmitter + 'ActionPaused(string,bool)'(options?: EventOptions, cb?: Callback): EventEmitter + + 'ActionPaused(address,string,bool)'(cb?: Callback): EventEmitter + 'ActionPaused(address,string,bool)'( + options?: EventOptions, + cb?: Callback, + ): EventEmitter + + ContributorQiSpeedUpdated(cb?: Callback): EventEmitter + ContributorQiSpeedUpdated(options?: EventOptions, cb?: Callback): EventEmitter + + DistributedBorrowerReward(cb?: Callback): EventEmitter + DistributedBorrowerReward(options?: EventOptions, cb?: Callback): EventEmitter + + DistributedSupplierReward(cb?: Callback): EventEmitter + DistributedSupplierReward(options?: EventOptions, cb?: Callback): EventEmitter + + Failure(cb?: Callback): EventEmitter + Failure(options?: EventOptions, cb?: Callback): EventEmitter + + MarketEntered(cb?: Callback): EventEmitter + MarketEntered(options?: EventOptions, cb?: Callback): EventEmitter + + MarketExited(cb?: Callback): EventEmitter + MarketExited(options?: EventOptions, cb?: Callback): EventEmitter + + MarketListed(cb?: Callback): EventEmitter + MarketListed(options?: EventOptions, cb?: Callback): EventEmitter + + NewBorrowCap(cb?: Callback): EventEmitter + NewBorrowCap(options?: EventOptions, cb?: Callback): EventEmitter + + NewBorrowCapGuardian(cb?: Callback): EventEmitter + NewBorrowCapGuardian(options?: EventOptions, cb?: Callback): EventEmitter + + NewCloseFactor(cb?: Callback): EventEmitter + NewCloseFactor(options?: EventOptions, cb?: Callback): EventEmitter + + NewCollateralFactor(cb?: Callback): EventEmitter + NewCollateralFactor(options?: EventOptions, cb?: Callback): EventEmitter + + NewLiquidationIncentive(cb?: Callback): EventEmitter + NewLiquidationIncentive(options?: EventOptions, cb?: Callback): EventEmitter + + NewPauseGuardian(cb?: Callback): EventEmitter + NewPauseGuardian(options?: EventOptions, cb?: Callback): EventEmitter + + NewPriceOracle(cb?: Callback): EventEmitter + NewPriceOracle(options?: EventOptions, cb?: Callback): EventEmitter + + QiGranted(cb?: Callback): EventEmitter + QiGranted(options?: EventOptions, cb?: Callback): EventEmitter + + SpeedUpdated(cb?: Callback): EventEmitter + SpeedUpdated(options?: EventOptions, cb?: Callback): EventEmitter + + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } + + once(event: 'ContributorQiSpeedUpdated', cb: Callback): void + once(event: 'ContributorQiSpeedUpdated', options: EventOptions, cb: Callback): void + + once(event: 'DistributedBorrowerReward', cb: Callback): void + once(event: 'DistributedBorrowerReward', options: EventOptions, cb: Callback): void + + once(event: 'DistributedSupplierReward', cb: Callback): void + once(event: 'DistributedSupplierReward', options: EventOptions, cb: Callback): void + + once(event: 'Failure', cb: Callback): void + once(event: 'Failure', options: EventOptions, cb: Callback): void + + once(event: 'MarketEntered', cb: Callback): void + once(event: 'MarketEntered', options: EventOptions, cb: Callback): void + + once(event: 'MarketExited', cb: Callback): void + once(event: 'MarketExited', options: EventOptions, cb: Callback): void + + once(event: 'MarketListed', cb: Callback): void + once(event: 'MarketListed', options: EventOptions, cb: Callback): void + + once(event: 'NewBorrowCap', cb: Callback): void + once(event: 'NewBorrowCap', options: EventOptions, cb: Callback): void + + once(event: 'NewBorrowCapGuardian', cb: Callback): void + once(event: 'NewBorrowCapGuardian', options: EventOptions, cb: Callback): void + + once(event: 'NewCloseFactor', cb: Callback): void + once(event: 'NewCloseFactor', options: EventOptions, cb: Callback): void + + once(event: 'NewCollateralFactor', cb: Callback): void + once(event: 'NewCollateralFactor', options: EventOptions, cb: Callback): void + + once(event: 'NewLiquidationIncentive', cb: Callback): void + once(event: 'NewLiquidationIncentive', options: EventOptions, cb: Callback): void + + once(event: 'NewPauseGuardian', cb: Callback): void + once(event: 'NewPauseGuardian', options: EventOptions, cb: Callback): void + + once(event: 'NewPriceOracle', cb: Callback): void + once(event: 'NewPriceOracle', options: EventOptions, cb: Callback): void + + once(event: 'QiGranted', cb: Callback): void + once(event: 'QiGranted', options: EventOptions, cb: Callback): void + + once(event: 'SpeedUpdated', cb: Callback): void + once(event: 'SpeedUpdated', options: EventOptions, cb: Callback): void +} diff --git a/packages/web3-contracts/types/BenqiChainlinkOracle.d.ts b/packages/web3-contracts/types/BenqiChainlinkOracle.d.ts new file mode 100644 index 000000000000..217dd84df95a --- /dev/null +++ b/packages/web3-contracts/types/BenqiChainlinkOracle.d.ts @@ -0,0 +1,93 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export type FeedSet = ContractEventLog<{ + feed: string + symbol: string + 0: string + 1: string +}> +export type NewAdmin = ContractEventLog<{ + oldAdmin: string + newAdmin: string + 0: string + 1: string +}> +export type PricePosted = ContractEventLog<{ + asset: string + previousPriceMantissa: string + requestedPriceMantissa: string + newPriceMantissa: string + 0: string + 1: string + 2: string + 3: string +}> + +export interface BenqiChainlinkOracle extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): BenqiChainlinkOracle + clone(): BenqiChainlinkOracle + methods: { + admin(): NonPayableTransactionObject + + assetPrices(asset: string): NonPayableTransactionObject + + getFeed(symbol: string): NonPayableTransactionObject + + getUnderlyingPrice(qiToken: string): NonPayableTransactionObject + + isPriceOracle(): NonPayableTransactionObject + + setAdmin(newAdmin: string): NonPayableTransactionObject + + setDirectPrice(asset: string, price: number | string | BN): NonPayableTransactionObject + + setFeed(symbol: string, feed: string): NonPayableTransactionObject + + setUnderlyingPrice( + qiToken: string, + underlyingPriceMantissa: number | string | BN, + ): NonPayableTransactionObject + } + events: { + FeedSet(cb?: Callback): EventEmitter + FeedSet(options?: EventOptions, cb?: Callback): EventEmitter + + NewAdmin(cb?: Callback): EventEmitter + NewAdmin(options?: EventOptions, cb?: Callback): EventEmitter + + PricePosted(cb?: Callback): EventEmitter + PricePosted(options?: EventOptions, cb?: Callback): EventEmitter + + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } + + once(event: 'FeedSet', cb: Callback): void + once(event: 'FeedSet', options: EventOptions, cb: Callback): void + + once(event: 'NewAdmin', cb: Callback): void + once(event: 'NewAdmin', options: EventOptions, cb: Callback): void + + once(event: 'PricePosted', cb: Callback): void + once(event: 'PricePosted', options: EventOptions, cb: Callback): void +} diff --git a/packages/web3-contracts/types/CERC20.d.ts b/packages/web3-contracts/types/CERC20.d.ts new file mode 100644 index 000000000000..411d2f0cdfdf --- /dev/null +++ b/packages/web3-contracts/types/CERC20.d.ts @@ -0,0 +1,391 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export type AccrueInterest = ContractEventLog<{ + cashPrior: string + interestAccumulated: string + borrowIndex: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string +}> +export type Approval = ContractEventLog<{ + owner: string + spender: string + amount: string + 0: string + 1: string + 2: string +}> +export type Borrow = ContractEventLog<{ + borrower: string + borrowAmount: string + accountBorrows: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string +}> +export type Failure = ContractEventLog<{ + error: string + info: string + detail: string + 0: string + 1: string + 2: string +}> +export type LiquidateBorrow = ContractEventLog<{ + liquidator: string + borrower: string + repayAmount: string + cTokenCollateral: string + seizeTokens: string + 0: string + 1: string + 2: string + 3: string + 4: string +}> +export type Mint = ContractEventLog<{ + minter: string + mintAmount: string + mintTokens: string + 0: string + 1: string + 2: string +}> +export type NewAdmin = ContractEventLog<{ + oldAdmin: string + newAdmin: string + 0: string + 1: string +}> +export type NewComptroller = ContractEventLog<{ + oldComptroller: string + newComptroller: string + 0: string + 1: string +}> +export type NewImplementation = ContractEventLog<{ + oldImplementation: string + newImplementation: string + 0: string + 1: string +}> +export type NewMarketInterestRateModel = ContractEventLog<{ + oldInterestRateModel: string + newInterestRateModel: string + 0: string + 1: string +}> +export type NewPendingAdmin = ContractEventLog<{ + oldPendingAdmin: string + newPendingAdmin: string + 0: string + 1: string +}> +export type NewReserveFactor = ContractEventLog<{ + oldReserveFactorMantissa: string + newReserveFactorMantissa: string + 0: string + 1: string +}> +export type Redeem = ContractEventLog<{ + redeemer: string + redeemAmount: string + redeemTokens: string + 0: string + 1: string + 2: string +}> +export type RepayBorrow = ContractEventLog<{ + payer: string + borrower: string + repayAmount: string + accountBorrows: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string + 4: string +}> +export type ReservesAdded = ContractEventLog<{ + benefactor: string + addAmount: string + newTotalReserves: string + 0: string + 1: string + 2: string +}> +export type ReservesReduced = ContractEventLog<{ + admin: string + reduceAmount: string + newTotalReserves: string + 0: string + 1: string + 2: string +}> +export type Transfer = ContractEventLog<{ + from: string + to: string + amount: string + 0: string + 1: string + 2: string +}> + +export interface CERC20 extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): CERC20 + clone(): CERC20 + methods: { + _acceptAdmin(): NonPayableTransactionObject + + _addReserves(addAmount: number | string | BN): NonPayableTransactionObject + + _reduceReserves(reduceAmount: number | string | BN): NonPayableTransactionObject + + _setComptroller(newComptroller: string): NonPayableTransactionObject + + _setImplementation( + implementation_: string, + allowResign: boolean, + becomeImplementationData: string | number[], + ): NonPayableTransactionObject + + _setInterestRateModel(newInterestRateModel: string): NonPayableTransactionObject + + _setPendingAdmin(newPendingAdmin: string): NonPayableTransactionObject + + _setReserveFactor(newReserveFactorMantissa: number | string | BN): NonPayableTransactionObject + + accrualBlockNumber(): NonPayableTransactionObject + + accrueInterest(): NonPayableTransactionObject + + admin(): NonPayableTransactionObject + + allowance(owner: string, spender: string): NonPayableTransactionObject + + approve(spender: string, amount: number | string | BN): NonPayableTransactionObject + + balanceOf(owner: string): NonPayableTransactionObject + + balanceOfUnderlying(owner: string): NonPayableTransactionObject + + borrow(borrowAmount: number | string | BN): NonPayableTransactionObject + + borrowBalanceCurrent(account: string): NonPayableTransactionObject + + borrowBalanceStored(account: string): NonPayableTransactionObject + + borrowIndex(): NonPayableTransactionObject + + borrowRatePerBlock(): NonPayableTransactionObject + + comptroller(): NonPayableTransactionObject + + decimals(): NonPayableTransactionObject + + delegateToImplementation(data: string | number[]): NonPayableTransactionObject + + delegateToViewImplementation(data: string | number[]): NonPayableTransactionObject + + exchangeRateCurrent(): NonPayableTransactionObject + + exchangeRateStored(): NonPayableTransactionObject + + getAccountSnapshot(account: string): NonPayableTransactionObject<{ + 0: string + 1: string + 2: string + 3: string + }> + + getCash(): NonPayableTransactionObject + + implementation(): NonPayableTransactionObject + + interestRateModel(): NonPayableTransactionObject + + isCToken(): NonPayableTransactionObject + + liquidateBorrow( + borrower: string, + repayAmount: number | string | BN, + cTokenCollateral: string, + ): NonPayableTransactionObject + + mint(mintAmount: number | string | BN): NonPayableTransactionObject + + name(): NonPayableTransactionObject + + pendingAdmin(): NonPayableTransactionObject + + protocolSeizeShareMantissa(): NonPayableTransactionObject + + redeem(redeemTokens: number | string | BN): NonPayableTransactionObject + + redeemUnderlying(redeemAmount: number | string | BN): NonPayableTransactionObject + + repayBorrow(repayAmount: number | string | BN): NonPayableTransactionObject + + repayBorrowBehalf(borrower: string, repayAmount: number | string | BN): NonPayableTransactionObject + + reserveFactorMantissa(): NonPayableTransactionObject + + seize( + liquidator: string, + borrower: string, + seizeTokens: number | string | BN, + ): NonPayableTransactionObject + + supplyRatePerBlock(): NonPayableTransactionObject + + sweepToken(token: string): NonPayableTransactionObject + + symbol(): NonPayableTransactionObject + + totalBorrows(): NonPayableTransactionObject + + totalBorrowsCurrent(): NonPayableTransactionObject + + totalReserves(): NonPayableTransactionObject + + totalSupply(): NonPayableTransactionObject + + transfer(dst: string, amount: number | string | BN): NonPayableTransactionObject + + transferFrom(src: string, dst: string, amount: number | string | BN): NonPayableTransactionObject + + underlying(): NonPayableTransactionObject + } + events: { + AccrueInterest(cb?: Callback): EventEmitter + AccrueInterest(options?: EventOptions, cb?: Callback): EventEmitter + + Approval(cb?: Callback): EventEmitter + Approval(options?: EventOptions, cb?: Callback): EventEmitter + + Borrow(cb?: Callback): EventEmitter + Borrow(options?: EventOptions, cb?: Callback): EventEmitter + + Failure(cb?: Callback): EventEmitter + Failure(options?: EventOptions, cb?: Callback): EventEmitter + + LiquidateBorrow(cb?: Callback): EventEmitter + LiquidateBorrow(options?: EventOptions, cb?: Callback): EventEmitter + + Mint(cb?: Callback): EventEmitter + Mint(options?: EventOptions, cb?: Callback): EventEmitter + + NewAdmin(cb?: Callback): EventEmitter + NewAdmin(options?: EventOptions, cb?: Callback): EventEmitter + + NewComptroller(cb?: Callback): EventEmitter + NewComptroller(options?: EventOptions, cb?: Callback): EventEmitter + + NewImplementation(cb?: Callback): EventEmitter + NewImplementation(options?: EventOptions, cb?: Callback): EventEmitter + + NewMarketInterestRateModel(cb?: Callback): EventEmitter + NewMarketInterestRateModel(options?: EventOptions, cb?: Callback): EventEmitter + + NewPendingAdmin(cb?: Callback): EventEmitter + NewPendingAdmin(options?: EventOptions, cb?: Callback): EventEmitter + + NewReserveFactor(cb?: Callback): EventEmitter + NewReserveFactor(options?: EventOptions, cb?: Callback): EventEmitter + + Redeem(cb?: Callback): EventEmitter + Redeem(options?: EventOptions, cb?: Callback): EventEmitter + + RepayBorrow(cb?: Callback): EventEmitter + RepayBorrow(options?: EventOptions, cb?: Callback): EventEmitter + + ReservesAdded(cb?: Callback): EventEmitter + ReservesAdded(options?: EventOptions, cb?: Callback): EventEmitter + + ReservesReduced(cb?: Callback): EventEmitter + ReservesReduced(options?: EventOptions, cb?: Callback): EventEmitter + + Transfer(cb?: Callback): EventEmitter + Transfer(options?: EventOptions, cb?: Callback): EventEmitter + + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } + + once(event: 'AccrueInterest', cb: Callback): void + once(event: 'AccrueInterest', options: EventOptions, cb: Callback): void + + once(event: 'Approval', cb: Callback): void + once(event: 'Approval', options: EventOptions, cb: Callback): void + + once(event: 'Borrow', cb: Callback): void + once(event: 'Borrow', options: EventOptions, cb: Callback): void + + once(event: 'Failure', cb: Callback): void + once(event: 'Failure', options: EventOptions, cb: Callback): void + + once(event: 'LiquidateBorrow', cb: Callback): void + once(event: 'LiquidateBorrow', options: EventOptions, cb: Callback): void + + once(event: 'Mint', cb: Callback): void + once(event: 'Mint', options: EventOptions, cb: Callback): void + + once(event: 'NewAdmin', cb: Callback): void + once(event: 'NewAdmin', options: EventOptions, cb: Callback): void + + once(event: 'NewComptroller', cb: Callback): void + once(event: 'NewComptroller', options: EventOptions, cb: Callback): void + + once(event: 'NewImplementation', cb: Callback): void + once(event: 'NewImplementation', options: EventOptions, cb: Callback): void + + once(event: 'NewMarketInterestRateModel', cb: Callback): void + once(event: 'NewMarketInterestRateModel', options: EventOptions, cb: Callback): void + + once(event: 'NewPendingAdmin', cb: Callback): void + once(event: 'NewPendingAdmin', options: EventOptions, cb: Callback): void + + once(event: 'NewReserveFactor', cb: Callback): void + once(event: 'NewReserveFactor', options: EventOptions, cb: Callback): void + + once(event: 'Redeem', cb: Callback): void + once(event: 'Redeem', options: EventOptions, cb: Callback): void + + once(event: 'RepayBorrow', cb: Callback): void + once(event: 'RepayBorrow', options: EventOptions, cb: Callback): void + + once(event: 'ReservesAdded', cb: Callback): void + once(event: 'ReservesAdded', options: EventOptions, cb: Callback): void + + once(event: 'ReservesReduced', cb: Callback): void + once(event: 'ReservesReduced', options: EventOptions, cb: Callback): void + + once(event: 'Transfer', cb: Callback): void + once(event: 'Transfer', options: EventOptions, cb: Callback): void +} diff --git a/packages/web3-contracts/types/CEther.d.ts b/packages/web3-contracts/types/CEther.d.ts new file mode 100644 index 000000000000..6404a52c8f3b --- /dev/null +++ b/packages/web3-contracts/types/CEther.d.ts @@ -0,0 +1,341 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export type AccrueInterest = ContractEventLog<{ + interestAccumulated: string + borrowIndex: string + totalBorrows: string + 0: string + 1: string + 2: string +}> +export type Mint = ContractEventLog<{ + minter: string + mintAmount: string + mintTokens: string + 0: string + 1: string + 2: string +}> +export type Redeem = ContractEventLog<{ + redeemer: string + redeemAmount: string + redeemTokens: string + 0: string + 1: string + 2: string +}> +export type Borrow = ContractEventLog<{ + borrower: string + borrowAmount: string + accountBorrows: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string +}> +export type RepayBorrow = ContractEventLog<{ + payer: string + borrower: string + repayAmount: string + accountBorrows: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string + 4: string +}> +export type LiquidateBorrow = ContractEventLog<{ + liquidator: string + borrower: string + repayAmount: string + cTokenCollateral: string + seizeTokens: string + 0: string + 1: string + 2: string + 3: string + 4: string +}> +export type NewPendingAdmin = ContractEventLog<{ + oldPendingAdmin: string + newPendingAdmin: string + 0: string + 1: string +}> +export type NewAdmin = ContractEventLog<{ + oldAdmin: string + newAdmin: string + 0: string + 1: string +}> +export type NewComptroller = ContractEventLog<{ + oldComptroller: string + newComptroller: string + 0: string + 1: string +}> +export type NewMarketInterestRateModel = ContractEventLog<{ + oldInterestRateModel: string + newInterestRateModel: string + 0: string + 1: string +}> +export type NewReserveFactor = ContractEventLog<{ + oldReserveFactorMantissa: string + newReserveFactorMantissa: string + 0: string + 1: string +}> +export type ReservesReduced = ContractEventLog<{ + admin: string + reduceAmount: string + newTotalReserves: string + 0: string + 1: string + 2: string +}> +export type Failure = ContractEventLog<{ + error: string + info: string + detail: string + 0: string + 1: string + 2: string +}> +export type Transfer = ContractEventLog<{ + from: string + to: string + amount: string + 0: string + 1: string + 2: string +}> +export type Approval = ContractEventLog<{ + owner: string + spender: string + amount: string + 0: string + 1: string + 2: string +}> + +export interface CEther extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): CEther + clone(): CEther + methods: { + name(): NonPayableTransactionObject + + approve(spender: string, amount: number | string | BN): NonPayableTransactionObject + + mint(): PayableTransactionObject + + reserveFactorMantissa(): NonPayableTransactionObject + + borrowBalanceCurrent(account: string): NonPayableTransactionObject + + totalSupply(): NonPayableTransactionObject + + exchangeRateStored(): NonPayableTransactionObject + + transferFrom(src: string, dst: string, amount: number | string | BN): NonPayableTransactionObject + + pendingAdmin(): NonPayableTransactionObject + + decimals(): NonPayableTransactionObject + + balanceOfUnderlying(owner: string): NonPayableTransactionObject + + getCash(): NonPayableTransactionObject + + _setComptroller(newComptroller: string): NonPayableTransactionObject + + totalBorrows(): NonPayableTransactionObject + + repayBorrow(): PayableTransactionObject + + comptroller(): NonPayableTransactionObject + + _reduceReserves(reduceAmount: number | string | BN): NonPayableTransactionObject + + initialExchangeRateMantissa(): NonPayableTransactionObject + + accrualBlockNumber(): NonPayableTransactionObject + + balanceOf(owner: string): NonPayableTransactionObject + + totalBorrowsCurrent(): NonPayableTransactionObject + + redeemUnderlying(redeemAmount: number | string | BN): NonPayableTransactionObject + + totalReserves(): NonPayableTransactionObject + + symbol(): NonPayableTransactionObject + + borrowBalanceStored(account: string): NonPayableTransactionObject + + accrueInterest(): NonPayableTransactionObject + + transfer(dst: string, amount: number | string | BN): NonPayableTransactionObject + + borrowIndex(): NonPayableTransactionObject + + liquidateBorrow(borrower: string, cTokenCollateral: string): PayableTransactionObject + + supplyRatePerBlock(): NonPayableTransactionObject + + seize( + liquidator: string, + borrower: string, + seizeTokens: number | string | BN, + ): NonPayableTransactionObject + + _setPendingAdmin(newPendingAdmin: string): NonPayableTransactionObject + + exchangeRateCurrent(): NonPayableTransactionObject + + getAccountSnapshot(account: string): NonPayableTransactionObject<{ + 0: string + 1: string + 2: string + 3: string + }> + + borrow(borrowAmount: number | string | BN): NonPayableTransactionObject + + redeem(redeemTokens: number | string | BN): NonPayableTransactionObject + + allowance(owner: string, spender: string): NonPayableTransactionObject + + repayBorrowBehalf(borrower: string): PayableTransactionObject + + _acceptAdmin(): NonPayableTransactionObject + + _setInterestRateModel(newInterestRateModel: string): NonPayableTransactionObject + + interestRateModel(): NonPayableTransactionObject + + admin(): NonPayableTransactionObject + + borrowRatePerBlock(): NonPayableTransactionObject + + _setReserveFactor(newReserveFactorMantissa: number | string | BN): NonPayableTransactionObject + + isCToken(): NonPayableTransactionObject + } + events: { + AccrueInterest(cb?: Callback): EventEmitter + AccrueInterest(options?: EventOptions, cb?: Callback): EventEmitter + + Mint(cb?: Callback): EventEmitter + Mint(options?: EventOptions, cb?: Callback): EventEmitter + + Redeem(cb?: Callback): EventEmitter + Redeem(options?: EventOptions, cb?: Callback): EventEmitter + + Borrow(cb?: Callback): EventEmitter + Borrow(options?: EventOptions, cb?: Callback): EventEmitter + + RepayBorrow(cb?: Callback): EventEmitter + RepayBorrow(options?: EventOptions, cb?: Callback): EventEmitter + + LiquidateBorrow(cb?: Callback): EventEmitter + LiquidateBorrow(options?: EventOptions, cb?: Callback): EventEmitter + + NewPendingAdmin(cb?: Callback): EventEmitter + NewPendingAdmin(options?: EventOptions, cb?: Callback): EventEmitter + + NewAdmin(cb?: Callback): EventEmitter + NewAdmin(options?: EventOptions, cb?: Callback): EventEmitter + + NewComptroller(cb?: Callback): EventEmitter + NewComptroller(options?: EventOptions, cb?: Callback): EventEmitter + + NewMarketInterestRateModel(cb?: Callback): EventEmitter + NewMarketInterestRateModel(options?: EventOptions, cb?: Callback): EventEmitter + + NewReserveFactor(cb?: Callback): EventEmitter + NewReserveFactor(options?: EventOptions, cb?: Callback): EventEmitter + + ReservesReduced(cb?: Callback): EventEmitter + ReservesReduced(options?: EventOptions, cb?: Callback): EventEmitter + + Failure(cb?: Callback): EventEmitter + Failure(options?: EventOptions, cb?: Callback): EventEmitter + + Transfer(cb?: Callback): EventEmitter + Transfer(options?: EventOptions, cb?: Callback): EventEmitter + + Approval(cb?: Callback): EventEmitter + Approval(options?: EventOptions, cb?: Callback): EventEmitter + + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } + + once(event: 'AccrueInterest', cb: Callback): void + once(event: 'AccrueInterest', options: EventOptions, cb: Callback): void + + once(event: 'Mint', cb: Callback): void + once(event: 'Mint', options: EventOptions, cb: Callback): void + + once(event: 'Redeem', cb: Callback): void + once(event: 'Redeem', options: EventOptions, cb: Callback): void + + once(event: 'Borrow', cb: Callback): void + once(event: 'Borrow', options: EventOptions, cb: Callback): void + + once(event: 'RepayBorrow', cb: Callback): void + once(event: 'RepayBorrow', options: EventOptions, cb: Callback): void + + once(event: 'LiquidateBorrow', cb: Callback): void + once(event: 'LiquidateBorrow', options: EventOptions, cb: Callback): void + + once(event: 'NewPendingAdmin', cb: Callback): void + once(event: 'NewPendingAdmin', options: EventOptions, cb: Callback): void + + once(event: 'NewAdmin', cb: Callback): void + once(event: 'NewAdmin', options: EventOptions, cb: Callback): void + + once(event: 'NewComptroller', cb: Callback): void + once(event: 'NewComptroller', options: EventOptions, cb: Callback): void + + once(event: 'NewMarketInterestRateModel', cb: Callback): void + once(event: 'NewMarketInterestRateModel', options: EventOptions, cb: Callback): void + + once(event: 'NewReserveFactor', cb: Callback): void + once(event: 'NewReserveFactor', options: EventOptions, cb: Callback): void + + once(event: 'ReservesReduced', cb: Callback): void + once(event: 'ReservesReduced', options: EventOptions, cb: Callback): void + + once(event: 'Failure', cb: Callback): void + once(event: 'Failure', options: EventOptions, cb: Callback): void + + once(event: 'Transfer', cb: Callback): void + once(event: 'Transfer', options: EventOptions, cb: Callback): void + + once(event: 'Approval', cb: Callback): void + once(event: 'Approval', options: EventOptions, cb: Callback): void +} diff --git a/packages/web3-contracts/types/Comptroller.d.ts b/packages/web3-contracts/types/Comptroller.d.ts new file mode 100644 index 000000000000..b5cb2f2f548d --- /dev/null +++ b/packages/web3-contracts/types/Comptroller.d.ts @@ -0,0 +1,588 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export type ActionPaused_string_bool = ContractEventLog<{ + action: string + pauseState: boolean + 0: string + 1: boolean +}> +export type ActionPaused_address_string_bool = ContractEventLog<{ + cToken: string + action: string + pauseState: boolean + 0: string + 1: string + 2: boolean +}> +export type CompAccruedAdjusted = ContractEventLog<{ + user: string + oldCompAccrued: string + newCompAccrued: string + 0: string + 1: string + 2: string +}> +export type CompBorrowSpeedUpdated = ContractEventLog<{ + cToken: string + newSpeed: string + 0: string + 1: string +}> +export type CompGranted = ContractEventLog<{ + recipient: string + amount: string + 0: string + 1: string +}> +export type CompReceivableUpdated = ContractEventLog<{ + user: string + oldCompReceivable: string + newCompReceivable: string + 0: string + 1: string + 2: string +}> +export type CompSupplySpeedUpdated = ContractEventLog<{ + cToken: string + newSpeed: string + 0: string + 1: string +}> +export type ContributorCompSpeedUpdated = ContractEventLog<{ + contributor: string + newSpeed: string + 0: string + 1: string +}> +export type DistributedBorrowerComp = ContractEventLog<{ + cToken: string + borrower: string + compDelta: string + compBorrowIndex: string + 0: string + 1: string + 2: string + 3: string +}> +export type DistributedSupplierComp = ContractEventLog<{ + cToken: string + supplier: string + compDelta: string + compSupplyIndex: string + 0: string + 1: string + 2: string + 3: string +}> +export type Failure = ContractEventLog<{ + error: string + info: string + detail: string + 0: string + 1: string + 2: string +}> +export type MarketEntered = ContractEventLog<{ + cToken: string + account: string + 0: string + 1: string +}> +export type MarketExited = ContractEventLog<{ + cToken: string + account: string + 0: string + 1: string +}> +export type MarketListed = ContractEventLog<{ + cToken: string + 0: string +}> +export type NewBorrowCap = ContractEventLog<{ + cToken: string + newBorrowCap: string + 0: string + 1: string +}> +export type NewBorrowCapGuardian = ContractEventLog<{ + oldBorrowCapGuardian: string + newBorrowCapGuardian: string + 0: string + 1: string +}> +export type NewCloseFactor = ContractEventLog<{ + oldCloseFactorMantissa: string + newCloseFactorMantissa: string + 0: string + 1: string +}> +export type NewCollateralFactor = ContractEventLog<{ + cToken: string + oldCollateralFactorMantissa: string + newCollateralFactorMantissa: string + 0: string + 1: string + 2: string +}> +export type NewLiquidationIncentive = ContractEventLog<{ + oldLiquidationIncentiveMantissa: string + newLiquidationIncentiveMantissa: string + 0: string + 1: string +}> +export type NewPauseGuardian = ContractEventLog<{ + oldPauseGuardian: string + newPauseGuardian: string + 0: string + 1: string +}> +export type NewPriceOracle = ContractEventLog<{ + oldPriceOracle: string + newPriceOracle: string + 0: string + 1: string +}> + +export interface Comptroller extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): Comptroller + clone(): Comptroller + methods: { + _become(unitroller: string): NonPayableTransactionObject + + _borrowGuardianPaused(): NonPayableTransactionObject + + _grantComp(recipient: string, amount: number | string | BN): NonPayableTransactionObject + + _mintGuardianPaused(): NonPayableTransactionObject + + _setBorrowCapGuardian(newBorrowCapGuardian: string): NonPayableTransactionObject + + _setBorrowPaused(cToken: string, state: boolean): NonPayableTransactionObject + + _setCloseFactor(newCloseFactorMantissa: number | string | BN): NonPayableTransactionObject + + _setCollateralFactor( + cToken: string, + newCollateralFactorMantissa: number | string | BN, + ): NonPayableTransactionObject + + _setCompSpeeds( + cTokens: string[], + supplySpeeds: (number | string | BN)[], + borrowSpeeds: (number | string | BN)[], + ): NonPayableTransactionObject + + _setContributorCompSpeed( + contributor: string, + compSpeed: number | string | BN, + ): NonPayableTransactionObject + + _setLiquidationIncentive( + newLiquidationIncentiveMantissa: number | string | BN, + ): NonPayableTransactionObject + + _setMarketBorrowCaps( + cTokens: string[], + newBorrowCaps: (number | string | BN)[], + ): NonPayableTransactionObject + + _setMintPaused(cToken: string, state: boolean): NonPayableTransactionObject + + _setPauseGuardian(newPauseGuardian: string): NonPayableTransactionObject + + _setPriceOracle(newOracle: string): NonPayableTransactionObject + + _setSeizePaused(state: boolean): NonPayableTransactionObject + + _setTransferPaused(state: boolean): NonPayableTransactionObject + + _supportMarket(cToken: string): NonPayableTransactionObject + + accountAssets(arg0: string, arg1: number | string | BN): NonPayableTransactionObject + + admin(): NonPayableTransactionObject + + allMarkets(arg0: number | string | BN): NonPayableTransactionObject + + borrowAllowed( + cToken: string, + borrower: string, + borrowAmount: number | string | BN, + ): NonPayableTransactionObject + + borrowCapGuardian(): NonPayableTransactionObject + + borrowCaps(arg0: string): NonPayableTransactionObject + + borrowGuardianPaused(arg0: string): NonPayableTransactionObject + + borrowVerify( + cToken: string, + borrower: string, + borrowAmount: number | string | BN, + ): NonPayableTransactionObject + + checkMembership(account: string, cToken: string): NonPayableTransactionObject + + 'claimComp(address,address[])'(holder: string, cTokens: string[]): NonPayableTransactionObject + + 'claimComp(address[],address[],bool,bool)'( + holders: string[], + cTokens: string[], + borrowers: boolean, + suppliers: boolean, + ): NonPayableTransactionObject + + 'claimComp(address)'(holder: string): NonPayableTransactionObject + + closeFactorMantissa(): NonPayableTransactionObject + + compAccrued(arg0: string): NonPayableTransactionObject + + compBorrowSpeeds(arg0: string): NonPayableTransactionObject + + compBorrowState(arg0: string): NonPayableTransactionObject<{ + index: string + block: string + 0: string + 1: string + }> + + compBorrowerIndex(arg0: string, arg1: string): NonPayableTransactionObject + + compContributorSpeeds(arg0: string): NonPayableTransactionObject + + compInitialIndex(): NonPayableTransactionObject + + compRate(): NonPayableTransactionObject + + compReceivable(arg0: string): NonPayableTransactionObject + + compSpeeds(arg0: string): NonPayableTransactionObject + + compSupplierIndex(arg0: string, arg1: string): NonPayableTransactionObject + + compSupplySpeeds(arg0: string): NonPayableTransactionObject + + compSupplyState(arg0: string): NonPayableTransactionObject<{ + index: string + block: string + 0: string + 1: string + }> + + comptrollerImplementation(): NonPayableTransactionObject + + enterMarkets(cTokens: string[]): NonPayableTransactionObject + + exitMarket(cTokenAddress: string): NonPayableTransactionObject + + fixBadAccruals(affectedUsers: string[], amounts: (number | string | BN)[]): NonPayableTransactionObject + + getAccountLiquidity(account: string): NonPayableTransactionObject<{ + 0: string + 1: string + 2: string + }> + + getAllMarkets(): NonPayableTransactionObject + + getAssetsIn(account: string): NonPayableTransactionObject + + getBlockNumber(): NonPayableTransactionObject + + getCompAddress(): NonPayableTransactionObject + + getHypotheticalAccountLiquidity( + account: string, + cTokenModify: string, + redeemTokens: number | string | BN, + borrowAmount: number | string | BN, + ): NonPayableTransactionObject<{ + 0: string + 1: string + 2: string + }> + + isComptroller(): NonPayableTransactionObject + + isDeprecated(cToken: string): NonPayableTransactionObject + + lastContributorBlock(arg0: string): NonPayableTransactionObject + + liquidateBorrowAllowed( + cTokenBorrowed: string, + cTokenCollateral: string, + liquidator: string, + borrower: string, + repayAmount: number | string | BN, + ): NonPayableTransactionObject + + liquidateBorrowVerify( + cTokenBorrowed: string, + cTokenCollateral: string, + liquidator: string, + borrower: string, + actualRepayAmount: number | string | BN, + seizeTokens: number | string | BN, + ): NonPayableTransactionObject + + liquidateCalculateSeizeTokens( + cTokenBorrowed: string, + cTokenCollateral: string, + actualRepayAmount: number | string | BN, + ): NonPayableTransactionObject<{ + 0: string + 1: string + }> + + liquidationIncentiveMantissa(): NonPayableTransactionObject + + markets(arg0: string): NonPayableTransactionObject<{ + isListed: boolean + collateralFactorMantissa: string + isComped: boolean + 0: boolean + 1: string + 2: boolean + }> + + maxAssets(): NonPayableTransactionObject + + mintAllowed( + cToken: string, + minter: string, + mintAmount: number | string | BN, + ): NonPayableTransactionObject + + mintGuardianPaused(arg0: string): NonPayableTransactionObject + + mintVerify( + cToken: string, + minter: string, + actualMintAmount: number | string | BN, + mintTokens: number | string | BN, + ): NonPayableTransactionObject + + oracle(): NonPayableTransactionObject + + pauseGuardian(): NonPayableTransactionObject + + pendingAdmin(): NonPayableTransactionObject + + pendingComptrollerImplementation(): NonPayableTransactionObject + + proposal65FixExecuted(): NonPayableTransactionObject + + redeemAllowed( + cToken: string, + redeemer: string, + redeemTokens: number | string | BN, + ): NonPayableTransactionObject + + redeemVerify( + cToken: string, + redeemer: string, + redeemAmount: number | string | BN, + redeemTokens: number | string | BN, + ): NonPayableTransactionObject + + repayBorrowAllowed( + cToken: string, + payer: string, + borrower: string, + repayAmount: number | string | BN, + ): NonPayableTransactionObject + + repayBorrowVerify( + cToken: string, + payer: string, + borrower: string, + actualRepayAmount: number | string | BN, + borrowerIndex: number | string | BN, + ): NonPayableTransactionObject + + seizeAllowed( + cTokenCollateral: string, + cTokenBorrowed: string, + liquidator: string, + borrower: string, + seizeTokens: number | string | BN, + ): NonPayableTransactionObject + + seizeGuardianPaused(): NonPayableTransactionObject + + seizeVerify( + cTokenCollateral: string, + cTokenBorrowed: string, + liquidator: string, + borrower: string, + seizeTokens: number | string | BN, + ): NonPayableTransactionObject + + transferAllowed( + cToken: string, + src: string, + dst: string, + transferTokens: number | string | BN, + ): NonPayableTransactionObject + + transferGuardianPaused(): NonPayableTransactionObject + + transferVerify( + cToken: string, + src: string, + dst: string, + transferTokens: number | string | BN, + ): NonPayableTransactionObject + + updateContributorRewards(contributor: string): NonPayableTransactionObject + } + events: { + 'ActionPaused(string,bool)'(cb?: Callback): EventEmitter + 'ActionPaused(string,bool)'(options?: EventOptions, cb?: Callback): EventEmitter + + 'ActionPaused(address,string,bool)'(cb?: Callback): EventEmitter + 'ActionPaused(address,string,bool)'( + options?: EventOptions, + cb?: Callback, + ): EventEmitter + + CompAccruedAdjusted(cb?: Callback): EventEmitter + CompAccruedAdjusted(options?: EventOptions, cb?: Callback): EventEmitter + + CompBorrowSpeedUpdated(cb?: Callback): EventEmitter + CompBorrowSpeedUpdated(options?: EventOptions, cb?: Callback): EventEmitter + + CompGranted(cb?: Callback): EventEmitter + CompGranted(options?: EventOptions, cb?: Callback): EventEmitter + + CompReceivableUpdated(cb?: Callback): EventEmitter + CompReceivableUpdated(options?: EventOptions, cb?: Callback): EventEmitter + + CompSupplySpeedUpdated(cb?: Callback): EventEmitter + CompSupplySpeedUpdated(options?: EventOptions, cb?: Callback): EventEmitter + + ContributorCompSpeedUpdated(cb?: Callback): EventEmitter + ContributorCompSpeedUpdated(options?: EventOptions, cb?: Callback): EventEmitter + + DistributedBorrowerComp(cb?: Callback): EventEmitter + DistributedBorrowerComp(options?: EventOptions, cb?: Callback): EventEmitter + + DistributedSupplierComp(cb?: Callback): EventEmitter + DistributedSupplierComp(options?: EventOptions, cb?: Callback): EventEmitter + + Failure(cb?: Callback): EventEmitter + Failure(options?: EventOptions, cb?: Callback): EventEmitter + + MarketEntered(cb?: Callback): EventEmitter + MarketEntered(options?: EventOptions, cb?: Callback): EventEmitter + + MarketExited(cb?: Callback): EventEmitter + MarketExited(options?: EventOptions, cb?: Callback): EventEmitter + + MarketListed(cb?: Callback): EventEmitter + MarketListed(options?: EventOptions, cb?: Callback): EventEmitter + + NewBorrowCap(cb?: Callback): EventEmitter + NewBorrowCap(options?: EventOptions, cb?: Callback): EventEmitter + + NewBorrowCapGuardian(cb?: Callback): EventEmitter + NewBorrowCapGuardian(options?: EventOptions, cb?: Callback): EventEmitter + + NewCloseFactor(cb?: Callback): EventEmitter + NewCloseFactor(options?: EventOptions, cb?: Callback): EventEmitter + + NewCollateralFactor(cb?: Callback): EventEmitter + NewCollateralFactor(options?: EventOptions, cb?: Callback): EventEmitter + + NewLiquidationIncentive(cb?: Callback): EventEmitter + NewLiquidationIncentive(options?: EventOptions, cb?: Callback): EventEmitter + + NewPauseGuardian(cb?: Callback): EventEmitter + NewPauseGuardian(options?: EventOptions, cb?: Callback): EventEmitter + + NewPriceOracle(cb?: Callback): EventEmitter + NewPriceOracle(options?: EventOptions, cb?: Callback): EventEmitter + + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } + + once(event: 'CompAccruedAdjusted', cb: Callback): void + once(event: 'CompAccruedAdjusted', options: EventOptions, cb: Callback): void + + once(event: 'CompBorrowSpeedUpdated', cb: Callback): void + once(event: 'CompBorrowSpeedUpdated', options: EventOptions, cb: Callback): void + + once(event: 'CompGranted', cb: Callback): void + once(event: 'CompGranted', options: EventOptions, cb: Callback): void + + once(event: 'CompReceivableUpdated', cb: Callback): void + once(event: 'CompReceivableUpdated', options: EventOptions, cb: Callback): void + + once(event: 'CompSupplySpeedUpdated', cb: Callback): void + once(event: 'CompSupplySpeedUpdated', options: EventOptions, cb: Callback): void + + once(event: 'ContributorCompSpeedUpdated', cb: Callback): void + once(event: 'ContributorCompSpeedUpdated', options: EventOptions, cb: Callback): void + + once(event: 'DistributedBorrowerComp', cb: Callback): void + once(event: 'DistributedBorrowerComp', options: EventOptions, cb: Callback): void + + once(event: 'DistributedSupplierComp', cb: Callback): void + once(event: 'DistributedSupplierComp', options: EventOptions, cb: Callback): void + + once(event: 'Failure', cb: Callback): void + once(event: 'Failure', options: EventOptions, cb: Callback): void + + once(event: 'MarketEntered', cb: Callback): void + once(event: 'MarketEntered', options: EventOptions, cb: Callback): void + + once(event: 'MarketExited', cb: Callback): void + once(event: 'MarketExited', options: EventOptions, cb: Callback): void + + once(event: 'MarketListed', cb: Callback): void + once(event: 'MarketListed', options: EventOptions, cb: Callback): void + + once(event: 'NewBorrowCap', cb: Callback): void + once(event: 'NewBorrowCap', options: EventOptions, cb: Callback): void + + once(event: 'NewBorrowCapGuardian', cb: Callback): void + once(event: 'NewBorrowCapGuardian', options: EventOptions, cb: Callback): void + + once(event: 'NewCloseFactor', cb: Callback): void + once(event: 'NewCloseFactor', options: EventOptions, cb: Callback): void + + once(event: 'NewCollateralFactor', cb: Callback): void + once(event: 'NewCollateralFactor', options: EventOptions, cb: Callback): void + + once(event: 'NewLiquidationIncentive', cb: Callback): void + once(event: 'NewLiquidationIncentive', options: EventOptions, cb: Callback): void + + once(event: 'NewPauseGuardian', cb: Callback): void + once(event: 'NewPauseGuardian', options: EventOptions, cb: Callback): void + + once(event: 'NewPriceOracle', cb: Callback): void + once(event: 'NewPriceOracle', options: EventOptions, cb: Callback): void +} diff --git a/packages/web3-contracts/types/QiAvax.d.ts b/packages/web3-contracts/types/QiAvax.d.ts new file mode 100644 index 000000000000..bdd7d6d4aedc --- /dev/null +++ b/packages/web3-contracts/types/QiAvax.d.ts @@ -0,0 +1,382 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export type AccrueInterest = ContractEventLog<{ + cashPrior: string + interestAccumulated: string + borrowIndex: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string +}> +export type Approval = ContractEventLog<{ + owner: string + spender: string + amount: string + 0: string + 1: string + 2: string +}> +export type Borrow = ContractEventLog<{ + borrower: string + borrowAmount: string + accountBorrows: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string +}> +export type Failure = ContractEventLog<{ + error: string + info: string + detail: string + 0: string + 1: string + 2: string +}> +export type LiquidateBorrow = ContractEventLog<{ + liquidator: string + borrower: string + repayAmount: string + qiTokenCollateral: string + seizeTokens: string + 0: string + 1: string + 2: string + 3: string + 4: string +}> +export type Mint = ContractEventLog<{ + minter: string + mintAmount: string + mintTokens: string + 0: string + 1: string + 2: string +}> +export type NewAdmin = ContractEventLog<{ + oldAdmin: string + newAdmin: string + 0: string + 1: string +}> +export type NewComptroller = ContractEventLog<{ + oldComptroller: string + newComptroller: string + 0: string + 1: string +}> +export type NewMarketInterestRateModel = ContractEventLog<{ + oldInterestRateModel: string + newInterestRateModel: string + 0: string + 1: string +}> +export type NewPendingAdmin = ContractEventLog<{ + oldPendingAdmin: string + newPendingAdmin: string + 0: string + 1: string +}> +export type NewProtocolSeizeShare = ContractEventLog<{ + oldProtocolSeizeShareMantissa: string + newProtocolSeizeShareMantissa: string + 0: string + 1: string +}> +export type NewReserveFactor = ContractEventLog<{ + oldReserveFactorMantissa: string + newReserveFactorMantissa: string + 0: string + 1: string +}> +export type Redeem = ContractEventLog<{ + redeemer: string + redeemAmount: string + redeemTokens: string + 0: string + 1: string + 2: string +}> +export type RepayBorrow = ContractEventLog<{ + payer: string + borrower: string + repayAmount: string + accountBorrows: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string + 4: string +}> +export type ReservesAdded = ContractEventLog<{ + benefactor: string + addAmount: string + newTotalReserves: string + 0: string + 1: string + 2: string +}> +export type ReservesReduced = ContractEventLog<{ + admin: string + reduceAmount: string + newTotalReserves: string + 0: string + 1: string + 2: string +}> +export type Transfer = ContractEventLog<{ + from: string + to: string + amount: string + 0: string + 1: string + 2: string +}> + +export interface QiAvax extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): QiAvax + clone(): QiAvax + methods: { + _acceptAdmin(): NonPayableTransactionObject + + _addReserves(): PayableTransactionObject + + _reduceReserves(reduceAmount: number | string | BN): NonPayableTransactionObject + + _setComptroller(newComptroller: string): NonPayableTransactionObject + + _setInterestRateModel(newInterestRateModel: string): NonPayableTransactionObject + + _setPendingAdmin(newPendingAdmin: string): NonPayableTransactionObject + + _setProtocolSeizeShare(newProtocolSeizeShareMantissa: number | string | BN): NonPayableTransactionObject + + _setReserveFactor(newReserveFactorMantissa: number | string | BN): NonPayableTransactionObject + + accrualBlockTimestamp(): NonPayableTransactionObject + + accrueInterest(): NonPayableTransactionObject + + admin(): NonPayableTransactionObject + + allowance(owner: string, spender: string): NonPayableTransactionObject + + approve(spender: string, amount: number | string | BN): NonPayableTransactionObject + + balanceOf(owner: string): NonPayableTransactionObject + + balanceOfUnderlying(owner: string): NonPayableTransactionObject + + borrow(borrowAmount: number | string | BN): NonPayableTransactionObject + + borrowBalanceCurrent(account: string): NonPayableTransactionObject + + borrowBalanceStored(account: string): NonPayableTransactionObject + + borrowIndex(): NonPayableTransactionObject + + borrowRatePerTimestamp(): NonPayableTransactionObject + + comptroller(): NonPayableTransactionObject + + decimals(): NonPayableTransactionObject + + exchangeRateCurrent(): NonPayableTransactionObject + + exchangeRateStored(): NonPayableTransactionObject + + getAccountSnapshot(account: string): NonPayableTransactionObject<{ + 0: string + 1: string + 2: string + 3: string + }> + + getCash(): NonPayableTransactionObject + + initialize( + comptroller_: string, + interestRateModel_: string, + initialExchangeRateMantissa_: number | string | BN, + name_: string, + symbol_: string, + decimals_: number | string | BN, + ): NonPayableTransactionObject + + interestRateModel(): NonPayableTransactionObject + + isQiToken(): NonPayableTransactionObject + + liquidateBorrow(borrower: string, qiTokenCollateral: string): PayableTransactionObject + + mint(): PayableTransactionObject + + name(): NonPayableTransactionObject + + pendingAdmin(): NonPayableTransactionObject + + protocolSeizeShareMantissa(): NonPayableTransactionObject + + redeem(redeemTokens: number | string | BN): NonPayableTransactionObject + + redeemUnderlying(redeemAmount: number | string | BN): NonPayableTransactionObject + + repayBorrow(): PayableTransactionObject + + repayBorrowBehalf(borrower: string): PayableTransactionObject + + reserveFactorMantissa(): NonPayableTransactionObject + + seize( + liquidator: string, + borrower: string, + seizeTokens: number | string | BN, + ): NonPayableTransactionObject + + supplyRatePerTimestamp(): NonPayableTransactionObject + + symbol(): NonPayableTransactionObject + + totalBorrows(): NonPayableTransactionObject + + totalBorrowsCurrent(): NonPayableTransactionObject + + totalReserves(): NonPayableTransactionObject + + totalSupply(): NonPayableTransactionObject + + transfer(dst: string, amount: number | string | BN): NonPayableTransactionObject + + transferFrom(src: string, dst: string, amount: number | string | BN): NonPayableTransactionObject + } + events: { + AccrueInterest(cb?: Callback): EventEmitter + AccrueInterest(options?: EventOptions, cb?: Callback): EventEmitter + + Approval(cb?: Callback): EventEmitter + Approval(options?: EventOptions, cb?: Callback): EventEmitter + + Borrow(cb?: Callback): EventEmitter + Borrow(options?: EventOptions, cb?: Callback): EventEmitter + + Failure(cb?: Callback): EventEmitter + Failure(options?: EventOptions, cb?: Callback): EventEmitter + + LiquidateBorrow(cb?: Callback): EventEmitter + LiquidateBorrow(options?: EventOptions, cb?: Callback): EventEmitter + + Mint(cb?: Callback): EventEmitter + Mint(options?: EventOptions, cb?: Callback): EventEmitter + + NewAdmin(cb?: Callback): EventEmitter + NewAdmin(options?: EventOptions, cb?: Callback): EventEmitter + + NewComptroller(cb?: Callback): EventEmitter + NewComptroller(options?: EventOptions, cb?: Callback): EventEmitter + + NewMarketInterestRateModel(cb?: Callback): EventEmitter + NewMarketInterestRateModel(options?: EventOptions, cb?: Callback): EventEmitter + + NewPendingAdmin(cb?: Callback): EventEmitter + NewPendingAdmin(options?: EventOptions, cb?: Callback): EventEmitter + + NewProtocolSeizeShare(cb?: Callback): EventEmitter + NewProtocolSeizeShare(options?: EventOptions, cb?: Callback): EventEmitter + + NewReserveFactor(cb?: Callback): EventEmitter + NewReserveFactor(options?: EventOptions, cb?: Callback): EventEmitter + + Redeem(cb?: Callback): EventEmitter + Redeem(options?: EventOptions, cb?: Callback): EventEmitter + + RepayBorrow(cb?: Callback): EventEmitter + RepayBorrow(options?: EventOptions, cb?: Callback): EventEmitter + + ReservesAdded(cb?: Callback): EventEmitter + ReservesAdded(options?: EventOptions, cb?: Callback): EventEmitter + + ReservesReduced(cb?: Callback): EventEmitter + ReservesReduced(options?: EventOptions, cb?: Callback): EventEmitter + + Transfer(cb?: Callback): EventEmitter + Transfer(options?: EventOptions, cb?: Callback): EventEmitter + + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } + + once(event: 'AccrueInterest', cb: Callback): void + once(event: 'AccrueInterest', options: EventOptions, cb: Callback): void + + once(event: 'Approval', cb: Callback): void + once(event: 'Approval', options: EventOptions, cb: Callback): void + + once(event: 'Borrow', cb: Callback): void + once(event: 'Borrow', options: EventOptions, cb: Callback): void + + once(event: 'Failure', cb: Callback): void + once(event: 'Failure', options: EventOptions, cb: Callback): void + + once(event: 'LiquidateBorrow', cb: Callback): void + once(event: 'LiquidateBorrow', options: EventOptions, cb: Callback): void + + once(event: 'Mint', cb: Callback): void + once(event: 'Mint', options: EventOptions, cb: Callback): void + + once(event: 'NewAdmin', cb: Callback): void + once(event: 'NewAdmin', options: EventOptions, cb: Callback): void + + once(event: 'NewComptroller', cb: Callback): void + once(event: 'NewComptroller', options: EventOptions, cb: Callback): void + + once(event: 'NewMarketInterestRateModel', cb: Callback): void + once(event: 'NewMarketInterestRateModel', options: EventOptions, cb: Callback): void + + once(event: 'NewPendingAdmin', cb: Callback): void + once(event: 'NewPendingAdmin', options: EventOptions, cb: Callback): void + + once(event: 'NewProtocolSeizeShare', cb: Callback): void + once(event: 'NewProtocolSeizeShare', options: EventOptions, cb: Callback): void + + once(event: 'NewReserveFactor', cb: Callback): void + once(event: 'NewReserveFactor', options: EventOptions, cb: Callback): void + + once(event: 'Redeem', cb: Callback): void + once(event: 'Redeem', options: EventOptions, cb: Callback): void + + once(event: 'RepayBorrow', cb: Callback): void + once(event: 'RepayBorrow', options: EventOptions, cb: Callback): void + + once(event: 'ReservesAdded', cb: Callback): void + once(event: 'ReservesAdded', options: EventOptions, cb: Callback): void + + once(event: 'ReservesReduced', cb: Callback): void + once(event: 'ReservesReduced', options: EventOptions, cb: Callback): void + + once(event: 'Transfer', cb: Callback): void + once(event: 'Transfer', options: EventOptions, cb: Callback): void +} diff --git a/packages/web3-contracts/types/QiERC20.d.ts b/packages/web3-contracts/types/QiERC20.d.ts new file mode 100644 index 000000000000..cf41f4734f5f --- /dev/null +++ b/packages/web3-contracts/types/QiERC20.d.ts @@ -0,0 +1,405 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export type AccrueInterest = ContractEventLog<{ + cashPrior: string + interestAccumulated: string + borrowIndex: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string +}> +export type Approval = ContractEventLog<{ + owner: string + spender: string + amount: string + 0: string + 1: string + 2: string +}> +export type Borrow = ContractEventLog<{ + borrower: string + borrowAmount: string + accountBorrows: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string +}> +export type Failure = ContractEventLog<{ + error: string + info: string + detail: string + 0: string + 1: string + 2: string +}> +export type LiquidateBorrow = ContractEventLog<{ + liquidator: string + borrower: string + repayAmount: string + qiTokenCollateral: string + seizeTokens: string + 0: string + 1: string + 2: string + 3: string + 4: string +}> +export type Mint = ContractEventLog<{ + minter: string + mintAmount: string + mintTokens: string + 0: string + 1: string + 2: string +}> +export type NewAdmin = ContractEventLog<{ + oldAdmin: string + newAdmin: string + 0: string + 1: string +}> +export type NewComptroller = ContractEventLog<{ + oldComptroller: string + newComptroller: string + 0: string + 1: string +}> +export type NewImplementation = ContractEventLog<{ + oldImplementation: string + newImplementation: string + 0: string + 1: string +}> +export type NewMarketInterestRateModel = ContractEventLog<{ + oldInterestRateModel: string + newInterestRateModel: string + 0: string + 1: string +}> +export type NewPendingAdmin = ContractEventLog<{ + oldPendingAdmin: string + newPendingAdmin: string + 0: string + 1: string +}> +export type NewProtocolSeizeShare = ContractEventLog<{ + oldProtocolSeizeShareMantissa: string + newProtocolSeizeShareMantissa: string + 0: string + 1: string +}> +export type NewReserveFactor = ContractEventLog<{ + oldReserveFactorMantissa: string + newReserveFactorMantissa: string + 0: string + 1: string +}> +export type Redeem = ContractEventLog<{ + redeemer: string + redeemAmount: string + redeemTokens: string + 0: string + 1: string + 2: string +}> +export type RepayBorrow = ContractEventLog<{ + payer: string + borrower: string + repayAmount: string + accountBorrows: string + totalBorrows: string + 0: string + 1: string + 2: string + 3: string + 4: string +}> +export type ReservesAdded = ContractEventLog<{ + benefactor: string + addAmount: string + newTotalReserves: string + 0: string + 1: string + 2: string +}> +export type ReservesReduced = ContractEventLog<{ + admin: string + reduceAmount: string + newTotalReserves: string + 0: string + 1: string + 2: string +}> +export type Transfer = ContractEventLog<{ + from: string + to: string + amount: string + 0: string + 1: string + 2: string +}> + +export interface QiERC20 extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): QiERC20 + clone(): QiERC20 + methods: { + _acceptAdmin(): NonPayableTransactionObject + + _addReserves(addAmount: number | string | BN): NonPayableTransactionObject + + _reduceReserves(reduceAmount: number | string | BN): NonPayableTransactionObject + + _setComptroller(newComptroller: string): NonPayableTransactionObject + + _setImplementation( + implementation_: string, + allowResign: boolean, + becomeImplementationData: string | number[], + ): NonPayableTransactionObject + + _setInterestRateModel(newInterestRateModel: string): NonPayableTransactionObject + + _setPendingAdmin(newPendingAdmin: string): NonPayableTransactionObject + + _setProtocolSeizeShare(newProtocolSeizeShareMantissa: number | string | BN): NonPayableTransactionObject + + _setReserveFactor(newReserveFactorMantissa: number | string | BN): NonPayableTransactionObject + + accrualBlockTimestamp(): NonPayableTransactionObject + + accrueInterest(): NonPayableTransactionObject + + admin(): NonPayableTransactionObject + + allowance(owner: string, spender: string): NonPayableTransactionObject + + approve(spender: string, amount: number | string | BN): NonPayableTransactionObject + + balanceOf(owner: string): NonPayableTransactionObject + + balanceOfUnderlying(owner: string): NonPayableTransactionObject + + borrow(borrowAmount: number | string | BN): NonPayableTransactionObject + + borrowBalanceCurrent(account: string): NonPayableTransactionObject + + borrowBalanceStored(account: string): NonPayableTransactionObject + + borrowIndex(): NonPayableTransactionObject + + borrowRatePerTimestamp(): NonPayableTransactionObject + + comptroller(): NonPayableTransactionObject + + decimals(): NonPayableTransactionObject + + delegateToImplementation(data: string | number[]): NonPayableTransactionObject + + delegateToViewImplementation(data: string | number[]): NonPayableTransactionObject + + exchangeRateCurrent(): NonPayableTransactionObject + + exchangeRateStored(): NonPayableTransactionObject + + getAccountSnapshot(account: string): NonPayableTransactionObject<{ + 0: string + 1: string + 2: string + 3: string + }> + + getCash(): NonPayableTransactionObject + + implementation(): NonPayableTransactionObject + + interestRateModel(): NonPayableTransactionObject + + isQiToken(): NonPayableTransactionObject + + liquidateBorrow( + borrower: string, + repayAmount: number | string | BN, + qiTokenCollateral: string, + ): NonPayableTransactionObject + + mint(mintAmount: number | string | BN): NonPayableTransactionObject + + name(): NonPayableTransactionObject + + pendingAdmin(): NonPayableTransactionObject + + protocolSeizeShareMantissa(): NonPayableTransactionObject + + redeem(redeemTokens: number | string | BN): NonPayableTransactionObject + + redeemUnderlying(redeemAmount: number | string | BN): NonPayableTransactionObject + + repayBorrow(repayAmount: number | string | BN): NonPayableTransactionObject + + repayBorrowBehalf(borrower: string, repayAmount: number | string | BN): NonPayableTransactionObject + + reserveFactorMantissa(): NonPayableTransactionObject + + seize( + liquidator: string, + borrower: string, + seizeTokens: number | string | BN, + ): NonPayableTransactionObject + + supplyRatePerTimestamp(): NonPayableTransactionObject + + sweepToken(token: string): NonPayableTransactionObject + + symbol(): NonPayableTransactionObject + + totalBorrows(): NonPayableTransactionObject + + totalBorrowsCurrent(): NonPayableTransactionObject + + totalReserves(): NonPayableTransactionObject + + totalSupply(): NonPayableTransactionObject + + transfer(dst: string, amount: number | string | BN): NonPayableTransactionObject + + transferFrom(src: string, dst: string, amount: number | string | BN): NonPayableTransactionObject + + underlying(): NonPayableTransactionObject + } + events: { + AccrueInterest(cb?: Callback): EventEmitter + AccrueInterest(options?: EventOptions, cb?: Callback): EventEmitter + + Approval(cb?: Callback): EventEmitter + Approval(options?: EventOptions, cb?: Callback): EventEmitter + + Borrow(cb?: Callback): EventEmitter + Borrow(options?: EventOptions, cb?: Callback): EventEmitter + + Failure(cb?: Callback): EventEmitter + Failure(options?: EventOptions, cb?: Callback): EventEmitter + + LiquidateBorrow(cb?: Callback): EventEmitter + LiquidateBorrow(options?: EventOptions, cb?: Callback): EventEmitter + + Mint(cb?: Callback): EventEmitter + Mint(options?: EventOptions, cb?: Callback): EventEmitter + + NewAdmin(cb?: Callback): EventEmitter + NewAdmin(options?: EventOptions, cb?: Callback): EventEmitter + + NewComptroller(cb?: Callback): EventEmitter + NewComptroller(options?: EventOptions, cb?: Callback): EventEmitter + + NewImplementation(cb?: Callback): EventEmitter + NewImplementation(options?: EventOptions, cb?: Callback): EventEmitter + + NewMarketInterestRateModel(cb?: Callback): EventEmitter + NewMarketInterestRateModel(options?: EventOptions, cb?: Callback): EventEmitter + + NewPendingAdmin(cb?: Callback): EventEmitter + NewPendingAdmin(options?: EventOptions, cb?: Callback): EventEmitter + + NewProtocolSeizeShare(cb?: Callback): EventEmitter + NewProtocolSeizeShare(options?: EventOptions, cb?: Callback): EventEmitter + + NewReserveFactor(cb?: Callback): EventEmitter + NewReserveFactor(options?: EventOptions, cb?: Callback): EventEmitter + + Redeem(cb?: Callback): EventEmitter + Redeem(options?: EventOptions, cb?: Callback): EventEmitter + + RepayBorrow(cb?: Callback): EventEmitter + RepayBorrow(options?: EventOptions, cb?: Callback): EventEmitter + + ReservesAdded(cb?: Callback): EventEmitter + ReservesAdded(options?: EventOptions, cb?: Callback): EventEmitter + + ReservesReduced(cb?: Callback): EventEmitter + ReservesReduced(options?: EventOptions, cb?: Callback): EventEmitter + + Transfer(cb?: Callback): EventEmitter + Transfer(options?: EventOptions, cb?: Callback): EventEmitter + + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } + + once(event: 'AccrueInterest', cb: Callback): void + once(event: 'AccrueInterest', options: EventOptions, cb: Callback): void + + once(event: 'Approval', cb: Callback): void + once(event: 'Approval', options: EventOptions, cb: Callback): void + + once(event: 'Borrow', cb: Callback): void + once(event: 'Borrow', options: EventOptions, cb: Callback): void + + once(event: 'Failure', cb: Callback): void + once(event: 'Failure', options: EventOptions, cb: Callback): void + + once(event: 'LiquidateBorrow', cb: Callback): void + once(event: 'LiquidateBorrow', options: EventOptions, cb: Callback): void + + once(event: 'Mint', cb: Callback): void + once(event: 'Mint', options: EventOptions, cb: Callback): void + + once(event: 'NewAdmin', cb: Callback): void + once(event: 'NewAdmin', options: EventOptions, cb: Callback): void + + once(event: 'NewComptroller', cb: Callback): void + once(event: 'NewComptroller', options: EventOptions, cb: Callback): void + + once(event: 'NewImplementation', cb: Callback): void + once(event: 'NewImplementation', options: EventOptions, cb: Callback): void + + once(event: 'NewMarketInterestRateModel', cb: Callback): void + once(event: 'NewMarketInterestRateModel', options: EventOptions, cb: Callback): void + + once(event: 'NewPendingAdmin', cb: Callback): void + once(event: 'NewPendingAdmin', options: EventOptions, cb: Callback): void + + once(event: 'NewProtocolSeizeShare', cb: Callback): void + once(event: 'NewProtocolSeizeShare', options: EventOptions, cb: Callback): void + + once(event: 'NewReserveFactor', cb: Callback): void + once(event: 'NewReserveFactor', options: EventOptions, cb: Callback): void + + once(event: 'Redeem', cb: Callback): void + once(event: 'Redeem', options: EventOptions, cb: Callback): void + + once(event: 'RepayBorrow', cb: Callback): void + once(event: 'RepayBorrow', options: EventOptions, cb: Callback): void + + once(event: 'ReservesAdded', cb: Callback): void + once(event: 'ReservesAdded', options: EventOptions, cb: Callback): void + + once(event: 'ReservesReduced', cb: Callback): void + once(event: 'ReservesReduced', options: EventOptions, cb: Callback): void + + once(event: 'Transfer', cb: Callback): void + once(event: 'Transfer', options: EventOptions, cb: Callback): void +} diff --git a/packages/web3-contracts/types/TranquilPriceOracleV2.d.ts b/packages/web3-contracts/types/TranquilPriceOracleV2.d.ts new file mode 100644 index 000000000000..3c2f6c4aae16 --- /dev/null +++ b/packages/web3-contracts/types/TranquilPriceOracleV2.d.ts @@ -0,0 +1,74 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export type OwnershipTransferred = ContractEventLog<{ + previousOwner: string + newOwner: string + 0: string + 1: string +}> + +export interface TranquilPriceOracleV2 extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): TranquilPriceOracleV2 + clone(): TranquilPriceOracleV2 + methods: { + WONE_ADDRESS(): NonPayableTransactionObject + + chainlinkOracle(): NonPayableTransactionObject + + fallbackOracle(): NonPayableTransactionObject + + isPriceOracle(): NonPayableTransactionObject + + owner(): NonPayableTransactionObject + + renounceOwnership(): NonPayableTransactionObject + + specialTokenOracles(arg0: string): NonPayableTransactionObject + + transferOwnership(newOwner: string): NonPayableTransactionObject + + uniswapOracle(): NonPayableTransactionObject + + setSpecialTokenOracle(_token: string, _specialTokenOracle: string): NonPayableTransactionObject + + setChainlinkOracle(_chainlinkOracle: string): NonPayableTransactionObject + + setUniswapOracle(_uniswapOracle: string): NonPayableTransactionObject + + setFallbackOracle(_fallbackOracle: string): NonPayableTransactionObject + + getUnderlyingPrice(tqToken: string): NonPayableTransactionObject + + getPrice(token: string): NonPayableTransactionObject + } + events: { + OwnershipTransferred(cb?: Callback): EventEmitter + OwnershipTransferred(options?: EventOptions, cb?: Callback): EventEmitter + + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } + + once(event: 'OwnershipTransferred', cb: Callback): void + once(event: 'OwnershipTransferred', options: EventOptions, cb: Callback): void +} diff --git a/packages/web3-shared/evm/constants/constants.ts b/packages/web3-shared/evm/constants/constants.ts index f96125e1f100..10683e99c5a3 100644 --- a/packages/web3-shared/evm/constants/constants.ts +++ b/packages/web3-shared/evm/constants/constants.ts @@ -25,6 +25,13 @@ import CryptoArtAI from '@masknet/web3-constants/evm/cryptoartai.json' import ArtBlocks from '@masknet/web3-constants/evm/artblocks.json' import Aave from '@masknet/web3-constants/evm/aave.json' import Lido from '@masknet/web3-constants/evm/lido.json' +import BenQi from '@masknet/web3-constants/evm/benqi.json' +import Aurigami from '@masknet/web3-constants/evm/aurigami.json' +import Tranquil from '@masknet/web3-constants/evm/tranquil.json' +import Compound from '@masknet/web3-constants/evm/compound.json' +import Moola from '@masknet/web3-constants/evm/moola.json' +import Giest from '@masknet/web3-constants/evm/giest.json' +import Alpaca from '@masknet/web3-constants/evm/alpaca.json' import { hookTransform, transform, transformFromJSON } from '@masknet/web3-shared-base' import { ChainId } from '../types' @@ -119,3 +126,24 @@ export const useAaveConstants = hookTransform(getAaveConstants) export const getLidoConstants = transform(ChainId, Lido) export const useLidoConstants = hookTransform(getLidoConstants) + +export const getBenQiConstants = transform(ChainId, BenQi) +export const useBenQiConstants = hookTransform(getBenQiConstants) + +export const getAurigamiConstants = transform(ChainId, Aurigami) +export const useAurigamiConstants = hookTransform(getAurigamiConstants) + +export const getTranquilConstants = transform(ChainId, Tranquil) +export const useTranquilConstants = hookTransform(getTranquilConstants) + +export const getCompoundConstants = transform(ChainId, Compound) +export const useCompoundConstants = hookTransform(getCompoundConstants) + +export const getMoolaConstants = transform(ChainId, Moola) +export const useMoolaConstants = hookTransform(getMoolaConstants) + +export const getGiestConstants = transform(ChainId, Giest) +export const useGiestConstants = hookTransform(getGiestConstants) + +export const getAlpacaConstants = transform(ChainId, Alpaca) +export const useAlpacaConstants = hookTransform(getAlpacaConstants) From 3d20e0c8dd57e925403c20fdcfe6d1ef133b16db Mon Sep 17 00:00:00 2001 From: fun Date: Sun, 3 Jul 2022 00:29:36 +0800 Subject: [PATCH 2/3] fix: merge --- packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialog.tsx b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialog.tsx index 86421f6d1609..1be665fe8ed4 100644 --- a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialog.tsx +++ b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsDialog.tsx @@ -1,6 +1,6 @@ import { useMemo, useState } from 'react' import { useAsync, useUpdateEffect } from 'react-use' -import { DialogActions, DialogContent, Tab, Typography } from '@mui/material' +import { DialogActions, DialogContent, CircularProgress, Tab, Typography } from '@mui/material' import { isDashboardPage, EMPTY_LIST } from '@masknet/shared-base' import { MaskTabList, useTabs } from '@masknet/theme' import { ChainId, networkResolver, NetworkType } from '@masknet/web3-shared-evm' From 7c6d25d8395fbd5fb656a9c7d70dc67bfcc76aec Mon Sep 17 00:00:00 2001 From: fun Date: Sun, 3 Jul 2022 00:41:55 +0800 Subject: [PATCH 3/3] fix: cspell --- cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/cspell.json b/cspell.json index c70cac36d261..7c41f40a8b51 100644 --- a/cspell.json +++ b/cspell.json @@ -183,6 +183,7 @@ "proxied", "pushstate", "pvtsutils", + "qied", "qrcode", "quickswap", "radisk",