Skip to content

Commit 39ada85

Browse files
committed
fix(cardano-services): use computed stake credential type while building certificates
1 parent 5189b1e commit 39ada85

File tree

2 files changed

+28
-43
lines changed

2 files changed

+28
-43
lines changed

packages/cardano-services/src/ChainHistory/DbSyncChainHistory/mappers.ts

Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -231,25 +231,15 @@ export const mapCertificate = (
231231
: Cardano.CertificateType.Unregistration,
232232
cert_index: certModel.cert_index,
233233
deposit: BigInt(certModel.deposit),
234-
stakeCredential: {
235-
hash: Cardano.RewardAccount.toHash(
236-
Cardano.RewardAccount(certModel.address)
237-
) as unknown as Crypto.Hash28ByteBase16,
238-
type: Cardano.CredentialType.KeyHash
239-
}
234+
stakeCredential: Cardano.Address.fromBech32(certModel.address).asReward()!.getPaymentCredential()
240235
} as WithCertIndex<Cardano.NewStakeAddressCertificate>;
241236

242237
if (isDelegationCertModel(certModel))
243238
return {
244239
__typename: Cardano.CertificateType.StakeDelegation,
245240
cert_index: certModel.cert_index,
246241
poolId: certModel.pool_id as unknown as Cardano.PoolId,
247-
stakeCredential: {
248-
hash: Cardano.RewardAccount.toHash(
249-
Cardano.RewardAccount(certModel.address)
250-
) as unknown as Crypto.Hash28ByteBase16,
251-
type: Cardano.CredentialType.KeyHash
252-
}
242+
stakeCredential: Cardano.Address.fromBech32(certModel.address).asReward()!.getPaymentCredential()
253243
} as WithCertIndex<Cardano.StakeDelegationCertificate>;
254244

255245
if (isDrepRegistrationCertModel(certModel))
@@ -292,12 +282,7 @@ export const mapCertificate = (
292282
__typename: Cardano.CertificateType.VoteDelegation,
293283
cert_index: certModel.cert_index,
294284
dRep: mapDrepDelegation(certModel),
295-
stakeCredential: {
296-
hash: Cardano.RewardAccount.toHash(
297-
Cardano.RewardAccount(certModel.address)
298-
) as unknown as Crypto.Hash28ByteBase16,
299-
type: Cardano.CredentialType.KeyHash
300-
}
285+
stakeCredential: Cardano.Address.fromBech32(certModel.address).asReward()!.getPaymentCredential()
301286
};
302287

303288
if (isVoteRegistrationDelegationCertModel(certModel))
@@ -306,12 +291,7 @@ export const mapCertificate = (
306291
cert_index: certModel.cert_index,
307292
dRep: mapDrepDelegation(certModel),
308293
deposit: BigInt(certModel.deposit),
309-
stakeCredential: {
310-
hash: Cardano.RewardAccount.toHash(
311-
Cardano.RewardAccount(certModel.address)
312-
) as unknown as Crypto.Hash28ByteBase16,
313-
type: Cardano.CredentialType.KeyHash
314-
}
294+
stakeCredential: Cardano.Address.fromBech32(certModel.address).asReward()!.getPaymentCredential()
315295
};
316296

317297
if (isStakeVoteDelegationCertModel(certModel))
@@ -320,12 +300,7 @@ export const mapCertificate = (
320300
cert_index: certModel.cert_index,
321301
dRep: mapDrepDelegation(certModel),
322302
poolId: certModel.pool_id as unknown as Cardano.PoolId,
323-
stakeCredential: {
324-
hash: Cardano.RewardAccount.toHash(
325-
Cardano.RewardAccount(certModel.address)
326-
) as unknown as Crypto.Hash28ByteBase16,
327-
type: Cardano.CredentialType.KeyHash
328-
}
303+
stakeCredential: Cardano.Address.fromBech32(certModel.address).asReward()!.getPaymentCredential()
329304
};
330305

331306
if (isStakeRegistrationDelegationCertModel(certModel))
@@ -334,12 +309,7 @@ export const mapCertificate = (
334309
cert_index: certModel.cert_index,
335310
deposit: BigInt(certModel.deposit),
336311
poolId: certModel.pool_id as unknown as Cardano.PoolId,
337-
stakeCredential: {
338-
hash: Cardano.RewardAccount.toHash(
339-
Cardano.RewardAccount(certModel.address)
340-
) as unknown as Crypto.Hash28ByteBase16,
341-
type: Cardano.CredentialType.KeyHash
342-
}
312+
stakeCredential: Cardano.Address.fromBech32(certModel.address).asReward()!.getPaymentCredential()
343313
};
344314

