more defense against double index for token from ui
This commit is contained in:
parent
8bc661d07f
commit
96935c8434
|
@ -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()}
|
||||||
|
|
|
@ -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()}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue