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

View File

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

View File

@ -59,6 +59,7 @@ type IGovernanceStore = {
) => void ) => void
resetVoter: () => void resetVoter: () => void
updateProposals: (proposalPk: PublicKey) => void updateProposals: (proposalPk: PublicKey) => void
refetchProposals: () => Promise<Record<string, ProgramAccount<Proposal>>>
fetchDelegatedAccounts: ( fetchDelegatedAccounts: (
wallet: PublicKey, wallet: PublicKey,
connectionContext: ConnectionContext, connectionContext: ConnectionContext,
@ -221,6 +222,24 @@ const GovernanceStore = create<IGovernanceStore>((set, get) => ({
state.loadingRealm = false 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) => { updateProposals: async (proposalPk: PublicKey) => {
const state = get() const state = get()
const set = get().set const set = get().set