345315
if (isStakeVoteRegistrationDelegationCertModel(certModel))
@@ -349,12 +319,7 @@ export const mapCertificate = (
349319
dRep: mapDrepDelegation(certModel),
350320
deposit: BigInt(certModel.deposit),
351321
poolId: certModel.pool_id as unknown as Cardano.PoolId,
352-
stakeCredential: {
353-
hash: Cardano.RewardAccount.toHash(
354-
Cardano.RewardAccount(certModel.address)
355-
) as unknown as Crypto.Hash28ByteBase16,
356-
type: Cardano.CredentialType.KeyHash
357-
}
322+
stakeCredential: Cardano.Address.fromBech32(certModel.address).asReward()!.getPaymentCredential()
358323
};
359324

360325
if (isAuthorizeCommitteeHotCertModel(certModel))

packages/e2e/test/wallet_epoch_3/SharedWallet/delegation.test.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable max-statements */
22
import { BaseWallet, ObservableWallet } from '@cardano-sdk/wallet';
3-
import { BigIntMath, isNotNil } from '@cardano-sdk/util';
3+
import { BigIntMath, isNotNil, toSerializableObject } from '@cardano-sdk/util';
44
import { Cardano, Serialization, StakePoolProvider } from '@cardano-sdk/core';
55
import {
66
TX_TIMEOUT_DEFAULT,
@@ -204,6 +204,16 @@ describe('SharedWallet/delegation', () => {
204204
await waitForTx(aliceMultiSigWallet, tx.id);
205205
const tx1ConfirmedState = await getWalletStateSnapshot(aliceMultiSigWallet);
206206

207+
// Check Registration and StakeDelegation certificate from ChainHistoryProvider
208+
let gotTx = toSerializableObject(
209+
(await firstValueFrom(aliceMultiSigWallet.transactions.history$)).find((t) => tx.id === t.id)!
210+
);
211+
// These are required because txBuilder still uses StakeRegistration
212+
(gotTx as Cardano.HydratedTx).body.certificates![0].__typename = Cardano.CertificateType.StakeRegistration;
213+
delete ((gotTx as Cardano.HydratedTx).body.certificates![0] as Partial<Cardano.NewStakeAddressCertificate>).deposit;
214+
expect((gotTx as Cardano.HydratedTx).body.certificates?.length).toEqual(2);
215+
expect((gotTx as Cardano.HydratedTx).body.certificates).toEqual(toSerializableObject(tx.body.certificates));
216+
207217
// Updates total and available balance after tx is on-chain
208218
expect(tx1ConfirmedState.balance.total.coins).toBe(expectedCoinsAfterTx1);
209219
expect(tx1ConfirmedState.balance.total).toEqual(tx1ConfirmedState.balance.available);
@@ -237,6 +247,16 @@ describe('SharedWallet/delegation', () => {
237247
await waitForTx(aliceMultiSigWallet, tx.id);
238248
const tx2ConfirmedState = await getWalletStateSnapshot(aliceMultiSigWallet);
239249

250+
// Check Unregistration certificate from ChainHistoryProvider
251+
gotTx = toSerializableObject(
252+
(await firstValueFrom(aliceMultiSigWallet.transactions.history$)).find((t) => tx.id === t.id)!
253+
);
254+
// These are required because txBuilder still uses StakeDeregistration
255+
(gotTx as Cardano.HydratedTx).body.certificates![0].__typename = Cardano.CertificateType.StakeDeregistration;
256+
delete ((gotTx as Cardano.HydratedTx).body.certificates![0] as Partial<Cardano.NewStakeAddressCertificate>).deposit;
257+
expect((gotTx as Cardano.HydratedTx).body.certificates?.length).toEqual(1);
258+
expect((gotTx as Cardano.HydratedTx).body.certificates).toEqual(toSerializableObject(tx.body.certificates));
259+
240260
// No longer delegating
241261
expect(tx2ConfirmedState.rewardAccount.delegatee?.nextNextEpoch?.id).toBeUndefined();
242262
expect(tx2ConfirmedState.rewardAccount.credentialStatus).toBe(Cardano.StakeCredentialStatus.Unregistered);

0 commit comments

Comments
 (0)