Skip to content

Commit f36cc43

Browse files
authored
Merge pull request #2348 from IntersectMBO/fix/2333--sanchonet-govtool-cert-wrong-order-vote-deleg-before-drep-reg
fix(#2333): fix wrong order of vote and registration certificates
2 parents 09b1eca + d83374a commit f36cc43

File tree

5 files changed

+78
-32
lines changed

5 files changed

+78
-32
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ changes.
1717

1818
### Fixed
1919

20-
-
20+
- Fix certificates order where vote delegation cert is before the DRep registration cert [Issue 2333](https://github.com/IntersectMBO/govtool/issues/2333)
2121

2222
### Changed
2323

govtool/frontend/src/context/wallet.tsx

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ interface CardanoContextType {
184184
setStakeKey: (key: string) => void;
185185
stakeKeys: string[];
186186
walletApi?: CardanoApiWallet;
187+
registeredStakeKeysListState: string[];
187188
buildSignSubmitConwayCertTx: ({
188189
certBuilder,
189190
govActionBuilder,
@@ -192,8 +193,9 @@ interface CardanoContextType {
192193
votingBuilder,
193194
voter,
194195
}: BuildSignSubmitConwayCertTxArgs) => Promise<string>;
196+
buildStakeKeyRegCert: () => Promise<Certificate>;
195197
buildDRepRegCert: (url?: string, hash?: string) => Promise<Certificate>;
196-
buildVoteDelegationCert: (vote: string) => Promise<CertificatesBuilder>;
198+
buildVoteDelegationCert: (vote: string) => Promise<Certificate>;
197199
buildDRepUpdateCert: (url?: string, hash?: string) => Promise<Certificate>;
198200
buildDRepRetirementCert: (voterDeposit: string) => Promise<Certificate>;
199201
buildVote: (
@@ -626,28 +628,34 @@ const CardanoProvider = (props: Props) => {
626628
[isPendingTransaction, stakeKey, updateTransaction, walletApi, walletState],
627629
);
628630

631+
const buildStakeKeyRegCert = useCallback(async (): Promise<Certificate> => {
632+
try {
633+
if (!stakeKey) {
634+
throw new Error(t("errors.noStakeKeySelected"));
635+
}
636+
const stakeKeyHash = Ed25519KeyHash.from_hex(stakeKey.substring(2));
637+
const stakeCred = Credential.from_keyhash(stakeKeyHash);
638+
const stakeKeyRegCert = StakeRegistration.new_with_explicit_deposit(
639+
stakeCred,
640+
BigNum.from_str(`${epochParams.key_deposit}`),
641+
);
642+
return Certificate.new_stake_registration(stakeKeyRegCert);
643+
} catch (e) {
644+
console.error(e);
645+
throw e;
646+
}
647+
}, [epochParams]);
648+
629649
const buildVoteDelegationCert = useCallback(
630-
async (target: string): Promise<CertificatesBuilder> => {
650+
async (target: string): Promise<Certificate> => {
631651
try {
632652
// Build Vote Delegation Certificate
633-
const certBuilder = CertificatesBuilder.new();
634-
let stakeCred;
635653
if (!stakeKey) {
636654
throw new Error(t("errors.noStakeKeySelected"));
637655
}
638656
// Remove network tag from stake key hash
639657
const stakeKeyHash = Ed25519KeyHash.from_hex(stakeKey.substring(2));
640-
// if chosen stake key is registered use it, else register it
641-
if (registeredStakeKeysListState.length > 0) {
642-
stakeCred = Credential.from_keyhash(stakeKeyHash);
643-
} else {
644-
stakeCred = Credential.from_keyhash(stakeKeyHash);
645-
const stakeKeyRegCert = StakeRegistration.new_with_explicit_deposit(
646-
stakeCred,
647-
BigNum.from_str(`${epochParams.key_deposit}`),
648-
);
649-
certBuilder.add(Certificate.new_stake_registration(stakeKeyRegCert));
650-
}
658+
const stakeCred = Credential.from_keyhash(stakeKeyHash);
651659

652660
// Create correct DRep
653661
let targetDRep;
@@ -665,9 +673,7 @@ const CardanoProvider = (props: Props) => {
665673
// Create cert object
666674
const voteDelegationCert = VoteDelegation.new(stakeCred, targetDRep);
667675
// add cert to tbuilder
668-
certBuilder.add(Certificate.new_vote_delegation(voteDelegationCert));
669-
670-
return certBuilder;
676+
return Certificate.new_vote_delegation(voteDelegationCert);
671677
} catch (e) {
672678
console.error(e);
673679
throw e;
@@ -1039,24 +1045,26 @@ const CardanoProvider = (props: Props) => {
10391045
buildDRepRegCert,
10401046
buildDRepRetirementCert,
10411047
buildDRepUpdateCert,
1048+
buildHardForkGovernanceAction,
10421049
buildNewInfoGovernanceAction,
1050+
buildProtocolParameterChangeGovernanceAction,
10431051
buildSignSubmitConwayCertTx,
1052+
buildStakeKeyRegCert,
10441053
buildTreasuryGovernanceAction,
1045-
buildProtocolParameterChangeGovernanceAction,
1046-
buildHardForkGovernanceAction,
10471054
buildVote,
10481055
buildVoteDelegationCert,
1049-
disconnectWallet,
1050-
getChangeAddress,
10511056
dRepID,
1057+
disconnectWallet,
10521058
enable,
10531059
error,
1054-
isEnabled,
1060+
getChangeAddress,
10551061
isEnableLoading,
1062+
isEnabled,
10561063
isMainnet,
10571064
isPendingTransaction,
10581065
pendingTransaction,
10591066
pubDRepKey,
1067+
registeredStakeKeysListState,
10601068
setStakeKey,
10611069
stakeKey,
10621070
stakeKeys,
@@ -1067,24 +1075,26 @@ const CardanoProvider = (props: Props) => {
10671075
buildDRepRegCert,
10681076
buildDRepRetirementCert,
10691077
buildDRepUpdateCert,
1078+
buildHardForkGovernanceAction,
10701079
buildNewInfoGovernanceAction,
1080+
buildProtocolParameterChangeGovernanceAction,
10711081
buildSignSubmitConwayCertTx,
1082+
buildStakeKeyRegCert,
10721083
buildTreasuryGovernanceAction,
1073-
buildProtocolParameterChangeGovernanceAction,
1074-
buildHardForkGovernanceAction,
10751084
buildVote,
10761085
buildVoteDelegationCert,
1077-
disconnectWallet,
1078-
getChangeAddress,
10791086
dRepID,
1087+
disconnectWallet,
10801088
enable,
10811089
error,
1082-
isEnabled,
1090+
getChangeAddress,
10831091
isEnableLoading,
1092+
isEnabled,
10841093
isMainnet,
10851094
isPendingTransaction,
10861095
pendingTransaction,
10871096
pubDRepKey,
1097+
registeredStakeKeysListState,
10881098
setStakeKey,
10891099
stakeKey,
10901100
stakeKeys,

govtool/frontend/src/hooks/forms/useRegisterAsdRepForm.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { useFormContext } from "react-hook-form";
55
import { blake2bHex } from "blakejs";
66
import * as Sentry from "@sentry/react";
77
import { NodeObject } from "jsonld";
8+
import { CertificatesBuilder } from "@emurgo/cardano-serialization-lib-asmjs";
89

910
import {
1011
CIP_119,
@@ -53,6 +54,8 @@ export const useRegisterAsdRepForm = (
5354
buildSignSubmitConwayCertTx,
5455
buildVoteDelegationCert,
5556
dRepID,
57+
registeredStakeKeysListState,
58+
buildStakeKeyRegCert,
5659
} = useCardano();
5760

5861
// App Management
@@ -131,14 +134,22 @@ export const useRegisterAsdRepForm = (
131134
if (!hash) return;
132135
const uri = data.storingURL;
133136
try {
134-
const certBuilder = await buildVoteDelegationCert(dRepID);
137+
const certBuilder = CertificatesBuilder.new();
135138

136139
const registerCert = voter?.isRegisteredAsSoleVoter
137140
? await buildDRepUpdateCert(uri, hash)
138141
: await buildDRepRegCert(uri, hash);
139142

140143
certBuilder.add(registerCert);
141144

145+
if (!registeredStakeKeysListState.length) {
146+
const stakeKeyRegCert = await buildStakeKeyRegCert();
147+
certBuilder.add(stakeKeyRegCert);
148+
}
149+
150+
const voteDelegationCert = await buildVoteDelegationCert(dRepID);
151+
certBuilder.add(voteDelegationCert);
152+
142153
return certBuilder;
143154
} catch (error) {
144155
Sentry.setTag("hook", "useRegisterAsdRepForm");

govtool/frontend/src/hooks/useDelegateToDrep.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ import * as Sentry from "@sentry/react";
33

44
import { useCardano, useSnackbar } from "@context";
55
import { useGetVoterInfo, useTranslation, useWalletErrorModal } from "@hooks";
6+
import { CertificatesBuilder } from "@emurgo/cardano-serialization-lib-asmjs";
67

78
export const useDelegateTodRep = () => {
89
const {
910
buildSignSubmitConwayCertTx,
1011
buildVoteDelegationCert,
1112
buildDRepRetirementCert,
13+
buildStakeKeyRegCert,
14+
registeredStakeKeysListState,
1215
} = useCardano();
1316
const { t } = useTranslation();
1417
const { addSuccessAlert, addErrorAlert } = useSnackbar();
@@ -25,14 +28,23 @@ export const useDelegateTodRep = () => {
2528
if (voter?.isRegisteredAsSoleVoter && !voter?.deposit) {
2629
throw new Error(t("errors.appCannotGetDeposit"));
2730
}
31+
const certBuilder = CertificatesBuilder.new();
2832

29-
const certBuilder = await buildVoteDelegationCert(dRepId);
3033
if (voter?.isRegisteredAsSoleVoter) {
3134
const retirementCert = await buildDRepRetirementCert(
3235
voter?.deposit?.toString(),
3336
);
3437
certBuilder.add(retirementCert);
3538
}
39+
40+
if (!registeredStakeKeysListState.length) {
41+
const stakeKeyRegCert = await buildStakeKeyRegCert();
42+
certBuilder.add(stakeKeyRegCert);
43+
}
44+
45+
const voteDelegationCert = await buildVoteDelegationCert(dRepId);
46+
certBuilder.add(voteDelegationCert);
47+
3648
await buildSignSubmitConwayCertTx({
3749
certBuilder,
3850
type: "delegate",

govtool/frontend/src/pages/RegisterAsDirectVoter.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
openInNewTab,
2222
} from "@utils";
2323
import { WrongRouteInfo } from "@organisms";
24+
import { CertificatesBuilder } from "@emurgo/cardano-serialization-lib-asmjs";
2425

2526
export const RegisterAsDirectVoter = () => {
2627
const { cExplorerBaseUrl } = useAppContext();
@@ -32,23 +33,35 @@ export const RegisterAsDirectVoter = () => {
3233
const { voter } = useGetVoterInfo();
3334
const openWalletErrorModal = useWalletErrorModal();
3435
const {
36+
buildStakeKeyRegCert,
3537
buildSignSubmitConwayCertTx,
3638
buildDRepRegCert,
3739
buildDRepUpdateCert,
3840
buildVoteDelegationCert,
3941
dRepID,
42+
registeredStakeKeysListState,
4043
} = useCardano();
4144
const { openModal, closeModal } = useModal();
4245

4346
const onRegister = useCallback(async () => {
4447
setIsLoading(true);
4548

4649
try {
47-
const certBuilder = await buildVoteDelegationCert(dRepID);
50+
const certBuilder = CertificatesBuilder.new();
51+
4852
const registerCert = voter?.isRegisteredAsDRep
4953
? await buildDRepUpdateCert()
5054
: await buildDRepRegCert();
5155
certBuilder.add(registerCert);
56+
57+
if (!registeredStakeKeysListState.length) {
58+
const stakeKeyRegCert = await buildStakeKeyRegCert();
59+
certBuilder.add(stakeKeyRegCert);
60+
}
61+
62+
const voteDelegationCert = await buildVoteDelegationCert(dRepID);
63+
certBuilder.add(voteDelegationCert);
64+
5265
const result = await buildSignSubmitConwayCertTx({
5366
certBuilder,
5467
type: "registerAsDirectVoter",

0 commit comments

Comments
 (0)