diff --git a/src/abis/reward.ts b/src/abis/reward.ts index fe69460..4bdde06 100644 --- a/src/abis/reward.ts +++ b/src/abis/reward.ts @@ -1 +1,138 @@ -export const rewardABI = [{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claim","inputs":[{"name":"_poolId","type":"uint8","internalType":"uint8"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_proof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createRewardPool","inputs":[{"name":"_rewardPool","type":"tuple","internalType":"struct Reward.RewardPool","components":[{"name":"unlocked","type":"bool","internalType":"bool"},{"name":"rewardToken","type":"address","internalType":"address"},{"name":"whitelistRoot","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"emergencyWithdraw","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"rewardPools","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"unlocked","type":"bool","internalType":"bool"},{"name":"rewardToken","type":"address","internalType":"address"},{"name":"whitelistRoot","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateRewardPool","inputs":[{"name":"_poolId","type":"uint8","internalType":"uint8"},{"name":"_pool","type":"tuple","internalType":"struct Reward.RewardPool","components":[{"name":"unlocked","type":"bool","internalType":"bool"},{"name":"rewardToken","type":"address","internalType":"address"},{"name":"whitelistRoot","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"userRewards","inputs":[{"name":"","type":"uint8","internalType":"uint8"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RewardClaimed","inputs":[{"name":"poolId","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RewardPoolCreated","inputs":[{"name":"poolId","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"unlocked","type":"bool","indexed":false,"internalType":"bool"},{"name":"rewardToken","type":"address","indexed":false,"internalType":"address"},{"name":"whitelistRoot","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RewardPoolUpdated","inputs":[{"name":"poolId","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"unlocked","type":"bool","indexed":false,"internalType":"bool"},{"name":"rewardToken","type":"address","indexed":false,"internalType":"address"},{"name":"whitelistRoot","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false}] as const +export const rewardABI = [ + { type: 'constructor', inputs: [], stateMutability: 'nonpayable' }, + { + type: 'function', + name: 'claim', + inputs: [ + { name: '_poolId', type: 'uint8', internalType: 'uint8' }, + { name: '_amount', type: 'uint256', internalType: 'uint256' }, + { name: '_proof', type: 'bytes32[]', internalType: 'bytes32[]' }, + ], + outputs: [], + stateMutability: 'nonpayable', + }, + { + type: 'function', + name: 'createRewardPool', + inputs: [ + { + name: '_rewardPool', + type: 'tuple', + internalType: 'struct Reward.RewardPool', + components: [ + { name: 'unlocked', type: 'bool', internalType: 'bool' }, + { name: 'rewardToken', type: 'address', internalType: 'address' }, + { name: 'whitelistRoot', type: 'bytes32', internalType: 'bytes32' }, + ], + }, + ], + outputs: [], + stateMutability: 'nonpayable', + }, + { + type: 'function', + name: 'emergencyWithdraw', + inputs: [ + { name: '_token', type: 'address', internalType: 'address' }, + { name: '_amount', type: 'uint256', internalType: 'uint256' }, + ], + outputs: [], + stateMutability: 'nonpayable', + }, + { + type: 'function', + name: 'owner', + inputs: [], + outputs: [{ name: '', type: 'address', internalType: 'address' }], + stateMutability: 'view', + }, + { type: 'function', name: 'renounceOwnership', inputs: [], outputs: [], stateMutability: 'nonpayable' }, + { + type: 'function', + name: 'rewardPools', + inputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], + outputs: [ + { name: 'unlocked', type: 'bool', internalType: 'bool' }, + { name: 'rewardToken', type: 'address', internalType: 'address' }, + { name: 'whitelistRoot', type: 'bytes32', internalType: 'bytes32' }, + ], + stateMutability: 'view', + }, + { + type: 'function', + name: 'transferOwnership', + inputs: [{ name: 'newOwner', type: 'address', internalType: 'address' }], + outputs: [], + stateMutability: 'nonpayable', + }, + { + type: 'function', + name: 'updateRewardPool', + inputs: [ + { name: '_poolId', type: 'uint8', internalType: 'uint8' }, + { + name: '_pool', + type: 'tuple', + internalType: 'struct Reward.RewardPool', + components: [ + { name: 'unlocked', type: 'bool', internalType: 'bool' }, + { name: 'rewardToken', type: 'address', internalType: 'address' }, + { name: 'whitelistRoot', type: 'bytes32', internalType: 'bytes32' }, + ], + }, + ], + outputs: [], + stateMutability: 'nonpayable', + }, + { + type: 'function', + name: 'userRewards', + inputs: [ + { name: '', type: 'uint8', internalType: 'uint8' }, + { name: '', type: 'address', internalType: 'address' }, + ], + outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], + stateMutability: 'view', + }, + { + type: 'event', + name: 'OwnershipTransferred', + inputs: [ + { name: 'previousOwner', type: 'address', indexed: true, internalType: 'address' }, + { name: 'newOwner', type: 'address', indexed: true, internalType: 'address' }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'RewardClaimed', + inputs: [ + { name: 'poolId', type: 'uint8', indexed: true, internalType: 'uint8' }, + { name: 'account', type: 'address', indexed: true, internalType: 'address' }, + { name: 'amount', type: 'uint256', indexed: false, internalType: 'uint256' }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'RewardPoolCreated', + inputs: [ + { name: 'poolId', type: 'uint8', indexed: true, internalType: 'uint8' }, + { name: 'unlocked', type: 'bool', indexed: false, internalType: 'bool' }, + { name: 'rewardToken', type: 'address', indexed: false, internalType: 'address' }, + { name: 'whitelistRoot', type: 'bytes32', indexed: false, internalType: 'bytes32' }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'RewardPoolUpdated', + inputs: [ + { name: 'poolId', type: 'uint8', indexed: true, internalType: 'uint8' }, + { name: 'unlocked', type: 'bool', indexed: false, internalType: 'bool' }, + { name: 'rewardToken', type: 'address', indexed: false, internalType: 'address' }, + { name: 'whitelistRoot', type: 'bytes32', indexed: false, internalType: 'bytes32' }, + ], + anonymous: false, + }, +] as const; diff --git a/src/app/stake/page.tsx b/src/app/stake/page.tsx index e75a2ac..4444184 100644 --- a/src/app/stake/page.tsx +++ b/src/app/stake/page.tsx @@ -1,4 +1,4 @@ -'use client' +'use client'; import { useState } from 'react'; import { useAccount } from 'wagmi'; @@ -14,7 +14,7 @@ export default function Stake() { const [isOpen, setIsOpen] = useState(false); const { address } = useAccount(); return ( -
+
{ const { data } = await stakeAPI.getUserInfo(address as string, "1"); return data }, - }) + queryKey: ['profile', address], + queryFn: async () => { + const { data } = await stakeAPI.getUserInfo(address as string, '1'); + return data; + }, + }); - const rewardPool = data?.reward_pool?.find((pool: any) => pool.name === rewardToken) + const rewardPool = data?.reward_pool?.find((pool: any) => pool.name === rewardToken); - return
- right -
Estimated Rewards
-
- { - rewardToken === 'rss3' ? : - } -
-
{Number(rewardPool?.amount).toFixed(2) || 0}
-
{rewardToken === 'rss3' ? "RSS3" : "TON"}
+ return ( +
+ right +
Estimated Rewards
+
+ {rewardToken === 'rss3' ? : } +
+
+ {Number(rewardPool?.amount).toFixed(2) || 0} +
+
{rewardToken === 'rss3' ? 'RSS3' : 'TON'}
+
+ { + if (!rewardPool) return; + writeContract({ + ...REWARD_CONTRACT, + functionName: 'claim', + args: [rewardPool.reward_pool_id, BigInt(rewardPool.big_amount), [rewardPool.proof]], + }); + }} + > + Claim +
- { - if (!rewardPool) return - writeContract({ - ...REWARD_CONTRACT, - functionName: 'claim', - args: [rewardPool.reward_pool_id, BigInt(rewardPool.big_amount), [rewardPool.proof]], - }) - }} > - Claim - -
+ ); } diff --git a/src/components/Header/ConnectWalletButton.tsx b/src/components/Header/ConnectWalletButton.tsx index d12d66e..1d071ef 100644 --- a/src/components/Header/ConnectWalletButton.tsx +++ b/src/components/Header/ConnectWalletButton.tsx @@ -25,7 +25,7 @@ export function ConnectWalletButton({ small = false }: ConnectWalletButtonProps) return (
+ )} +
+ {small ? 'Connect Wallet' : 'Connect your wallet'} +
)} diff --git a/src/components/Header/ConnectXButton.tsx b/src/components/Header/ConnectXButton.tsx index cb0f8e6..4928bb6 100644 --- a/src/components/Header/ConnectXButton.tsx +++ b/src/components/Header/ConnectXButton.tsx @@ -11,7 +11,7 @@ export function ConnectXButton() { ) : ( + {amount ? (allowance && allowance >= parseEther(amount) ? 'Stake' : 'Approve') : 'Enter amount'} + ); } diff --git a/src/components/StakeModal/StakeTokenInput/index.tsx b/src/components/StakeModal/StakeTokenInput/index.tsx index b177b79..df81934 100644 --- a/src/components/StakeModal/StakeTokenInput/index.tsx +++ b/src/components/StakeModal/StakeTokenInput/index.tsx @@ -16,37 +16,44 @@ interface StakeTokenInputProps { export function StakeTokenInput({ onClose }: StakeTokenInputProps) { const [tabValue, setTabValue] = useState(0); - const { address } = useAccount() + const { address } = useAccount(); const { status } = useSession(); return ( -
+
Stake
-
{ onClose() }}> +
{ + onClose(); + }} + >
-
- -
- {address ? : -
-
1
-
} -
Connect Wallet
+
+
+ {address ? ( + + ) : ( +
+
1
+
+ )} +
Connect Wallet
- {address ? null : - } + {address ? null : }
-
-
- { - status === 'authenticated' ? : -
-
2
-
- } -
Link X
+
+
+ {status === 'authenticated' ? ( + + ) : ( +
+
2
+
+ )} +
Link X
{ status !== 'authenticated' ? : null diff --git a/src/components/StakeModal/index.tsx b/src/components/StakeModal/index.tsx index 7cb2bb1..a804cdf 100644 --- a/src/components/StakeModal/index.tsx +++ b/src/components/StakeModal/index.tsx @@ -1,4 +1,4 @@ -"use client" +'use client'; import { Dialog, Transition } from '@headlessui/react' import { Fragment } from 'react' @@ -36,13 +36,36 @@ export function StakeModal({ isOpen, setIsOpen }: StakeModalProps) { leaveFrom="opacity-100 scale-100" leaveTo="opacity-0 scale-95" > - - setIsOpen(false)} /> - - -
-
- - - ) + +
+ + +
+
+ + + setIsOpen(false)} /> + + +
+
+ + + ); } diff --git a/src/configs/wagmiClient.ts b/src/configs/wagmiClient.ts index 4eca155..53043ea 100644 --- a/src/configs/wagmiClient.ts +++ b/src/configs/wagmiClient.ts @@ -4,11 +4,7 @@ import { connectorsForWallets, RainbowKitProvider } from '@rainbow-me/rainbowkit import { coinbaseWallet, metaMaskWallet, rabbyWallet, walletConnectWallet } from '@rainbow-me/rainbowkit/wallets'; import { type FallbackTransport } from 'viem'; import { type Config, configureChains, createConfig, type PublicClient, type WebSocketPublicClient } from 'wagmi'; -import { - type Chain, - mainnet, - sepolia, -} from 'wagmi/chains'; +import { type Chain, mainnet, sepolia } from 'wagmi/chains'; import { publicProvider } from 'wagmi/providers/public'; import { SITE_HOSTNAME, SITE_URL } from '@/constants/index.js'; diff --git a/src/store/useStakeModalStore.ts b/src/store/useStakeModalStore.ts index e7a3a02..96109a3 100644 --- a/src/store/useStakeModalStore.ts +++ b/src/store/useStakeModalStore.ts @@ -4,19 +4,19 @@ import { immer } from 'zustand/middleware/immer'; import { createSelectors } from '@/helpers/createSelector.js'; interface StakeModalState { - isOpen: boolean; + isOpen: boolean; setIsOpen: (isOpen: boolean) => void; } const useStakeModalStateBase = create( - immer((set) => ({ - isOpen: false, - setIsOpen: (isOpen) => { - set((state) => { - state.isOpen = isOpen; - }); - }, - })) + immer((set) => ({ + isOpen: false, + setIsOpen: (isOpen) => { + set((state) => { + state.isOpen = isOpen; + }); + }, + })), ); export const useStakeModalStore = createSelectors(useStakeModalStateBase);