From 35da01086d283721e75869965c87f7f2ca792b66 Mon Sep 17 00:00:00 2001 From: michalsmiarowski Date: Tue, 19 Jan 2021 09:57:47 +0100 Subject: [PATCH 01/19] Add TBTC + Saddle card to Liquidity Rewards page Add a template for TBTC + Saddle exchange to the Liquidity Rewards page. --- solidity/dashboard/src/constants/constants.js | 7 +++++++ .../src/pages/liquidity/LiquidityPage.jsx | 21 ++++++++++++++++++- .../src/reducers/liquidity-rewards.js | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/solidity/dashboard/src/constants/constants.js b/solidity/dashboard/src/constants/constants.js index ea931e8aa7..043a7200d6 100644 --- a/solidity/dashboard/src/constants/constants.js +++ b/solidity/dashboard/src/constants/constants.js @@ -14,6 +14,7 @@ export const TBTC_SYSTEM_CONTRACT_NAME = "tbtcSystemContract" export const TOKEN_STAKING_ESCROW_CONTRACT_NAME = "tokenStakingEscrow" export const OLD_TOKEN_STAKING_CONTRACT_NAME = "oldTokenStakingContract" export const STAKING_PORT_BACKER_CONTRACT_NAME = "stakingPortBackerContract" +export const LP_REWARDS_TBTC_SADDLE_CONTRACT_NAME = "LPRewardsKEEPETHContract" export const LP_REWARDS_KEEP_ETH_CONTRACT_NAME = "LPRewardsKEEPETHContract" export const LP_REWARDS_TBTC_ETH_CONTRACT_NAME = "LPRewardsTBTCETHContract" export const LP_REWARDS_KEEP_TBTC_CONTRACT_NAME = "LPRewardsKEEPTBTCContract" @@ -41,6 +42,12 @@ export const SIGNING_GROUP_STATUS = { } export const LIQUIDITY_REWARD_PAIRS = { + TBTC_SADDLE: { + contractName: LP_REWARDS_TBTC_SADDLE_CONTRACT_NAME, + label: "TBTC + SADDLE", + viewPoolLink: "https://saddle.exchange/#/deposit", + address: "0xe6f19dab7d43317344282f803f8e8d240708174a", + }, KEEP_ETH: { contractName: LP_REWARDS_KEEP_ETH_CONTRACT_NAME, label: "KEEP + ETH", diff --git a/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx b/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx index 1e89a05bda..759ba917da 100644 --- a/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx +++ b/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx @@ -22,7 +22,7 @@ const LiquidityPage = ({ headerTitle }) => { const { isConnected } = useWeb3Context() const keepTokenBalance = useSelector((state) => state.keepTokenBalance) - const { KEEP_ETH, TBTC_ETH, KEEP_TBTC } = useSelector( + const { TBTC_SADDLE, KEEP_ETH, TBTC_ETH, KEEP_TBTC } = useSelector( (state) => state.liquidityRewards ) const dispatch = useDispatch() @@ -110,6 +110,25 @@ const LiquidityPage = ({ headerTitle }) => { )} + Date: Tue, 19 Jan 2021 10:29:39 +0100 Subject: [PATCH 02/19] Change TBTC+Saddle contract name Change TBTC+Saddle contract name in constants.js file. --- solidity/dashboard/src/constants/constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solidity/dashboard/src/constants/constants.js b/solidity/dashboard/src/constants/constants.js index 043a7200d6..dc6a7358e0 100644 --- a/solidity/dashboard/src/constants/constants.js +++ b/solidity/dashboard/src/constants/constants.js @@ -14,7 +14,7 @@ export const TBTC_SYSTEM_CONTRACT_NAME = "tbtcSystemContract" export const TOKEN_STAKING_ESCROW_CONTRACT_NAME = "tokenStakingEscrow" export const OLD_TOKEN_STAKING_CONTRACT_NAME = "oldTokenStakingContract" export const STAKING_PORT_BACKER_CONTRACT_NAME = "stakingPortBackerContract" -export const LP_REWARDS_TBTC_SADDLE_CONTRACT_NAME = "LPRewardsKEEPETHContract" +export const LP_REWARDS_TBTC_SADDLE_CONTRACT_NAME = "LPRewardsTBTCSaddle" export const LP_REWARDS_KEEP_ETH_CONTRACT_NAME = "LPRewardsKEEPETHContract" export const LP_REWARDS_TBTC_ETH_CONTRACT_NAME = "LPRewardsTBTCETHContract" export const LP_REWARDS_KEEP_TBTC_CONTRACT_NAME = "LPRewardsKEEPTBTCContract" From ff32033d336b68ba94a099168e3c4a0006235441 Mon Sep 17 00:00:00 2001 From: michalsmiarowski Date: Tue, 19 Jan 2021 11:28:48 +0100 Subject: [PATCH 03/19] Add proper icons to TBTC+Saddle card Add proper icons to TBT+Saddle card in Liquidity Rewards page. --- solidity/dashboard/src/components/Icons.jsx | 18 ++++++++++++++++++ .../dashboard/src/css/liquidity-page.less | 2 +- .../src/pages/liquidity/LiquidityPage.jsx | 4 ++-- .../src/static/svg/Saddle_logomark_blue.png | Bin 0 -> 37830 bytes .../svg/Saddle_logomark_transparent_white.png | Bin 0 -> 46554 bytes .../src/static/svg/Saddle_logomark_white.png | Bin 0 -> 53744 bytes 6 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 solidity/dashboard/src/static/svg/Saddle_logomark_blue.png create mode 100644 solidity/dashboard/src/static/svg/Saddle_logomark_transparent_white.png create mode 100644 solidity/dashboard/src/static/svg/Saddle_logomark_white.png diff --git a/solidity/dashboard/src/components/Icons.jsx b/solidity/dashboard/src/components/Icons.jsx index 74338dd1b3..f15990f4d0 100644 --- a/solidity/dashboard/src/components/Icons.jsx +++ b/solidity/dashboard/src/components/Icons.jsx @@ -321,6 +321,23 @@ const Coinbase = () => ( ) +const Saddle = ({ className }) => { + return ( + + ) +} + export { Badge, Cross, @@ -371,4 +388,5 @@ export { Time, KeepDashboardLogo, NetworkStatusIndicator, + Saddle, } diff --git a/solidity/dashboard/src/css/liquidity-page.less b/solidity/dashboard/src/css/liquidity-page.less index 5bf261feeb..8fea003dbd 100644 --- a/solidity/dashboard/src/css/liquidity-page.less +++ b/solidity/dashboard/src/css/liquidity-page.less @@ -27,7 +27,7 @@ .liquidity__double-icon-container { margin-right: 0.5rem; - .tbtc-eth& { + .tbtc-eth&, .tbtc-saddle& { .main-icon { circle { fill: @white; diff --git a/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx b/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx index 759ba917da..376d68346a 100644 --- a/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx +++ b/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx @@ -115,8 +115,8 @@ const LiquidityPage = ({ headerTitle }) => { liquidityPairContractName={ LIQUIDITY_REWARD_PAIRS.TBTC_SADDLE.contractName } - MainIcon={Icons.KeepBlackGreen} - SecondaryIcon={Icons.EthToken} + MainIcon={Icons.TBTC} + SecondaryIcon={Icons.Saddle} viewPoolLink={LIQUIDITY_REWARD_PAIRS.TBTC_SADDLE.viewPoolLink} apy={TBTC_SADDLE.apy} percentageOfTotalPool={TBTC_SADDLE.shareOfPoolInPercent} diff --git a/solidity/dashboard/src/static/svg/Saddle_logomark_blue.png b/solidity/dashboard/src/static/svg/Saddle_logomark_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..320d61f282dc9d7c0cc4f0ca517473d986ba607f GIT binary patch literal 37830 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

l2<4<7#u>mil2d~ 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 j?vVO14Y* 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 literal 0 HcmV?d00001 From aa85b54471b098136712d0f232d3f31770590471 Mon Sep 17 00:00:00 2001 From: michalsmiarowski Date: Tue, 19 Jan 2021 14:30:07 +0100 Subject: [PATCH 04/19] Change 'Uniswap pool' link to 'Saddle pool' Change 'Uniswap pool' link to 'Saddle pool' link for TBTC + Saddle liquidity pair. --- solidity/dashboard/src/components/LiquidityRewardCard.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/solidity/dashboard/src/components/LiquidityRewardCard.jsx b/solidity/dashboard/src/components/LiquidityRewardCard.jsx index 6c25491e23..d09561768b 100644 --- a/solidity/dashboard/src/components/LiquidityRewardCard.jsx +++ b/solidity/dashboard/src/components/LiquidityRewardCard.jsx @@ -11,6 +11,7 @@ import Banner from "./Banner" import { toTokenUnit } from "../utils/token.utils" import { gt } from "../utils/arithmetics.utils" import { formatPercentage } from "../utils/general.utils" +import { LIQUIDITY_REWARD_PAIRS } from "../constants/constants" const LiquidityRewardCard = ({ title, @@ -94,7 +95,9 @@ const LiquidityRewardCard = ({ href={viewPoolLink} className="text-white text-link" > - Uniswap pool + {title === LIQUIDITY_REWARD_PAIRS.TBTC_SADDLE.label + ? "Saddle pool" + : "Uniswap pool"} From 5f052c4c83a335797b39055c33078fd75f9245f6 Mon Sep 17 00:00:00 2001 From: michalsmiarowski Date: Tue, 19 Jan 2021 15:01:53 +0100 Subject: [PATCH 05/19] Change row wrapping for liquidity pool cards Wrap rows to the left when above 1600px and center them when below. --- solidity/dashboard/src/css/card-container.less | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/solidity/dashboard/src/css/card-container.less b/solidity/dashboard/src/css/card-container.less index 66e04bb917..082fedc770 100644 --- a/solidity/dashboard/src/css/card-container.less +++ b/solidity/dashboard/src/css/card-container.less @@ -2,4 +2,10 @@ display: flex; justify-content: center; flex-wrap: wrap; + margin: 0 2.2rem; + + @media screen and (min-width: 1600px) { + justify-content: start; + margin: 0 2.2rem; + } } \ No newline at end of file From d09f35c8903bb72192e9bf5f22999317d8aa50f4 Mon Sep 17 00:00:00 2001 From: michalsmiarowski Date: Tue, 19 Jan 2021 15:13:47 +0100 Subject: [PATCH 06/19] Change 'Uniswap pool' subtitle to 'Saddle pool' Change 'Uniswap pool' subtitle to 'Saddle pool' for TBTC+SADDLE liquidity pair. --- solidity/dashboard/src/components/LiquidityRewardCard.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/solidity/dashboard/src/components/LiquidityRewardCard.jsx b/solidity/dashboard/src/components/LiquidityRewardCard.jsx index d09561768b..5b46aa90c5 100644 --- a/solidity/dashboard/src/components/LiquidityRewardCard.jsx +++ b/solidity/dashboard/src/components/LiquidityRewardCard.jsx @@ -117,7 +117,10 @@ const LiquidityRewardCard = ({

{title}

- Uniswap Pool  + {title === LIQUIDITY_REWARD_PAIRS.TBTC_SADDLE.label + ? "Saddle Pool" + : "Uniswap Pool"} +   Date: Tue, 19 Jan 2021 17:01:47 +0100 Subject: [PATCH 07/19] Add getBTCPriceInUSD function Added a function that returns the current BTC price based on the TBTC/ETH Uniswap pool. The BTC price in USD is required to calculate the APY for the Saddle pool. --- .../dashboard/src/services/uniswap-api.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/solidity/dashboard/src/services/uniswap-api.js b/solidity/dashboard/src/services/uniswap-api.js index 1b17415bc6..0ac675e751 100644 --- a/solidity/dashboard/src/services/uniswap-api.js +++ b/solidity/dashboard/src/services/uniswap-api.js @@ -39,14 +39,27 @@ export const getPairData = async (pairId) => { return response.data.data.pair } +const getTokenPriceInUSD = async (address) => { + const pairData = await getPairData(address) + const ethPrice = new BigNumber(pairData.reserveUSD).div(pairData.reserveETH) + + return ethPrice.multipliedBy(pairData.token0.derivedETH) +} + /** * Returns the current KEEP token price in USD based on the Uniswap pool. * * @return {BigNumber} KEEP token price in USD. */ export const getKeepTokenPriceInUSD = async () => { - const pairData = await getPairData(LIQUIDITY_REWARD_PAIRS.KEEP_ETH.address) - const ethPrice = new BigNumber(pairData.reserveUSD).div(pairData.reserveETH) + return await getTokenPriceInUSD(LIQUIDITY_REWARD_PAIRS.KEEP_ETH.address) +} - return ethPrice.multipliedBy(pairData.token0.derivedETH) +/** + * Returns the current BTC price in USD based on the TBTC/ETH Uniswap pool. + * + * @return {BigNumber} BTC price in USD. + */ +export const getBTCPriceInUSD = async () => { + return await getTokenPriceInUSD(LIQUIDITY_REWARD_PAIRS.TBTC_ETH.address) } From 43ed683ee0640e719df73e0757f90166dfe0c32b Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Tue, 19 Jan 2021 17:04:42 +0100 Subject: [PATCH 08/19] Refactor the liquidity rewards service Created a wrapper for the LPRewards contract to keep the same API for the diffferent pools(Uniswap, Saddle). --- .../src/services/liquidity-rewards.js | 218 +++++++++++++----- 1 file changed, 157 insertions(+), 61 deletions(-) diff --git a/solidity/dashboard/src/services/liquidity-rewards.js b/solidity/dashboard/src/services/liquidity-rewards.js index c5263d788b..2426521335 100644 --- a/solidity/dashboard/src/services/liquidity-rewards.js +++ b/solidity/dashboard/src/services/liquidity-rewards.js @@ -1,91 +1,187 @@ import web3Utils from "web3-utils" -import { Web3Loaded, createERC20Contract } from "../contracts" +import { createERC20Contract } from "../contracts" import BigNumber from "bignumber.js" -import { LIQUIDITY_REWARD_PAIRS } from "../constants/constants" import { toTokenUnit } from "../utils/token.utils" -import { getPairData, getKeepTokenPriceInUSD } from "./uniswap-api" +import { + getPairData, + getKeepTokenPriceInUSD, + getBTCPriceInUSD, +} from "./uniswap-api" import moment from "moment" +/** @typedef {import("web3").default} Web3 */ +/** @typedef {LiquidityRewards} LiquidityRewards */ // lp contract address -> wrapped ERC20 token as web3 contract instance const LPRewardsToWrappedTokenCache = {} const WEEKS_IN_YEAR = 52 -export const fetchWrappedTokenBalance = async (address, LPrewardsContract) => { - const ERC20Contract = await getWrappedTokenConctract(LPrewardsContract) +class LiquidityRewards { + constructor(_wrappedTokenContract, _LPRewardsContract) { + this.wrappedToken = _wrappedTokenContract + this.LPRewardsContract = _LPRewardsContract + } - return await ERC20Contract.methods.balanceOf(address).call() -} + get wrappedTokenAddress() { + return this.wrappedToken.options.address + } -export const getWrappedTokenConctract = async (LPRewardsContract) => { - const web3 = await Web3Loaded - const lpRewardsContractAddress = web3Utils.toChecksumAddress( - LPRewardsContract.options.address - ) + wrappedTokenBalance = async (address) => { + return await this.wrappedToken.methods.balanceOf(address).call() + } - if (!LPRewardsToWrappedTokenCache.hasOwnProperty(lpRewardsContractAddress)) { - const wrappedTokenAddress = await LPRewardsContract.methods - .wrappedToken() - .call() - LPRewardsToWrappedTokenCache[ - lpRewardsContractAddress - ] = createERC20Contract(web3, wrappedTokenAddress) + wrappedTokenTotalSupply = async () => { + return await this.wrappedToken.methods.totalSupply().call() } - return LPRewardsToWrappedTokenCache[lpRewardsContractAddress] -} + wrappedTokenAllowance = async (owner, spender) => { + return await this.wrappedToken.methods.allowance(owner, spender).call() + } -export const fetchStakedBalance = async (address, LPrewardsContract) => { - return await LPrewardsContract.methods.balanceOf(address).call() -} + stakedBalance = async (address) => { + return await this.LPRewardsContract.methods.balanceOf(address).call() + } -export const fetchTotalLPTokensCreatedInUniswap = async (LPrewardsContract) => { - const ERC20Contract = await getWrappedTokenConctract(LPrewardsContract) - return await ERC20Contract.methods.totalSupply().call() -} + totalSupply = async () => { + return await this.LPRewardsContract.methods.totalSupply().call() + } -export const fetchLPRewardsTotalSupply = async (LPrewardsContract) => { - return await LPrewardsContract.methods.totalSupply().call() -} -export const fetchRewardBalance = async (address, LPrewardsContract) => { - return await LPrewardsContract.methods.earned(address).call() + rewardBalance = async (address) => { + return await this.LPRewardsContract.methods.earned(address).call() + } + + rewardRate = async () => { + return await this.LPRewardsContract.methods.rewardRate().call() + } + + rewardPoolPerWeek = async () => { + const rewardRate = await this.rewardRate() + return toTokenUnit(rewardRate).multipliedBy( + moment.duration(7, "days").asSeconds() + ) + } + + _calculateR = ( + keepTokenInUSD, + rewardPoolPerInterval, + totalLPTokensInLPRewardsInUSD + ) => { + return keepTokenInUSD + .multipliedBy(rewardPoolPerInterval) + .div(totalLPTokensInLPRewardsInUSD) + } + + /** + * Calculates the APY. + * + * @param {BigNumber} r Period rate. + * @param {number | string | BigNumber} n Number of compounding periods. + * @return {BigNumber} APY value. + */ + _calculateAPY = (r, n = WEEKS_IN_YEAR) => { + return r.plus(1).pow(n).minus(1) + } + + calculateAPY = async (totalSupplyOfLPRewards) => { + throw new Error("First, implement the `calculateAPY` function") + } } -export const fetchRewardRate = async (LPRewardsContract) => { - return await LPRewardsContract.methods.rewardRate().call() +class UniswapLPRewards extends LiquidityRewards { + calculateAPY = async (totalSupplyOfLPRewards) => { + totalSupplyOfLPRewards = toTokenUnit(totalSupplyOfLPRewards) + + const pairData = await getPairData(this.wrappedTokenAddress.toLowerCase()) + const rewardPoolPerWeek = await this.rewardPoolPerWeek() + + const lpRewardsPoolInUSD = totalSupplyOfLPRewards + .multipliedBy(pairData.reserveUSD) + .div(pairData.totalSupply) + + const ethPrice = new BigNumber(pairData.reserveUSD).div(pairData.reserveETH) + + let keepTokenInUSD = 0 + if (pairData.token0.symbol === "KEEP") { + keepTokenInUSD = ethPrice.multipliedBy(pairData.token0.derivedETH) + } else if (pairData.token1.symbol === "KEEP") { + keepTokenInUSD = ethPrice.multipliedBy(pairData.token1.derivedETH) + } else { + keepTokenInUSD = await getKeepTokenPriceInUSD() + } + + const r = this._calculateR( + keepTokenInUSD, + rewardPoolPerWeek, + lpRewardsPoolInUSD + ) + + return this._calculateAPY(r, WEEKS_IN_YEAR) + } } -export const calculateAPY = async ( - totalSupplyOfLPRewards, - pairSymbol, - LPRewardsContract -) => { - totalSupplyOfLPRewards = toTokenUnit(totalSupplyOfLPRewards) +class SaddleLPRewards extends LiquidityRewards { + calculateAPY = async (totalSupplyOfLPRewards) => { + totalSupplyOfLPRewards = toTokenUnit(totalSupplyOfLPRewards) + + const wrappedTokenTotalSupply = await this.wrappedTokenTotalSupply() + const BTCPriceInUSD = await getBTCPriceInUSD() - const pairData = await getPairData(LIQUIDITY_REWARD_PAIRS[pairSymbol].address) - const rewardRate = await fetchRewardRate(LPRewardsContract) + // TODO fetch total Bitcoins deposited in the wrapped token pool + const totalBitcoinDepositedInWrappedTokenPool = 0 + const wrappedTokenPoolInUSD = BTCPriceInUSD.multipliedBy( + totalBitcoinDepositedInWrappedTokenPool + ) - const rewardPoolPerWeek = toTokenUnit(rewardRate).multipliedBy( - moment.duration(7, "days").asSeconds() - ) + const rewardPoolPerWeek = await this.rewardPoolPerWeek() - const totalLPTokensInLPRewardsInUSD = totalSupplyOfLPRewards - .multipliedBy(pairData.reserveUSD) - .div(pairData.totalSupply) + const lpRewardsPoolInUSD = totalSupplyOfLPRewards + .multipliedBy(wrappedTokenPoolInUSD) + .div(wrappedTokenTotalSupply) - const ethPrice = new BigNumber(pairData.reserveUSD).div(pairData.reserveETH) + const keepTokenInUSD = await getKeepTokenPriceInUSD() - let keepTokenInUSD = 0 - if (pairData.token0.symbol === "KEEP") { - keepTokenInUSD = ethPrice.multipliedBy(pairData.token0.derivedETH) - } else if (pairData.token1.symbol === "KEEP") { - keepTokenInUSD = ethPrice.multipliedBy(pairData.token1.derivedETH) - } else { - keepTokenInUSD = await getKeepTokenPriceInUSD() + const r = this._calculateR( + keepTokenInUSD, + rewardPoolPerWeek, + lpRewardsPoolInUSD + ) + + return this._calculateAPY(r, WEEKS_IN_YEAR) } +} - const r = keepTokenInUSD - .multipliedBy(rewardPoolPerWeek) - .div(totalLPTokensInLPRewardsInUSD) +const LiquidityRewardsPoolStrategy = { + UNISWAP: UniswapLPRewards, + SADDLE: SaddleLPRewards, +} - return r.plus(1).pow(WEEKS_IN_YEAR).minus(1) +export class LiquidityRewardsFactory { + /** + * + * @param {('UNISWAP' | 'SADDLE')} pool - The supported type of pools. + * @param {Object} LPRewardsContract - The LPRewardsContract as web3 contract instance. + * @param {Web3} web3 - web3 + * @return {LiquidityRewards} - The Liquidity Rewards Wrapper + */ + static async initialize(pool, LPRewardsContract, web3) { + const lpRewardsContractAddress = web3Utils.toChecksumAddress( + LPRewardsContract.options.address + ) + + if ( + !LPRewardsToWrappedTokenCache.hasOwnProperty(lpRewardsContractAddress) + ) { + const wrappedTokenAddress = await LPRewardsContract.methods + .wrappedToken() + .call() + LPRewardsToWrappedTokenCache[ + lpRewardsContractAddress + ] = createERC20Contract(web3, wrappedTokenAddress) + } + + const wrappedTokenContract = + LPRewardsToWrappedTokenCache[lpRewardsContractAddress] + const PoolStrategy = LiquidityRewardsPoolStrategy[pool] + + return new PoolStrategy(wrappedTokenContract, LPRewardsContract) + } } From b90b31e5137bb613b8c71417585f9d7c3e8135fe Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Tue, 19 Jan 2021 17:18:20 +0100 Subject: [PATCH 09/19] Update the liquidity reward pairs map Added a pool field to recognize what kind of pool is. The dapp will support Uniswap and Saddle pool. --- solidity/dashboard/src/constants/constants.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/solidity/dashboard/src/constants/constants.js b/solidity/dashboard/src/constants/constants.js index dc6a7358e0..a4d0c54e85 100644 --- a/solidity/dashboard/src/constants/constants.js +++ b/solidity/dashboard/src/constants/constants.js @@ -47,6 +47,7 @@ export const LIQUIDITY_REWARD_PAIRS = { label: "TBTC + SADDLE", viewPoolLink: "https://saddle.exchange/#/deposit", address: "0xe6f19dab7d43317344282f803f8e8d240708174a", + pool: "SADDLE", }, KEEP_ETH: { contractName: LP_REWARDS_KEEP_ETH_CONTRACT_NAME, @@ -54,6 +55,7 @@ export const LIQUIDITY_REWARD_PAIRS = { viewPoolLink: "https://info.uniswap.org/pair/0xe6f19dab7d43317344282f803f8e8d240708174a", address: "0xe6f19dab7d43317344282f803f8e8d240708174a", + pool: "UNISWAP", }, KEEP_TBTC: { contractName: LP_REWARDS_KEEP_TBTC_CONTRACT_NAME, @@ -61,6 +63,7 @@ export const LIQUIDITY_REWARD_PAIRS = { viewPoolLink: "https://info.uniswap.org/pair/0x38c8ffee49f286f25d25bad919ff7552e5daf081", address: "0x38c8ffee49f286f25d25bad919ff7552e5daf081", + pool: "UNISWAP", }, TBTC_ETH: { contractName: LP_REWARDS_TBTC_ETH_CONTRACT_NAME, @@ -68,5 +71,6 @@ export const LIQUIDITY_REWARD_PAIRS = { viewPoolLink: "https://info.uniswap.org/pair/0x854056fd40c1b52037166285b2e54fee774d33f6", address: "0x854056fd40c1b52037166285b2e54fee774d33f6", + pool: "UNISWAP", }, } From 3038bacd4fece8fdf511c73bb7f00e45fdf7eec2 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Tue, 19 Jan 2021 17:20:12 +0100 Subject: [PATCH 10/19] Use new liquidity rewards service --- solidity/dashboard/src/actions/web3.js | 2 + .../src/components/LiquidityRewardCard.jsx | 2 + .../src/pages/liquidity/LiquidityPage.jsx | 6 ++ .../dashboard/src/sagas/liquidity-rewards.js | 85 ++++++++++--------- solidity/dashboard/src/sagas/subscriptions.js | 82 +++++++++--------- solidity/dashboard/src/sagas/utils.js | 25 ++++++ 6 files changed, 123 insertions(+), 79 deletions(-) diff --git a/solidity/dashboard/src/actions/web3.js b/solidity/dashboard/src/actions/web3.js index 17eaf4f3dc..808b370817 100644 --- a/solidity/dashboard/src/actions/web3.js +++ b/solidity/dashboard/src/actions/web3.js @@ -195,6 +195,7 @@ export const addMoreLpTokens = ( amount, address, liquidityPairContractName, + pool, meta ) => { return { @@ -203,6 +204,7 @@ export const addMoreLpTokens = ( contractName: liquidityPairContractName, amount, address, + pool, }, meta, } diff --git a/solidity/dashboard/src/components/LiquidityRewardCard.jsx b/solidity/dashboard/src/components/LiquidityRewardCard.jsx index 5b46aa90c5..869ddabb59 100644 --- a/solidity/dashboard/src/components/LiquidityRewardCard.jsx +++ b/solidity/dashboard/src/components/LiquidityRewardCard.jsx @@ -33,6 +33,7 @@ const LiquidityRewardCard = ({ addLpTokens, withdrawLiquidityRewards, isAPYFetching, + pool, }) => { const formattedApy = useMemo(() => { const bn = new BigNumber(apy).multipliedBy(100) @@ -234,6 +235,7 @@ const LiquidityRewardCard = ({ addLpTokens( wrappedTokenBalance, liquidityPairContractName, + pool, awaitingPromise ) } diff --git a/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx b/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx index 376d68346a..61ff8ddbb5 100644 --- a/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx +++ b/solidity/dashboard/src/pages/liquidity/LiquidityPage.jsx @@ -50,6 +50,7 @@ const LiquidityPage = ({ headerTitle }) => { const addLpTokens = ( wrappedTokenBalance, liquidityPairContractName, + pool, awaitingPromise ) => { dispatch( @@ -57,6 +58,7 @@ const LiquidityPage = ({ headerTitle }) => { wrappedTokenBalance, address, liquidityPairContractName, + pool, awaitingPromise ) ) @@ -128,6 +130,7 @@ const LiquidityPage = ({ headerTitle }) => { addLpTokens={addLpTokens} withdrawLiquidityRewards={withdrawLiquidityRewards} isAPYFetching={TBTC_SADDLE.isAPYFetching} + pool={LIQUIDITY_REWARD_PAIRS.TBTC_SADDLE.pool} /> { addLpTokens={addLpTokens} withdrawLiquidityRewards={withdrawLiquidityRewards} isAPYFetching={KEEP_ETH.isAPYFetching} + pool={LIQUIDITY_REWARD_PAIRS.KEEP_ETH.pool} /> { addLpTokens={addLpTokens} withdrawLiquidityRewards={withdrawLiquidityRewards} isAPYFetching={KEEP_TBTC.isAPYFetching} + pool={LIQUIDITY_REWARD_PAIRS.KEEP_TBTC.pool} /> { addLpTokens={addLpTokens} withdrawLiquidityRewards={withdrawLiquidityRewards} isAPYFetching={TBTC_ETH.isAPYFetching} + pool={LIQUIDITY_REWARD_PAIRS.TBTC_ETH.pool} /> diff --git a/solidity/dashboard/src/sagas/liquidity-rewards.js b/solidity/dashboard/src/sagas/liquidity-rewards.js index 2db273b291..9cf8341904 100644 --- a/solidity/dashboard/src/sagas/liquidity-rewards.js +++ b/solidity/dashboard/src/sagas/liquidity-rewards.js @@ -1,18 +1,12 @@ import { takeLatest, takeEvery, fork, call, put } from "redux-saga/effects" -import { getContractsContext, submitButtonHelper, logError } from "./utils" +import { submitButtonHelper, logError, getLPRewardsWrapper } from "./utils" import { sendTransaction } from "./web3" -import { - fetchStakedBalance, - fetchWrappedTokenBalance, - fetchLPRewardsTotalSupply, - fetchRewardBalance, - getWrappedTokenConctract, - calculateAPY, -} from "../services/liquidity-rewards" +import { LiquidityRewardsFactory } from "../services/liquidity-rewards" import { gt, percentageOf, eq } from "../utils/arithmetics.utils" import { LIQUIDITY_REWARD_PAIRS } from "../constants/constants" import { getWsUrl } from "../connectors/utils" import { initializeWeb3, createLPRewardsContract } from "../contracts" +/** @typedef { import("../services/liquidity-rewards").LiquidityRewards} LiquidityRewards */ function* fetchAllLiquidtyRewardsData(action) { const { address } = action.payload @@ -23,9 +17,9 @@ function* fetchAllLiquidtyRewardsData(action) { } function* fetchLiquidityRewardsData(liquidityRewardPair, address) { - const contracts = yield getContractsContext() + /** @type LiquidityRewards */ + const LiquidityRewards = yield getLPRewardsWrapper(liquidityRewardPair) - const LPRewardsContract = contracts[liquidityRewardPair.contractName] try { yield put({ type: `liquidity_rewards/${liquidityRewardPair.name}_fetch_data_start`, @@ -34,22 +28,25 @@ function* fetchLiquidityRewardsData(liquidityRewardPair, address) { // Fetching balance of liquidity token for a given uniswap pair deposited in // the `LPRewards` contract. - const lpBalance = yield call(fetchStakedBalance, address, LPRewardsContract) + const lpBalance = yield call( + [LiquidityRewards, LiquidityRewards.stakedBalance], + address + ) // Fetching balance of liquidity token for a given uniswap pair. const wrappedTokenBalance = yield call( - fetchWrappedTokenBalance, - address, - LPRewardsContract + [LiquidityRewards, LiquidityRewards.wrappedTokenBalance], + address ) let apy = Infinity // Fetching total deposited liqidity tokens in the `LPRewards` contract. - const totalSupply = yield call(fetchLPRewardsTotalSupply, LPRewardsContract) + const totalSupply = yield call([ + LiquidityRewards, + LiquidityRewards.totalSupply, + ]) if (gt(totalSupply, 0)) { apy = yield call( - calculateAPY, - totalSupply, - liquidityRewardPair.name, - LPRewardsContract + [LiquidityRewards, LiquidityRewards.calculateAPY], + totalSupply ) } @@ -57,7 +54,10 @@ function* fetchLiquidityRewardsData(liquidityRewardPair, address) { let shareOfPoolInPercent = 0 if (gt(lpBalance, 0)) { // Fetching available reward balance from `LPRewards` contract. - reward = yield call(fetchRewardBalance, address, LPRewardsContract) + reward = yield call( + [LiquidityRewards, LiquidityRewards.rewardBalance], + address + ) // % of total pool in the `LPRewards` contract. shareOfPoolInPercent = percentageOf(lpBalance, totalSupply).toString() } @@ -90,35 +90,30 @@ export function* watchFetchLiquidityRewardsData() { } function* stakeTokens(action) { - const { contractName, address, amount } = action.payload + const { contractName, address, amount, pool } = action.payload - const contracts = yield getContractsContext() - const LPRewardsContract = contracts[contractName] - const lpRewardsContractAddress = LPRewardsContract.options.address - - const WrappedTokenContract = yield call( - getWrappedTokenConctract, - LPRewardsContract - ) + /** @type LiquidityRewards */ + const LiquidityRewards = yield getLPRewardsWrapper({ contractName, pool }) const approvedAmount = yield call( - WrappedTokenContract.methods.allowance(address, lpRewardsContractAddress) - .call + [LiquidityRewards, LiquidityRewards.wrappedTokenAllowance], + address, + LiquidityRewards.wrappedTokenAddress ) if (!eq(amount, approvedAmount)) { yield call(sendTransaction, { payload: { - contract: WrappedTokenContract, + contract: LiquidityRewards.wrrappedToken, methodName: "approve", - args: [lpRewardsContractAddress, amount], + args: [LiquidityRewards.wrappedTokenAddress, amount], }, }) } yield call(sendTransaction, { payload: { - contract: LPRewardsContract, + contract: LiquidityRewards.LPRewardsContract, methodName: "stake", args: [amount], }, @@ -145,7 +140,6 @@ function* fetchLiquidityRewardsAPY(liquidityRewardPair) { type: `liquidity_rewards/${liquidityRewardPair.name}_fetch_apy_start`, payload: { liquidityRewardPairName: liquidityRewardPair.name }, }) - const web3 = initializeWeb3(getWsUrl()) const LPRewardsContract = yield call( createLPRewardsContract, @@ -153,14 +147,23 @@ function* fetchLiquidityRewardsAPY(liquidityRewardPair) { liquidityRewardPair.contractName ) + /** @type LiquidityRewards */ + const LiquidityRewards = yield call( + [LiquidityRewardsFactory, LiquidityRewardsFactory.initialize], + liquidityRewardPair.pool, + LPRewardsContract, + web3 + ) + let apy = Infinity - const totalSupply = yield call(fetchLPRewardsTotalSupply, LPRewardsContract) + const totalSupply = yield call([ + LiquidityRewards, + LiquidityRewards.totalSupply, + ]) if (gt(totalSupply, 0)) { apy = yield call( - calculateAPY, - totalSupply, - liquidityRewardPair.name, - LPRewardsContract + [LiquidityRewards, LiquidityRewards.calculateAPY], + totalSupply ) } diff --git a/solidity/dashboard/src/sagas/subscriptions.js b/solidity/dashboard/src/sagas/subscriptions.js index 17bf590e6a..4975093ad9 100644 --- a/solidity/dashboard/src/sagas/subscriptions.js +++ b/solidity/dashboard/src/sagas/subscriptions.js @@ -1,18 +1,17 @@ import { fork, take, call, put, select } from "redux-saga/effects" import moment from "moment" import { createSubcribeToContractEventChannel } from "./web3" -import { getContractsContext, getWeb3Context } from "./utils" +import { + getContractsContext, + getWeb3Context, + getLPRewardsWrapper, +} from "./utils" import { createManagedGrantContractInstance } from "../contracts" import { add, sub } from "../utils/arithmetics.utils" import { isSameEthAddress } from "../utils/general.utils" import { getEventsFromTransaction, ZERO_ADDRESS } from "../utils/ethereum.utils" import { LIQUIDITY_REWARD_PAIRS } from "../constants/constants" -import { - fetchRewardBalance, - fetchLPRewardsTotalSupply, - calculateAPY, - getWrappedTokenConctract, -} from "../services/liquidity-rewards" +/** @typedef { import("../services/liquidity-rewards").LiquidityRewards} LiquidityRewards */ export function* subscribeToKeepTokenTransferEvent() { yield take("keep-token/balance_request_success") @@ -606,13 +605,13 @@ export function* subsribeToECDSARewardsClaimedEvent() { } function* observeLiquidityTokenStakedEvent(liquidityRewardPair) { - const contracts = yield getContractsContext() - const LPRewardsContract = contracts[liquidityRewardPair.contractName] + /** @type LiquidityRewards */ + const LiquidityRewards = yield getLPRewardsWrapper(liquidityRewardPair) // Create subscription channel. const contractEventCahnnel = yield call( createSubcribeToContractEventChannel, - LPRewardsContract, + LiquidityRewards.LPRewardsContract, "Staked" ) @@ -622,8 +621,8 @@ function* observeLiquidityTokenStakedEvent(liquidityRewardPair) { yield* lpTokensStakedOrWithdrawn( eventData.returnValues, + LiquidityRewards, liquidityRewardPair.name, - LPRewardsContract, `liquidity_rewards/${liquidityRewardPair.name}_staked` ) } catch (error) { @@ -634,13 +633,13 @@ function* observeLiquidityTokenStakedEvent(liquidityRewardPair) { } function* observeLiquidityTokenWithdrawnEvent(liquidityRewardPair) { - const contracts = yield getContractsContext() - const LPRewardsContract = contracts[liquidityRewardPair.contractName] + /** @type LiquidityRewards */ + const LiquidityRewards = yield getLPRewardsWrapper(liquidityRewardPair) // Create subscription channel. const contractEventCahnnel = yield call( createSubcribeToContractEventChannel, - LPRewardsContract, + LiquidityRewards.LPRewardsContract, "Withdrawn" ) @@ -649,8 +648,8 @@ function* observeLiquidityTokenWithdrawnEvent(liquidityRewardPair) { const eventData = yield take(contractEventCahnnel) yield* lpTokensStakedOrWithdrawn( eventData.returnValues, + LiquidityRewards, liquidityRewardPair.name, - LPRewardsContract, `liquidity_rewards/${liquidityRewardPair.name}_withdrawn` ) } catch (error) { @@ -662,8 +661,9 @@ function* observeLiquidityTokenWithdrawnEvent(liquidityRewardPair) { function* lpTokensStakedOrWithdrawn( eventValues, + /** @type LiquidityRewards */ + LiquidityRewards, liquidityRewardPairName, - LPRewardsContract, actionType ) { const { @@ -671,19 +671,19 @@ function* lpTokensStakedOrWithdrawn( } = yield getWeb3Context() const { user, amount } = eventValues - const totalSupply = yield call(fetchLPRewardsTotalSupply, LPRewardsContract) + const totalSupply = yield call([ + LiquidityRewards, + LiquidityRewards.totalSupply, + ]) const apy = yield call( - calculateAPY, - totalSupply, - liquidityRewardPairName, - LPRewardsContract + [LiquidityRewards, LiquidityRewards.calculateAPY], + totalSupply ) const reward = yield call( - fetchRewardBalance, - defaultAccount, - LPRewardsContract + [LiquidityRewards, LiquidityRewards.rewardBalance], + defaultAccount ) // If the `Withdrawn` or `Staked` event was emitted the total pool of the LPRewards, @@ -702,16 +702,16 @@ function* lpTokensStakedOrWithdrawn( } function* observeLiquidityRewardPaidEvent(liquidityRewardPair) { - const contracts = yield getContractsContext() + /** @type LiquidityRewards */ + const LiquidityRewards = yield getLPRewardsWrapper(liquidityRewardPair) const { eth: { defaultAccount }, } = yield getWeb3Context() - const LPRewardsContract = contracts[liquidityRewardPair.contractName] // Create subscription channel. const contractEventCahnnel = yield call( createSubcribeToContractEventChannel, - LPRewardsContract, + LiquidityRewards.LPRewardsContract, "RewardPaid" ) @@ -738,16 +738,12 @@ function* observeLiquidityRewardPaidEvent(liquidityRewardPair) { } function* observeWrappedTokenMintAndBurnTx(liquidityRewardPair) { - const contracts = yield getContractsContext() - const LPRewardsContract = contracts[liquidityRewardPair.contractName] - const WrappedTokenContract = yield call( - getWrappedTokenConctract, - LPRewardsContract - ) + /** @type LiquidityRewards */ + const LiquidityRewards = yield getLPRewardsWrapper(liquidityRewardPair) const contractEventCahnnel = yield call( createSubcribeToContractEventChannel, - WrappedTokenContract, + LiquidityRewards.wrappedToken, "Transfer" ) @@ -762,7 +758,7 @@ function* observeWrappedTokenMintAndBurnTx(liquidityRewardPair) { // these casese we need to update APY value because the tootal pool value // of the wrapped token has been increased / decresed. if (from === ZERO_ADDRESS || to === ZERO_ADDRESS) { - yield* updateAPY(LPRewardsContract, liquidityRewardPair.name) + yield* updateAPY(LiquidityRewards, liquidityRewardPair.name) } } catch (error) { console.error(`Failed subscribing to Transfer event`, error) @@ -771,10 +767,20 @@ function* observeWrappedTokenMintAndBurnTx(liquidityRewardPair) { } } -function* updateAPY(LPRewardsContract, liquidityRewardPairName) { - const totalSupply = yield call(fetchLPRewardsTotalSupply, LPRewardsContract) +function* updateAPY( + /** @type LiquidityRewards */ + LiquidityRewards, + liquidityRewardPairName +) { + const totalSupply = yield call([ + LiquidityRewards, + LiquidityRewards.totalSupply, + ]) - const apy = yield call(calculateAPY, totalSupply, liquidityRewardPairName) + const apy = yield call( + [LiquidityRewards, LiquidityRewards.calculateAPY], + totalSupply + ) yield put({ type: `liquidity_rewards/${liquidityRewardPairName}_apy_updated`, payload: { diff --git a/solidity/dashboard/src/sagas/utils.js b/solidity/dashboard/src/sagas/utils.js index 4dc7bfed15..795b817d3e 100644 --- a/solidity/dashboard/src/sagas/utils.js +++ b/solidity/dashboard/src/sagas/utils.js @@ -1,5 +1,7 @@ import { call, put } from "redux-saga/effects" import { Web3Loaded, ContractsLoaded } from "../contracts" +import { LiquidityRewardsFactory } from "../services/liquidity-rewards" +/** @typedef { import("../services/liquidity-rewards").LiquidityRewards} LiquidityRewards */ export function* getWeb3Context() { return yield Web3Loaded @@ -37,3 +39,26 @@ export function* logError(errorActionType, error, payload = {}) { error, }) } + +/** + * + * @param {Object} liquidityRewardPair - Liquidity reward data. + * @param {string} liquidityRewardPair.pool - The type of pool. + * @param {string} liquidityRewardPair.contractName - The LPRewards contract + * name for a given liquidity pair. + * @return {LiquidityRewards} Liquidity rewards wrapper. + */ +export function* getLPRewardsWrapper(liquidityRewardPair) { + const contracts = yield getContractsContext() + const web3 = yield getWeb3Context() + + const LPRewardsContract = contracts[liquidityRewardPair.contractName] + const LiquidityRewards = yield call( + [LiquidityRewardsFactory, LiquidityRewardsFactory.initialize], + liquidityRewardPair.pool, + LPRewardsContract, + web3 + ) + + return LiquidityRewards +} From acad997b2bf99e81cbf875cc5458518376ff0e80 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Tue, 19 Jan 2021 19:20:04 +0100 Subject: [PATCH 11/19] Bump keep-ecdsa to 1.6.0 The LPRewardsTBTCSaddle was relased in `v.1.6.0`. --- solidity/dashboard/package-lock.json | 6 +++--- solidity/dashboard/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/solidity/dashboard/package-lock.json b/solidity/dashboard/package-lock.json index c3ddd3bcf6..f96b911c5a 100644 --- a/solidity/dashboard/package-lock.json +++ b/solidity/dashboard/package-lock.json @@ -2458,9 +2458,9 @@ } }, "@keep-network/keep-ecdsa": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@keep-network/keep-ecdsa/-/keep-ecdsa-1.5.0.tgz", - "integrity": "sha512-fFzlyQd1dCm10sdrMDEFcu1gVs7Liycd35AgmeTYLbGGXjwnaZtokkYNT570iZ1mE2pVFPUNYAM52+pPUB7fCg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@keep-network/keep-ecdsa/-/keep-ecdsa-1.6.0.tgz", + "integrity": "sha512-di/o4SGTlBUDbC0XnedDiE2XmvNCRfamsm+9jtO79jLN171bf+c9qr4iq/lxMteW5wZGwd1fziNJiwczXf7YcQ==", "requires": { "@keep-network/keep-core": "1.6.0", "@keep-network/sortition-pools": "1.2.0-pre.3", diff --git a/solidity/dashboard/package.json b/solidity/dashboard/package.json index 5dfc80a0e6..a87eae20fe 100644 --- a/solidity/dashboard/package.json +++ b/solidity/dashboard/package.json @@ -6,7 +6,7 @@ "dependencies": { "@0x/subproviders": "^6.0.8", "@keep-network/keep-core": "1.4.1", - "@keep-network/keep-ecdsa": "1.5.0", + "@keep-network/keep-ecdsa": "1.6.0", "@keep-network/tbtc": "1.1.0", "@ledgerhq/hw-app-eth": "^5.13.0", "@ledgerhq/hw-transport-u2f": "^5.13.0", From 01160d11c566315d9cbb251d58f805700eb7d42c Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Tue, 19 Jan 2021 19:22:23 +0100 Subject: [PATCH 12/19] Add LPRewardsTBTCSaddle contract- dapp --- solidity/dashboard/src/contracts.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/solidity/dashboard/src/contracts.js b/solidity/dashboard/src/contracts.js index 3a4898c1ad..f31d1cc0ab 100644 --- a/solidity/dashboard/src/contracts.js +++ b/solidity/dashboard/src/contracts.js @@ -20,6 +20,7 @@ import ECDSARewardsDistributor from "@keep-network/keep-ecdsa/artifacts/ECDSARew import LPRewardsKEEPETH from "@keep-network/keep-ecdsa/artifacts/LPRewardsKEEPETH.json" import LPRewardsTBTCETH from "@keep-network/keep-ecdsa/artifacts/LPRewardsTBTCETH.json" import LPRewardsKEEPTBTC from "@keep-network/keep-ecdsa/artifacts/LPRewardsKEEPTBTC.json" +import LPRewardsTBTCSaddle from "@keep-network/keep-ecdsa/artifacts/LPRewardsTBTCSaddle.json" import IERC20 from "@keep-network/keep-core/artifacts/IERC20.json" import Web3 from "web3" @@ -41,6 +42,7 @@ import { LP_REWARDS_KEEP_ETH_CONTRACT_NAME, LP_REWARDS_TBTC_ETH_CONTRACT_NAME, LP_REWARDS_KEEP_TBTC_CONTRACT_NAME, + LP_REWARDS_TBTC_SADDLE_CONTRACT_NAME, } from "./constants/constants" export const CONTRACT_DEPLOY_BLOCK_NUMBER = { @@ -118,6 +120,10 @@ const contracts = { artifact: LPRewardsKEEPTBTC, withDeployBlock: true, }, + [LP_REWARDS_TBTC_SADDLE_CONTRACT_NAME]: { + artifact: LPRewardsTBTCSaddle, + withDeployBlock: true, + }, } export async function getKeepTokenContractDeployerAddress(web3) { From 3df6956ecbe20c5cdde45888ce414cbba9dccba6 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Tue, 19 Jan 2021 19:22:48 +0100 Subject: [PATCH 13/19] Add SaddleSwap contract to dapp This contract is required to fetch how many tokenized BTC is in the Saddle pool. --- .../dashboard/src/contracts-artifacts/SaddleSwap.json | 2 ++ solidity/dashboard/src/contracts.js | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 solidity/dashboard/src/contracts-artifacts/SaddleSwap.json diff --git a/solidity/dashboard/src/contracts-artifacts/SaddleSwap.json b/solidity/dashboard/src/contracts-artifacts/SaddleSwap.json new file mode 100644 index 0000000000..4cd0bce88a --- /dev/null +++ b/solidity/dashboard/src/contracts-artifacts/SaddleSwap.json @@ -0,0 +1,2 @@ +{ "abi": [{"inputs":[{"internalType":"contract IERC20[]","name":"_pooledTokens","type":"address[]"},{"internalType":"uint8[]","name":"decimals","type":"uint8[]"},{"internalType":"string","name":"lpTokenName","type":"string"},{"internalType":"string","name":"lpTokenSymbol","type":"string"},{"internalType":"uint256","name":"_a","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_adminFee","type":"uint256"},{"internalType":"uint256","name":"_withdrawFee","type":"uint256"},{"internalType":"contract IAllowlist","name":"_allowlist","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"fees","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"invariant","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpTokenSupply","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAdminFee","type":"uint256"}],"name":"NewAdminFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSwapFee","type":"uint256"}],"name":"NewSwapFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newWithdrawFee","type":"uint256"}],"name":"NewWithdrawFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"initialTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"futureTime","type":"uint256"}],"name":"RampA","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"lpTokenSupply","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"fees","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"invariant","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpTokenSupply","type":"uint256"}],"name":"RemoveLiquidityImbalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"lpTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpTokenSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"boughtId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensBought","type":"uint256"}],"name":"RemoveLiquidityOne","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"currentA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"StopRampA","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensBought","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"soldId","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"boughtId","type":"uint128"}],"name":"TokenSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minToMint","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calculateCurrentWithdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateRemoveLiquidity","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint8","name":"tokenIndex","type":"uint8"}],"name":"calculateRemoveLiquidityOneToken","outputs":[{"internalType":"uint256","name":"availableTokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"}],"name":"calculateSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bool","name":"deposit","type":"bool"}],"name":"calculateTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableGuard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAPrecise","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAdminBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllowlist","outputs":[{"internalType":"contract IAllowlist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getDepositTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTokenIndex","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVirtualPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGuarded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"futureA","type":"uint256"},{"internalType":"uint256","name":"futureTime","type":"uint256"}],"name":"rampA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"maxBurnAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityImbalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint8","name":"tokenIndex","type":"uint8"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityOneToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAdminFee","type":"uint256"}],"name":"setAdminFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWithdrawFee","type":"uint256"}],"name":"setDefaultWithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopRampA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapStorage","outputs":[{"internalType":"uint256","name":"initialA","type":"uint256"},{"internalType":"uint256","name":"futureA","type":"uint256"},{"internalType":"uint256","name":"initialATime","type":"uint256"},{"internalType":"uint256","name":"futureATime","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"adminFee","type":"uint256"},{"internalType":"uint256","name":"defaultWithdrawFee","type":"uint256"},{"internalType":"contract LPToken","name":"lpToken","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"transferAmount","type":"uint256"}],"name":"updateUserWithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAdminFees","outputs":[],"stateMutability":"nonpayable","type":"function"}] +} \ No newline at end of file diff --git a/solidity/dashboard/src/contracts.js b/solidity/dashboard/src/contracts.js index f31d1cc0ab..537b944f98 100644 --- a/solidity/dashboard/src/contracts.js +++ b/solidity/dashboard/src/contracts.js @@ -22,6 +22,7 @@ import LPRewardsTBTCETH from "@keep-network/keep-ecdsa/artifacts/LPRewardsTBTCET import LPRewardsKEEPTBTC from "@keep-network/keep-ecdsa/artifacts/LPRewardsKEEPTBTC.json" import LPRewardsTBTCSaddle from "@keep-network/keep-ecdsa/artifacts/LPRewardsTBTCSaddle.json" import IERC20 from "@keep-network/keep-core/artifacts/IERC20.json" +import SaddleSwap from "./contracts-artifacts/SaddleSwap.json" import Web3 from "web3" import { @@ -323,3 +324,11 @@ export const createLPRewardsContract = async (web3, contractName) => { const { artifact } = contracts[contractName] return await getContract(web3, artifact, {}) } + +export const createSaddleSwapContract = (web3) => { + return createWeb3ContractInstance( + web3, + SaddleSwap.abi, + "0x4f6A43Ad7cba042606dECaCA730d4CE0A57ac62e" + ) +} From 3ae439f5ea5912abfa810606070c49ef676a41f9 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Tue, 19 Jan 2021 20:08:40 +0100 Subject: [PATCH 14/19] Calculate APY for Saddle pool --- .../src/services/liquidity-rewards.js | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/solidity/dashboard/src/services/liquidity-rewards.js b/solidity/dashboard/src/services/liquidity-rewards.js index 2426521335..fa73ae80db 100644 --- a/solidity/dashboard/src/services/liquidity-rewards.js +++ b/solidity/dashboard/src/services/liquidity-rewards.js @@ -1,5 +1,5 @@ import web3Utils from "web3-utils" -import { createERC20Contract } from "../contracts" +import { createERC20Contract, createSaddleSwapContract } from "../contracts" import BigNumber from "bignumber.js" import { toTokenUnit } from "../utils/token.utils" import { @@ -8,6 +8,7 @@ import { getBTCPriceInUSD, } from "./uniswap-api" import moment from "moment" +import { add } from "../utils/arithmetics.utils" /** @typedef {import("web3").default} Web3 */ /** @typedef {LiquidityRewards} LiquidityRewards */ @@ -16,9 +17,10 @@ const LPRewardsToWrappedTokenCache = {} const WEEKS_IN_YEAR = 52 class LiquidityRewards { - constructor(_wrappedTokenContract, _LPRewardsContract) { + constructor(_wrappedTokenContract, _LPRewardsContract, _web3) { this.wrappedToken = _wrappedTokenContract this.LPRewardsContract = _LPRewardsContract + this.web3 = _web3 } get wrappedTokenAddress() { @@ -119,26 +121,42 @@ class UniswapLPRewards extends LiquidityRewards { } class SaddleLPRewards extends LiquidityRewards { + BTC_POOL_TOKENS = [ + { name: "TBTC", decimals: 18 }, + { name: "WBTC", decimals: 8 }, + { name: "RENBTC", decimals: 8 }, + { name: "SBTC", decimals: 18 }, + ] + + constructor(_wrappedTokenContract, _LPRewardsContract, _web3) { + super(_wrappedTokenContract, _LPRewardsContract, _web3) + this.swapContract = createSaddleSwapContract(this.web3) + } + + swapContract = null + calculateAPY = async (totalSupplyOfLPRewards) => { totalSupplyOfLPRewards = toTokenUnit(totalSupplyOfLPRewards) - const wrappedTokenTotalSupply = await this.wrappedTokenTotalSupply() + const wrappedTokenTotalSupply = toTokenUnit( + await this.wrappedTokenTotalSupply() + ) + + const BTCInPool = await this._getBTCInPool() const BTCPriceInUSD = await getBTCPriceInUSD() - // TODO fetch total Bitcoins deposited in the wrapped token pool - const totalBitcoinDepositedInWrappedTokenPool = 0 const wrappedTokenPoolInUSD = BTCPriceInUSD.multipliedBy( - totalBitcoinDepositedInWrappedTokenPool + toTokenUnit(BTCInPool) ) - const rewardPoolPerWeek = await this.rewardPoolPerWeek() + const keepTokenInUSD = await getKeepTokenPriceInUSD() + + const rewardPoolPerWeek = 125000 // await this.rewardPoolPerWeek() const lpRewardsPoolInUSD = totalSupplyOfLPRewards .multipliedBy(wrappedTokenPoolInUSD) .div(wrappedTokenTotalSupply) - const keepTokenInUSD = await getKeepTokenPriceInUSD() - const r = this._calculateR( keepTokenInUSD, rewardPoolPerWeek, @@ -147,6 +165,23 @@ class SaddleLPRewards extends LiquidityRewards { return this._calculateAPY(r, WEEKS_IN_YEAR) } + + _getBTCInPool = async () => { + return ( + await Promise.all( + this.BTC_POOL_TOKENS.map(async (token, i) => { + const balance = await this._getTokenBalance(i) + return new BigNumber(10) + .pow(18 - token.decimals) // cast all to 18 decimals + .multipliedBy(balance) + }) + ) + ).reduce(add, 0) + } + + _getTokenBalance = async (index) => { + return await this.swapContract.methods.getTokenBalance(index).call() + } } const LiquidityRewardsPoolStrategy = { @@ -182,6 +217,6 @@ export class LiquidityRewardsFactory { LPRewardsToWrappedTokenCache[lpRewardsContractAddress] const PoolStrategy = LiquidityRewardsPoolStrategy[pool] - return new PoolStrategy(wrappedTokenContract, LPRewardsContract) + return new PoolStrategy(wrappedTokenContract, LPRewardsContract, web3) } } From a93f7b82574dce61600f11751aed7be9a4782c8f Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Tue, 19 Jan 2021 20:12:14 +0100 Subject: [PATCH 15/19] Add `alt` prop to Saddle icon --- solidity/dashboard/src/components/Icons.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/solidity/dashboard/src/components/Icons.jsx b/solidity/dashboard/src/components/Icons.jsx index f15990f4d0..56da2c824b 100644 --- a/solidity/dashboard/src/components/Icons.jsx +++ b/solidity/dashboard/src/components/Icons.jsx @@ -334,6 +334,7 @@ const Saddle = ({ className }) => { }} className={className} src={require("../static/svg/Saddle_logomark_blue.png")} + alt="Saddle Logo" /> ) } From 9c7b174586a4ee72b7136cfe853cbda4b5757dc4 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Tue, 19 Jan 2021 21:06:16 +0100 Subject: [PATCH 16/19] Fix typo wrrappedToken -> wrappedToken --- solidity/dashboard/src/sagas/liquidity-rewards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solidity/dashboard/src/sagas/liquidity-rewards.js b/solidity/dashboard/src/sagas/liquidity-rewards.js index 9cf8341904..ac04d62bd0 100644 --- a/solidity/dashboard/src/sagas/liquidity-rewards.js +++ b/solidity/dashboard/src/sagas/liquidity-rewards.js @@ -104,7 +104,7 @@ function* stakeTokens(action) { if (!eq(amount, approvedAmount)) { yield call(sendTransaction, { payload: { - contract: LiquidityRewards.wrrappedToken, + contract: LiquidityRewards.wrappedToken, methodName: "approve", args: [LiquidityRewards.wrappedTokenAddress, amount], }, From e943f412dc14442dbf415f8f6311ae9c0c572cca Mon Sep 17 00:00:00 2001 From: michalsmiarowski Date: Tue, 19 Jan 2021 22:10:25 +0100 Subject: [PATCH 17/19] Remove address from LIQUIDITY_REWARD_PAIRS --- solidity/dashboard/src/constants/constants.js | 1 - 1 file changed, 1 deletion(-) diff --git a/solidity/dashboard/src/constants/constants.js b/solidity/dashboard/src/constants/constants.js index a4d0c54e85..ddf5b563d3 100644 --- a/solidity/dashboard/src/constants/constants.js +++ b/solidity/dashboard/src/constants/constants.js @@ -46,7 +46,6 @@ export const LIQUIDITY_REWARD_PAIRS = { contractName: LP_REWARDS_TBTC_SADDLE_CONTRACT_NAME, label: "TBTC + SADDLE", viewPoolLink: "https://saddle.exchange/#/deposit", - address: "0xe6f19dab7d43317344282f803f8e8d240708174a", pool: "SADDLE", }, KEEP_ETH: { From 4d2efb36dd85a65ad0b2151ad3cf1a4a8b10a345 Mon Sep 17 00:00:00 2001 From: michalsmiarowski Date: Tue, 19 Jan 2021 22:18:40 +0100 Subject: [PATCH 18/19] Remove the repeated 'the' word from tooltip --- solidity/dashboard/src/components/LiquidityRewardCard.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solidity/dashboard/src/components/LiquidityRewardCard.jsx b/solidity/dashboard/src/components/LiquidityRewardCard.jsx index 869ddabb59..55df2a563b 100644 --- a/solidity/dashboard/src/components/LiquidityRewardCard.jsx +++ b/solidity/dashboard/src/components/LiquidityRewardCard.jsx @@ -163,7 +163,7 @@ const LiquidityRewardCard = ({ > Uniswap subgraph API -  to fetch the the total pool value and KEEP token in USD. +  to fetch the total pool value and KEEP token in USD. {isAPYFetching ? ( From f39ca99dd954b0079f8cb480ac719a870e3953e8 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Tue, 19 Jan 2021 22:39:19 +0100 Subject: [PATCH 19/19] Fix staking in LPRewards contract- dapp --- solidity/dashboard/src/sagas/liquidity-rewards.js | 4 ++-- solidity/dashboard/src/services/liquidity-rewards.js | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/solidity/dashboard/src/sagas/liquidity-rewards.js b/solidity/dashboard/src/sagas/liquidity-rewards.js index ac04d62bd0..bedbf0cb9a 100644 --- a/solidity/dashboard/src/sagas/liquidity-rewards.js +++ b/solidity/dashboard/src/sagas/liquidity-rewards.js @@ -98,7 +98,7 @@ function* stakeTokens(action) { const approvedAmount = yield call( [LiquidityRewards, LiquidityRewards.wrappedTokenAllowance], address, - LiquidityRewards.wrappedTokenAddress + LiquidityRewards.LPRewardsContractAddress ) if (!eq(amount, approvedAmount)) { @@ -106,7 +106,7 @@ function* stakeTokens(action) { payload: { contract: LiquidityRewards.wrappedToken, methodName: "approve", - args: [LiquidityRewards.wrappedTokenAddress, amount], + args: [LiquidityRewards.LPRewardsContractAddress, amount], }, }) } diff --git a/solidity/dashboard/src/services/liquidity-rewards.js b/solidity/dashboard/src/services/liquidity-rewards.js index fa73ae80db..517c1bbde7 100644 --- a/solidity/dashboard/src/services/liquidity-rewards.js +++ b/solidity/dashboard/src/services/liquidity-rewards.js @@ -27,6 +27,10 @@ class LiquidityRewards { return this.wrappedToken.options.address } + get LPRewardsContractAddress() { + return this.LPRewardsContract.options.address + } + wrappedTokenBalance = async (address) => { return await this.wrappedToken.methods.balanceOf(address).call() }