From a1f600d84d5651750dfabb3d32e8a0bf5e50a3fe Mon Sep 17 00:00:00 2001
From: Guillermo Bescos
Date: Wed, 20 Dec 2023 07:10:55 +0700
Subject: [PATCH 1/6] Cleanup
---
frontend/pages/request.tsx | 33 +++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/frontend/pages/request.tsx b/frontend/pages/request.tsx
index 1bfd208c..0016c189 100644
--- a/frontend/pages/request.tsx
+++ b/frontend/pages/request.tsx
@@ -18,14 +18,14 @@ const RequestSplit: NextPage = () => {
const { connection } = useConnection()
const anchorWallet = useAnchorWallet()
- const [owner, setOwner] = useState()
+ const [recipient, setRecipient] = useState()
const [amount, setAmount] = useState()
- const handleSetOwner = (event: any) => {
+ const handleSetRecipient = (event: any) => {
try {
- setOwner(new PublicKey(event.target.value))
+ setRecipient(new PublicKey(event.target.value))
} catch (e) {
- setOwner(undefined)
+ setRecipient(undefined)
}
}
const handleSetAmount = (event: any) => {
@@ -88,7 +88,7 @@ const RequestSplit: NextPage = () => {
)
if (request) {
setAmount(request.balance)
- setOwner(request.recipient)
+ setRecipient(request.recipient)
}
}
loadCurrentRequest()
@@ -101,9 +101,13 @@ const RequestSplit: NextPage = () => {
}, [stakeAccounts])
const requestSplit = async () => {
- if (stakeConnection && selectedStakeAccount && owner && amount)
+ if (stakeConnection && selectedStakeAccount && recipient && amount)
try {
- await stakeConnection.requestSplit(selectedStakeAccount, amount, owner)
+ await stakeConnection.requestSplit(
+ selectedStakeAccount,
+ amount,
+ recipient
+ )
toast.success('Successfully created transfer request')
} catch (err) {
toast.error(capitalizeFirstLetter(err.message))
@@ -141,12 +145,12 @@ const RequestSplit: NextPage = () => {
)}
- New owner
+ Recipient
Amount
{
onChange={handleSetAmount}
/>
- Owner : {owner ? owner.toString() : 'Invalid new owner'}
+ Recipient :{' '}
+ {recipient ? recipient.toString() : 'Invalid recipient'}
Amount to be transferred:{' '}
@@ -165,7 +170,7 @@ const RequestSplit: NextPage = () => {
)}
- {stakeConnection && owner && amount ? (
+ {stakeConnection && recipient && amount ? (
) : !stakeConnection ? (
Please connect wallet
- ) : !owner ? (
- Please insert valid new owner
+ ) : !recipient ? (
+ Please insert valid recipient
) : (
Please insert valid amount to be transferred
From 1291cf6422098e567b53eb27314fa36d401f3d3a Mon Sep 17 00:00:00 2001
From: Guillermo Bescos
Date: Wed, 20 Dec 2023 17:11:58 +0000
Subject: [PATCH 2/6] Refactor approve
---
frontend/pages/approve.tsx | 125 +++++++++++++++++++++++++------------
1 file changed, 86 insertions(+), 39 deletions(-)
diff --git a/frontend/pages/approve.tsx b/frontend/pages/approve.tsx
index 060b1df2..ef788ea6 100644
--- a/frontend/pages/approve.tsx
+++ b/frontend/pages/approve.tsx
@@ -13,68 +13,94 @@ import {
STAKING_ADDRESS,
} from '@pythnetwork/staking'
import { useEffect, useState } from 'react'
-import { utils, Wallet } from '@coral-xyz/anchor'
-import toast from 'react-hot-toast'
-import { capitalizeFirstLetter } from '../utils/capitalizeFirstLetter'
+import { Wallet } from '@coral-xyz/anchor'
import { PublicKey } from '@solana/web3.js'
import { useRouter } from 'next/router'
const ApproveSplit: NextPage = () => {
const { connection } = useConnection()
const anchorWallet = useAnchorWallet()
- const { publicKey, connected } = useWallet()
+ const [amount, setAmount] = useState()
+ const [recipient, setRecipient] = useState()
const [stakeConnection, setStakeConnection] = useState()
+ const [stakeAccounts, setStakeAccounts] = useState()
+ const [selectedStakeAccount, setSelectStakeAccount] = useState()
- const [stakeAccount, setStakeAccount] = useState()
- const [amount, setAmount] = useState()
- const [recipient, setRecipient] = useState()
+ const router = useRouter()
+ const { key } = router.query
+
+ const handleSelectStakeAccount = (event: any) => {
+ for (const stakeAccount of stakeAccounts!) {
+ if (stakeAccount.address.toString() === event.target.value) {
+ setSelectStakeAccount(stakeAccount)
+ break
+ }
+ }
+ }
useEffect(() => {
const initialize = async () => {
- try {
- const stakeConnection = await StakeConnection.createStakeConnection(
- connection,
- anchorWallet as Wallet,
- STAKING_ADDRESS
- )
- setStakeConnection(stakeConnection)
- } catch (e) {
- toast.error(capitalizeFirstLetter(e.message))
- }
+ const stakeConnection = await StakeConnection.createStakeConnection(
+ connection,
+ anchorWallet as Wallet,
+ STAKING_ADDRESS
+ )
+ setStakeConnection(stakeConnection)
}
- if (!connected) {
+
+ if (!anchorWallet) {
setStakeConnection(undefined)
} else {
initialize()
}
- }, [connected])
-
- const router = useRouter()
- const { key } = router.query
+ }, [anchorWallet])
useEffect(() => {
- const helper = async () => {
- if (stakeConnection !== undefined) {
- const splitAccountOwner: PublicKey = new PublicKey(key!)
- const stakeAccount = (await stakeConnection!.getMainAccount(
- splitAccountOwner
- ))!
+ const loadStakeAccounts = async () => {
+ if (stakeConnection && anchorWallet) {
+ const stakeAccounts = await stakeConnection.getStakeAccounts(
+ new PublicKey(key!)
+ )
+ setStakeAccounts(stakeAccounts)
+ } else {
+ setStakeAccounts(undefined)
+ }
+ }
+ loadStakeAccounts()
+ }, [stakeConnection])
- const { balance, recipient } = (await stakeConnection.getSplitRequest(
- stakeAccount
- ))!
+ useEffect(() => {
+ const loadCurrentRequest = async () => {
+ if (stakeConnection && selectedStakeAccount) {
+ const request = await stakeConnection.getSplitRequest(
+ selectedStakeAccount
+ )
- setStakeAccount(stakeAccount)
- setAmount(balance)
- setRecipient(recipient)
+ if (request) {
+ setAmount(request.balance)
+ setRecipient(request.recipient)
+ } else {
+ setAmount(undefined)
+ setRecipient(undefined)
+ }
}
}
- helper()
- }, [stakeConnection])
+ loadCurrentRequest()
+ }, [selectedStakeAccount])
+
+ useEffect(() => {
+ if (stakeAccounts && stakeAccounts.length > 0)
+ setSelectStakeAccount(stakeAccounts[0])
+ }, [stakeAccounts])
const approveSplit = async () => {
- await stakeConnection!.acceptSplit(stakeAccount!, amount!, recipient!)
+ if (stakeConnection && selectedStakeAccount && recipient && amount)
+ await stakeConnection!.acceptSplit(
+ selectedStakeAccount,
+ amount!,
+ recipient!
+ )
}
return (
@@ -82,8 +108,29 @@ const ApproveSplit: NextPage = () => {
Approve a split request from {key}
- {stakeAccount != undefined
- ? `stake account address: ${stakeAccount.address}`
+ {stakeConnection &&
+ stakeAccounts !== undefined &&
+ stakeAccounts.length > 0 && (
+
+
+ Request a transfer of locked tokens to a new account
+
+
+
+
+ )}
+ {selectedStakeAccount != undefined
+ ? `stake account address: ${selectedStakeAccount.address}`
: 'no owner'}
{amount != undefined ? `amount: ${amount}` : 'no amount'}
From e9515da5435c9ccc5e116a6fe419721ab9e6dc8e Mon Sep 17 00:00:00 2001
From: Guillermo Bescos
Date: Wed, 20 Dec 2023 17:15:32 +0000
Subject: [PATCH 3/6] Use nullable
---
staking/app/StakeConnection.ts | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/staking/app/StakeConnection.ts b/staking/app/StakeConnection.ts
index 6634b7f6..573afefa 100644
--- a/staking/app/StakeConnection.ts
+++ b/staking/app/StakeConnection.ts
@@ -898,14 +898,18 @@ export class StakeConnection {
],
this.program.programId
)[0];
- const splitRequest = await this.program.account.splitRequest.fetch(
+ const splitRequest = await this.program.account.splitRequest.fetchNullable(
splitRequestAccount
);
- return {
- balance: new PythBalance(splitRequest.amount),
- recipient: splitRequest.recipient,
- };
+ if (splitRequest) {
+ return {
+ balance: new PythBalance(splitRequest.amount),
+ recipient: splitRequest.recipient,
+ };
+ } else {
+ return undefined;
+ }
}
public async acceptSplit(
From 0137c31bb28c36750e45b4d69617376f6b4293f0 Mon Sep 17 00:00:00 2001
From: Guillermo Bescos
Date: Wed, 20 Dec 2023 17:18:56 +0000
Subject: [PATCH 4/6] Cleanup
---
frontend/pages/approve.tsx | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/frontend/pages/approve.tsx b/frontend/pages/approve.tsx
index ef788ea6..4b1d2462 100644
--- a/frontend/pages/approve.tsx
+++ b/frontend/pages/approve.tsx
@@ -96,11 +96,7 @@ const ApproveSplit: NextPage = () => {
const approveSplit = async () => {
if (stakeConnection && selectedStakeAccount && recipient && amount)
- await stakeConnection!.acceptSplit(
- selectedStakeAccount,
- amount!,
- recipient!
- )
+ await stakeConnection.acceptSplit(selectedStakeAccount, amount, recipient)
}
return (
From dbbd006150e0920b5e8305c14298bc92ee40da53 Mon Sep 17 00:00:00 2001
From: Guillermo Bescos
Date: Wed, 20 Dec 2023 17:34:36 +0000
Subject: [PATCH 5/6] Add toast
---
frontend/pages/approve.tsx | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/frontend/pages/approve.tsx b/frontend/pages/approve.tsx
index 4b1d2462..52788700 100644
--- a/frontend/pages/approve.tsx
+++ b/frontend/pages/approve.tsx
@@ -16,6 +16,8 @@ import { useEffect, useState } from 'react'
import { Wallet } from '@coral-xyz/anchor'
import { PublicKey } from '@solana/web3.js'
import { useRouter } from 'next/router'
+import toast from 'react-hot-toast'
+import { capitalizeFirstLetter } from 'utils/capitalizeFirstLetter'
const ApproveSplit: NextPage = () => {
const { connection } = useConnection()
@@ -95,8 +97,18 @@ const ApproveSplit: NextPage = () => {
}, [stakeAccounts])
const approveSplit = async () => {
- if (stakeConnection && selectedStakeAccount && recipient && amount)
- await stakeConnection.acceptSplit(selectedStakeAccount, amount, recipient)
+ if (stakeConnection && selectedStakeAccount && recipient && amount) {
+ try {
+ await stakeConnection.acceptSplit(
+ selectedStakeAccount,
+ amount,
+ recipient
+ )
+ toast.success('Successfully created transfer request')
+ } catch (err) {
+ toast.error(capitalizeFirstLetter(err.message))
+ }
+ }
}
return (
From 9c6a340c05ef1cf4d539cce24d0bb4ac4691a232 Mon Sep 17 00:00:00 2001
From: Guillermo Bescos
Date: Wed, 20 Dec 2023 17:35:37 +0000
Subject: [PATCH 6/6] Do it
---
frontend/pages/approve.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/frontend/pages/approve.tsx b/frontend/pages/approve.tsx
index 52788700..79f7053f 100644
--- a/frontend/pages/approve.tsx
+++ b/frontend/pages/approve.tsx
@@ -30,7 +30,7 @@ const ApproveSplit: NextPage = () => {
const [selectedStakeAccount, setSelectStakeAccount] = useState()
const router = useRouter()
- const { key } = router.query
+ const { owner } = router.query
const handleSelectStakeAccount = (event: any) => {
for (const stakeAccount of stakeAccounts!) {
@@ -62,7 +62,7 @@ const ApproveSplit: NextPage = () => {
const loadStakeAccounts = async () => {
if (stakeConnection && anchorWallet) {
const stakeAccounts = await stakeConnection.getStakeAccounts(
- new PublicKey(key!)
+ new PublicKey(owner!)
)
setStakeAccounts(stakeAccounts)
} else {
@@ -114,7 +114,7 @@ const ApproveSplit: NextPage = () => {
return (
- Approve a split request from {key}
+ Approve a split request from {owner}
{stakeConnection &&
stakeAccounts !== undefined &&