Skip to content

Commit

Permalink
move fromBlock and improve fetch players assets hook
Browse files Browse the repository at this point in the history
  • Loading branch information
MattPereira committed Nov 30, 2023
1 parent 439bd4d commit a205d79
Show file tree
Hide file tree
Showing 10 changed files with 167 additions and 178 deletions.
2 changes: 0 additions & 2 deletions packages/hardhat/contracts/Market.sol
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,6 @@ contract Market is VRFConsumerBaseV2, AutomationCompatibleInterface, Ownable {
);

if (currentRound.number < 3) {
// prepare for next round
currentRound.number += 1;
currentRound.state = RoundState.OPEN;
lastTimestamp = block.timestamp;
Expand All @@ -350,7 +349,6 @@ contract Market is VRFConsumerBaseV2, AutomationCompatibleInterface, Ownable {
block.timestamp
);
} else {
// ends the contest
currentRound.state = RoundState.CLOSED;
currentContest.state = ContestState.CLOSED;
emit ContestClosed(currentContest.number, block.timestamp);
Expand Down
2 changes: 1 addition & 1 deletion packages/nextjs/components/SwitchTheme.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export const SwitchTheme = ({ className }: { className?: string }) => {
href="https://mumbaifaucet.com/"
target="_blank"
rel="noopener noreferrer"
className="btn btn-outline rounded-md btn-sm text-lg capitalize"
className="btn btn-primary rounded-md btn-sm text-lg capitalize"
>
Mumbai Faucet
</a>
Expand Down
156 changes: 9 additions & 147 deletions packages/nextjs/components/vaults-of-fortune/Leaderboard.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { useEffect, useState } from "react";
import { formatEther } from "viem";
import { usePublicClient } from "wagmi";
import { Address } from "~~/components/scaffold-eth";
import {
useDeployedContractInfo, // useScaffoldContractRead,
// useScaffoldEventHistory,
// useScaffoldEventSubscriber,
} from "~~/hooks/scaffold-eth";
import { useFetchPlayersAssets } from "~~/hooks/vaults-of-fortune";

// import {
// useScaffoldContractRead,
// useScaffoldEventHistory,
// useScaffoldEventSubscriber,
// } from "~~/hooks/scaffold-eth";

// interface IPlayerScores {
// contestNumber: number | undefined;
Expand All @@ -16,147 +16,9 @@ import {
// blockNumber: bigint;
// }

interface IPlayersAssets {
player: string;
totalAssets: bigint;
}

const maxWithdrawABI = [
{
inputs: [
{
internalType: "address",
name: "owner",
type: "address",
},
],
name: "maxWithdraw",
outputs: [
{
internalType: "uint256",
name: "",
type: "uint256",
},
],
stateMutability: "view",
type: "function",
},
];

const balanceOfABI = [
{
inputs: [
{
internalType: "address",
name: "account",
type: "address",
},
],
name: "balanceOf",
outputs: [
{
internalType: "uint256",
name: "",
type: "uint256",
},
],
stateMutability: "view",
type: "function",
},
];

const lowAddr = "0xFd22CFe7977ec28909e3f4867dF9962Ce5BFD861";
const mediumAddr = "0xFe3f176aDC15008d3e79181803a689572b8D3730";
const highAddr = "0xbDD01425dC5B72b84730411d344359Bf667BA6AA";
const goldAddr = "0x85D3B09cbA4f5994102435caD33f27f00E7f00CB";
const marketAddr = "0x51f83e8653e198A089c41F61f8De1791140a9d03";

export const Leaderboard = () => {
const [playersAssets, setPlayersAssets] = useState<IPlayersAssets[]>([]);
const publicClient = usePublicClient();
const { data: MarketContract } = useDeployedContractInfo("Market");
const { data: LowRiskContract } = useDeployedContractInfo("LowRiskVault");
const { data: MediumRiskContract } = useDeployedContractInfo("MediumRiskVault");
const { data: HighRiskContract } = useDeployedContractInfo("HighRiskVault");
const { data: GoldContract } = useDeployedContractInfo("GoldToken");

useEffect(() => {
async function getPlayers() {
const players = await publicClient.readContract({
address: MarketContract?.address || marketAddr,
abi: [
{
inputs: [],
name: "getPlayers",
outputs: [
{
internalType: "address[]",
name: "",
type: "address[]",
},
],
stateMutability: "view",
type: "function",
},
],
functionName: "getPlayers",
});

const scores = players.map(async player => {
const lowRiskAssets = (await publicClient.readContract({
address: LowRiskContract?.address || lowAddr,
abi: maxWithdrawABI,
functionName: "maxWithdraw",
args: [player],
})) as bigint;

const mediumRiskAssets = (await publicClient.readContract({
address: MediumRiskContract?.address || mediumAddr,
abi: maxWithdrawABI,
functionName: "maxWithdraw",
args: [player],
})) as bigint;

const highRiskAssets = (await publicClient.readContract({
address: HighRiskContract?.address || highAddr,
abi: maxWithdrawABI,
functionName: "maxWithdraw",
args: [player],
})) as bigint;

const goldBalance = (await publicClient.readContract({
address: GoldContract?.address || goldAddr,
abi: balanceOfABI,
functionName: "balanceOf",
args: [player],
})) as bigint;

const totalAssets = lowRiskAssets + mediumRiskAssets + highRiskAssets + goldBalance;

return { player, totalAssets };
});

const playerScores = await Promise.all(scores);

playerScores.sort((a, b) => {
if (a.totalAssets < b.totalAssets) {
return 1;
}
if (a.totalAssets > b.totalAssets) {
return -1;
}
return 0;
});
setPlayersAssets(playerScores);
// console.log("playerScores", formatEther(playerScores[0].totalAssets));
}

getPlayers();
}, [publicClient, MarketContract, LowRiskContract, MediumRiskContract, HighRiskContract, GoldContract]);

console.log("playersAssets", playersAssets);
const { playersAssets } = useFetchPlayersAssets();

///////////////////////////////////////////////////////////////////////
// const [playersScores, setPlayersScores] = useState<IPlayerScores[]>([]);

// const { data: currentContestNumber } = useScaffoldContractRead({
Expand All @@ -172,7 +34,7 @@ export const Leaderboard = () => {
// const { data: events, isLoading: isLoadingEvents } = useScaffoldEventHistory({
// contractName: "Market",
// eventName: "PlayerTotalAssetUpdate",
// fromBlock: 0n,
// fromBlock: 43002321n,
// // Apply filters to the event based on parameter names and values { [parameterName]: value },
// filters: {
// contestNumber: currentContestNumber,
Expand Down
5 changes: 2 additions & 3 deletions packages/nextjs/components/vaults-of-fortune/Portfolio.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,10 @@ export const Portfolio = () => {
transform: "translate(-50%, -50%)",
zIndex: 10,
}}
className="btn btn-accent px-5 h-24 w-24 text-xl capitalize"
className="btn btn-primary px-5 h-24 w-24 text-xl capitalize"
onClick={() => startClosing()}
>
Ready
Panic
</button>
)}
</div>
Expand All @@ -148,7 +148,6 @@ export const Portfolio = () => {
</>
) : (
<div className="text-center h-full flex flex-col justify-center items-center">
<p className="text-2xl mb-10">May the odds be ever in your favor</p>
<button
className="px-10 py-5 capitalize text-2xl rounded-full bg-[#4e389c51] hover:bg-[#4e389c69] hover:font-semibold border-2 border-[#6c4ed9ff]"
onClick={() => enterContest()}
Expand Down
4 changes: 3 additions & 1 deletion packages/nextjs/components/vaults-of-fortune/Round.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -128,14 +128,16 @@ const RoiTable = () => {
contractName: "Market",
eventName: "RoundROIResults",
// Specify the starting block number from which to read events, this is a bigint.
fromBlock: 0n,
fromBlock: 43000000n,
blockData: true,
// Apply filters to the event based on parameter names and values { [parameterName]: value },
filters: { contestNumber: currentContest },
transactionData: true,
receiptData: true,
});

console.log("ROUND ROI events", events);

useScaffoldEventSubscriber({
contractName: "Market",
eventName: "ContestOpened",
Expand Down
2 changes: 1 addition & 1 deletion packages/nextjs/components/vaults-of-fortune/Vaults.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ export const Vaults = () => {
<div className="flex justify-between items-center mb-3 gap-5 xl:gap-10">
<h2 className="mb-3 ml-3 text-3xl xl:text-4xl font-cubano text-center">{vault.title}</h2>
<div>
<h6 className="text-center text-xl mb-3 bg-base-200 py-5 rounded-xl w-40">
<h6 className="text-center text-2xl mb-3 bg-base-200 py-5 rounded-xl w-44">
<span
className={`mr-1 font-bold ${Number(vault.minimumROI) < 0 ? "text-red-500" : "text-green-500"}`}
>
Expand Down
1 change: 1 addition & 0 deletions packages/nextjs/hooks/vaults-of-fortune/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./useFetchPlayersAssets";
97 changes: 97 additions & 0 deletions packages/nextjs/hooks/vaults-of-fortune/useFetchPlayersAssets.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import { useEffect, useState } from "react";
import { usePublicClient } from "wagmi";
import deployedContracts from "~~/contracts/deployedContracts";
import {
// useDeployedContractInfo,
useScaffoldContractRead,
} from "~~/hooks/scaffold-eth";

// import { GenericContractsDeclaration } from "~~/utils/scaffold-eth/contract";

interface IPlayersAssets {
player: string;
totalAssets: bigint;
}

/**
* @NOTICE hardcoding chainID 80001 for now
*/

export function useFetchPlayersAssets() {
const [playersAssets, setPlayersAssets] = useState<IPlayersAssets[]>([]);
const publicClient = usePublicClient();

console.log("deployedContracts", deployedContracts);

const { data: players } = useScaffoldContractRead({
contractName: "Market",
functionName: "getPlayers",
});

useEffect(() => {
async function getPlayers() {
// THIS DOES NOT WORK BECAUSE CONTRACTS.CONTRACT_NAME.ABI will be inaccessable through type checker
// const chainId = await publicClient.getChainId();
// const contracts = (deployedContracts as GenericContractsDeclaration)[chainId]
const contracts = deployedContracts[80001];

console.log("contract AVI", contracts.Market.abi);
const players = await publicClient.readContract({
address: contracts.Market.address,
abi: contracts.Market.abi,
functionName: "getPlayers",
});

const scores = players.map(async player => {
const lowRiskAssets = (await publicClient.readContract({
address: contracts.LowRiskVault.address,
abi: contracts.LowRiskVault.abi,
functionName: "maxWithdraw",
args: [player],
})) as bigint;

const mediumRiskAssets = (await publicClient.readContract({
address: contracts.MediumRiskVault.address,
abi: contracts.MediumRiskVault.abi,
functionName: "maxWithdraw",
args: [player],
})) as bigint;

const highRiskAssets = (await publicClient.readContract({
address: contracts.HighRiskVault.address,
abi: contracts.HighRiskVault.abi,
functionName: "maxWithdraw",
args: [player],
})) as bigint;

const goldBalance = (await publicClient.readContract({
address: contracts.GoldToken.address,
abi: contracts.GoldToken.abi,
functionName: "balanceOf",
args: [player],
})) as bigint;

const totalAssets = lowRiskAssets + mediumRiskAssets + highRiskAssets + goldBalance;

return { player, totalAssets };
});

const playerScores = await Promise.all(scores);

playerScores.sort((a, b) => {
if (a.totalAssets < b.totalAssets) {
return 1;
}
if (a.totalAssets > b.totalAssets) {
return -1;
}
return 0;
});
setPlayersAssets(playerScores);
}

getPlayers();
}, [publicClient, players]);

return { playersAssets };
}
2 changes: 1 addition & 1 deletion packages/nextjs/pages/contest.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ const CurrentContest: NextPage = () => {
listener: logs => {
logs.map(log => {
const { roundNumber } = log.args;
setShowRoundStartModal(true);
setRoundNumber(Number(roundNumber));
setShowRoundStartModal(true);
});
},
});
Expand Down
Loading

0 comments on commit a205d79

Please sign in to comment.