diff --git a/app/javascript/src/abi/sousChef.json b/app/javascript/src/abi/sousChef.json new file mode 100644 index 0000000..a760778 --- /dev/null +++ b/app/javascript/src/abi/sousChef.json @@ -0,0 +1 @@ +[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenRecovered","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolLimitPerUser","type":"uint256"}],"name":"NewPoolLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"NewRewardPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewStartAndEndBlocks","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"RewardsStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SMART_CHEF_FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasUserLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IBEP20","name":"_stakedToken","type":"address"},{"internalType":"contract IBEP20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"},{"internalType":"address","name":"_admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardBlock","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":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLimitPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverWrongTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasUserLimit","type":"bool"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"}],"name":"updatePoolLimitPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"}],"name":"updateStartAndEndBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/app/javascript/src/pages/Home/Pool.tsx b/app/javascript/src/pages/Home/Pool.tsx index 2e37b26..35f06ac 100644 --- a/app/javascript/src/pages/Home/Pool.tsx +++ b/app/javascript/src/pages/Home/Pool.tsx @@ -7,6 +7,9 @@ import { getApr } from "../../utils/apr"; import { getPriceInBusd } from "../../utils/getPrice"; import { getTotalStaked } from "../../utils/getTotalStaked"; import { StakeOrderModal } from "./StakeOrderModal"; +import { ethers } from "ethers"; +import sousChef from "../../abi/sousChef.json" +import { getEndBlock } from "../../utils/getEndBlock"; type PoolProps = { pool: PoolConfig; @@ -29,6 +32,14 @@ export const Pool: FC = ({ pool, balance }) => { React.useEffect(() => { (async () => { + + const chef = new ethers.Contract( + pool.contractAddress[56], + new ethers.utils.Interface(sousChef), + provider + ); + + const stakingPrice = await getPriceInBusd(router, pool.stakingToken); const earningPrice = await getPriceInBusd(router, pool.earningToken); diff --git a/app/javascript/src/pages/Home/PoolListing.tsx b/app/javascript/src/pages/Home/PoolListing.tsx index a1cb443..6623399 100644 --- a/app/javascript/src/pages/Home/PoolListing.tsx +++ b/app/javascript/src/pages/Home/PoolListing.tsx @@ -1,12 +1,22 @@ import { graphql } from "babel-plugin-relay/macro"; -import React from "react"; +import React, { useEffect, useMemo, useState } from "react"; import { useLazyLoadQuery } from "react-relay"; import { pools } from "../../constants/Pools"; +import { useBsc } from "../../contexts/BscProvider"; +import { PoolConfig } from "../../types"; import { Pool } from "./Pool"; +import { ethers } from "ethers"; +import sousChef from "../../abi/sousChef.json" +import { getEndBlock } from "../../utils/getEndBlock"; import type { PoolListingQuery } from "./__generated__/PoolListingQuery.graphql"; export const PoolListing = () => { + const { + provider + } = useBsc(); + const [validPools, setValidPools] = useState([]) + const { currentUser } = useLazyLoadQuery( graphql` query PoolListingQuery { @@ -22,9 +32,43 @@ export const PoolListing = () => { const balance = currentUser?.balance.amount ?? "0"; + const getChef = (pool: PoolConfig) => { + return new ethers.Contract( + pool.contractAddress[56], + new ethers.utils.Interface(sousChef), + provider + ); + } + + useEffect(() => { + (async() => { + const blockNumber = await provider.getBlockNumber() + console.log(blockNumber) + const valids: PoolConfig[] = [] + + for(let pool of pools) { + if(pool.sousId === 0) { + valids.push(pool) + setValidPools([...valids]) + continue + } + try { + const chef = getChef(pool) + const endBlock = await getEndBlock(chef) + if(endBlock >= blockNumber) { + valids.push(pool) + setValidPools([...valids]) + } + } catch(e) { + console.log(e) + } + } + })() + }, []) + return (
- {pools + {validPools .filter((pool) => !pool.isFinished) .sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0)) .map((pool) => ( diff --git a/app/javascript/src/utils/getEndBlock.ts b/app/javascript/src/utils/getEndBlock.ts new file mode 100644 index 0000000..93c0d75 --- /dev/null +++ b/app/javascript/src/utils/getEndBlock.ts @@ -0,0 +1,14 @@ + +import type { Contract } from "ethers"; +import { ethers } from "ethers"; + +import { tokens } from "../constants/pancake/Tokens"; +import type { Token } from "../constants/pancake/Tokens"; + +export const getEndBlock = async (sousChef: Contract) => { + try { + return sousChef.bonusEndBlock(); + } catch { + return 0; + } +}; diff --git a/erd.svg b/erd.svg index ff3afa3..77ee004 100644 --- a/erd.svg +++ b/erd.svg @@ -1,7 +1,7 @@ -