From 8efbaf61635a8b239b26b7c7bdf6cc2e6000403f Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Wed, 20 Dec 2023 07:06:32 +0700 Subject: [PATCH] Request --- frontend/pages/request.tsx | 190 +++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 frontend/pages/request.tsx diff --git a/frontend/pages/request.tsx b/frontend/pages/request.tsx new file mode 100644 index 00000000..1bfd208c --- /dev/null +++ b/frontend/pages/request.tsx @@ -0,0 +1,190 @@ +import type { NextPage } from 'next' +import Layout from '../components/Layout' +import SEO from '../components/SEO' +import { useAnchorWallet, useConnection } from '@solana/wallet-adapter-react' +import { + PythBalance, + StakeAccount, + StakeConnection, + STAKING_ADDRESS, +} from '@pythnetwork/staking' +import { useEffect, useState } from 'react' +import { Wallet } from '@coral-xyz/anchor' +import { PublicKey } from '@solana/web3.js' +import toast from 'react-hot-toast' +import { capitalizeFirstLetter } from 'utils/capitalizeFirstLetter' + +const RequestSplit: NextPage = () => { + const { connection } = useConnection() + const anchorWallet = useAnchorWallet() + + const [owner, setOwner] = useState() + const [amount, setAmount] = useState() + + const handleSetOwner = (event: any) => { + try { + setOwner(new PublicKey(event.target.value)) + } catch (e) { + setOwner(undefined) + } + } + const handleSetAmount = (event: any) => { + try { + setAmount(PythBalance.fromString(event.target.value)) + } catch (e) { + setAmount(undefined) + } + } + + const [stakeConnection, setStakeConnection] = useState() + const [stakeAccounts, setStakeAccounts] = useState() + const [selectedStakeAccount, setSelectStakeAccount] = useState() + + const handleSelectStakeAccount = (event: any) => { + for (const stakeAccount of stakeAccounts!) { + if (stakeAccount.address.toString() === event.target.value) { + setSelectStakeAccount(stakeAccount) + break + } + } + } + + useEffect(() => { + const initialize = async () => { + const stakeConnection = await StakeConnection.createStakeConnection( + connection, + anchorWallet as Wallet, + STAKING_ADDRESS + ) + setStakeConnection(stakeConnection) + } + + if (!anchorWallet) { + setStakeConnection(undefined) + } else { + initialize() + } + }, [anchorWallet]) + + useEffect(() => { + const loadStakeAccounts = async () => { + if (stakeConnection && anchorWallet) { + const stakeAccounts = await stakeConnection.getStakeAccounts( + anchorWallet.publicKey + ) + setStakeAccounts(stakeAccounts) + } else { + setStakeAccounts(undefined) + } + } + loadStakeAccounts() + }, [stakeConnection]) + + useEffect(() => { + const loadCurrentRequest = async () => { + if (stakeConnection && selectedStakeAccount) { + const request = await stakeConnection.getSplitRequest( + selectedStakeAccount + ) + if (request) { + setAmount(request.balance) + setOwner(request.recipient) + } + } + loadCurrentRequest() + } + }, [selectedStakeAccount]) + + useEffect(() => { + if (stakeAccounts && stakeAccounts.length > 0) + setSelectStakeAccount(stakeAccounts[0]) + }, [stakeAccounts]) + + const requestSplit = async () => { + if (stakeConnection && selectedStakeAccount && owner && amount) + try { + await stakeConnection.requestSplit(selectedStakeAccount, amount, owner) + toast.success('Successfully created transfer request') + } catch (err) { + toast.error(capitalizeFirstLetter(err.message)) + } + } + + return ( + + + + {stakeConnection && + stakeAccounts !== undefined && + stakeAccounts.length > 0 && ( +
+

+ Request a transfer of locked tokens to a new account +

+ + + {selectedStakeAccount && ( +

+ This account has{' '} + {new PythBalance(selectedStakeAccount!.tokenBalance).toString()}{' '} + tokens +

+ )} + +

New owner

+ +

Amount

+ +

+ Owner : {owner ? owner.toString() : 'Invalid new owner'} +

+

+ Amount to be transferred:{' '} + {amount ? amount.toString() : 'Invalid amount to transfer'} +

+
+ )} + + {stakeConnection && owner && amount ? ( +

+ +

+ ) : !stakeConnection ? ( +

Please connect wallet

+ ) : !owner ? ( +

Please insert valid new owner

+ ) : ( +

+ Please insert valid amount to be transferred +

+ )} +
+ ) +} + +export default RequestSplit