more defense against double index for token from ui

This commit is contained in:
Adrian Brzeziński 2024-02-11 21:47:08 +04:00
parent 8bc661d07f
commit 96935c8434
3 changed files with 37 additions and 10 deletions

View File

@ -67,6 +67,7 @@ const ListMarket = ({ goBack }: { goBack: () => void }) => {
const vsrClient = GovernanceStore((s) => s.vsrClient)
const proposals = GovernanceStore((s) => s.proposals)
const proposalsLoading = GovernanceStore((s) => s.loadingProposals)
const refetchProposals = GovernanceStore((s) => s.refetchProposals)
const [advForm, setAdvForm] = useState<ListMarketForm>({
...defaultFormValues,
@ -161,7 +162,9 @@ const ListMarket = ({ goBack }: { goBack: () => void }) => {
return
}
setProposing(true)
const proposals = await refetchProposals()
const index = proposals ? Object.values(proposals).length : 0
const proposalTx = []
const oraclePriceBand = baseBank?.oracleConfig.maxStalenessSlots.isNeg()
@ -169,11 +172,7 @@ const ListMarket = ({ goBack }: { goBack: () => void }) => {
: 1
const registerMarketix = await client!.program.methods
.serum3RegisterMarket(
advForm.marketIndex,
advForm.marketName,
oraclePriceBand,
)
.serum3RegisterMarket(index, advForm.marketName, oraclePriceBand)
.accounts({
group: group!.publicKey,
admin: MANGO_DAO_WALLET,
@ -491,6 +490,7 @@ const ListMarket = ({ goBack }: { goBack: () => void }) => {
<div>
<Label text={t('market-index')} />
<Input
disabled={true}
hasError={formErrors.marketIndex !== undefined}
type="number"
value={advForm.marketIndex.toString()}

View File

@ -109,6 +109,7 @@ const ListToken = ({ goBack }: { goBack: () => void }) => {
const fee = mangoStore((s) => s.priorityFee)
const loadingVoter = GovernanceStore((s) => s.loadingVoter)
const proposals = GovernanceStore((s) => s.proposals)
const refetchProposals = GovernanceStore((s) => s.refetchProposals)
const getCurrentVotingPower = GovernanceStore((s) => s.getCurrentVotingPower)
const connectionContext = GovernanceStore((s) => s.connectionContext)
const { t } = useTranslation(['governance'])
@ -520,13 +521,17 @@ const ListToken = ({ goBack }: { goBack: () => void }) => {
})
return
}
const newProposals = await refetchProposals()
const index = proposals ? Object.values(newProposals).length : 0
const mint = new PublicKey(advForm.mintPk)
const proposalTx = []
if (Object.keys(proposedPreset).length && !advForm.fastListing) {
const registerTokenIx = await client!.program.methods
.tokenRegister(
Number(advForm.tokenIndex),
Number(index),
advForm.name,
{
confFilter: Number(proposedPreset.oracleConfFilter),
@ -579,7 +584,7 @@ const ListToken = ({ goBack }: { goBack: () => void }) => {
proposalTx.push(registerTokenIx)
} else {
const trustlessIx = await client!.program.methods
.tokenRegisterTrustless(Number(advForm.tokenIndex), advForm.name)
.tokenRegisterTrustless(Number(index), advForm.name)
.accounts({
mint: mint,
payer: MANGO_DAO_FAST_LISTING_WALLET,
@ -596,7 +601,7 @@ const ListToken = ({ goBack }: { goBack: () => void }) => {
if (!advForm.listForSwapOnly) {
const registerMarketix = await client!.program.methods
.serum3RegisterMarket(
Number(advForm.marketIndex),
Number(index),
advForm.marketName,
proposedPreset.oraclePriceBand,
)
@ -636,7 +641,7 @@ const ListToken = ({ goBack }: { goBack: () => void }) => {
voter.tokenOwnerRecord!,
advForm.proposalTitle,
advForm.proposalDescription,
advForm.tokenIndex,
index,
proposalTx,
vsrClient,
fee,
@ -665,12 +670,14 @@ const ListToken = ({ goBack }: { goBack: () => void }) => {
voter.voteWeight,
voter.tokenOwnerRecord,
minVoterWeight,
refetchProposals,
proposals,
proposedPreset,
connection,
t,
mintVoterWeightNumber,
client,
group,
connection,
fee,
])
@ -862,6 +869,7 @@ const ListToken = ({ goBack }: { goBack: () => void }) => {
<div>
<Label text={t('token-index')} />
<Input
disabled={true}
hasError={formErrors.tokenIndex !== undefined}
type="number"
value={advForm.tokenIndex.toString()}

View File

@ -59,6 +59,7 @@ type IGovernanceStore = {
) => void
resetVoter: () => void
updateProposals: (proposalPk: PublicKey) => void
refetchProposals: () => Promise<Record<string, ProgramAccount<Proposal>>>
fetchDelegatedAccounts: (
wallet: PublicKey,
connectionContext: ConnectionContext,
@ -221,6 +222,24 @@ const GovernanceStore = create<IGovernanceStore>((set, get) => ({
state.loadingRealm = false
})
},
refetchProposals: async () => {
const set = get().set
const connectionContext = get().connectionContext!
set((state) => {
state.loadingProposals = true
})
const proposals = await getAllProposals(
connectionContext.current,
MANGO_GOVERNANCE_PROGRAM,
MANGO_REALM_PK,
)
const proposalsObj = accountsToPubkeyMap(proposals.flatMap((p) => p))
set((state) => {
state.loadingProposals = false
state.proposals = proposalsObj
})
return accountsToPubkeyMap(proposals.flatMap((p) => p))
},
updateProposals: async (proposalPk: PublicKey) => {
const state = get()
const set = get().set