Skip to content

Commit e305e80

Browse files
fix(core): withdrawal calculation in computeImplicitCoin
1 parent f89fba9 commit e305e80

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

Diff for: packages/core/src/Cardano/util/computeImplicitCoin.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ const stakeCredentialInRewardAccounts = (
3030
return rewardAccounts.includes(Address.RewardAccount.fromCredential(stakeCredential, networkId));
3131
};
3232

33+
const stakeAddressInRewardAccounts = (
34+
stakeAddress: Address.RewardAccount,
35+
rewardAccounts: Address.RewardAccount[]
36+
): boolean => {
37+
if (rewardAccounts.length === 0) return true;
38+
return rewardAccounts.includes(stakeAddress);
39+
};
40+
3341
const computeShellyDeposits = (
3442
depositParams: DepositProtocolParams,
3543
certificates: Cardano.Certificate[],
@@ -179,7 +187,11 @@ export const computeImplicitCoin = (
179187
proposalProcedures
180188
);
181189

182-
const withdrawalsTotal = (withdrawals && BigIntMath.sum(withdrawals.map(({ quantity }) => quantity))) || 0n;
190+
const ownWithdrawals =
191+
rewardAccounts && withdrawals
192+
? withdrawals.filter((withdrawal) => stakeAddressInRewardAccounts(withdrawal.stakeAddress, rewardAccounts))
193+
: [];
194+
const withdrawalsTotal = BigIntMath.sum(ownWithdrawals.map(({ quantity }) => quantity)) || 0n;
183195

184196
return {
185197
deposit,

Diff for: packages/core/test/Cardano/util/computeImplicitCoin.test.ts

+14
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,20 @@ describe('Cardano.util.computeImplicitCoin', () => {
203203
expect(coin.withdrawals).toBe(withdrawals[0].quantity);
204204
});
205205

206+
it('sums withdrawals for input for own reward accounts', () => {
207+
const protocolParameters = { dRepDeposit: 5, poolDeposit: 3, stakeKeyDeposit: 2 } as Cardano.ProtocolParameters;
208+
const certificates: Cardano.Certificate[] = [];
209+
const foreignRewardAccount = Cardano.RewardAccount(
210+
'stake_test17rphkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gtcljw6kf'
211+
);
212+
const withdrawals: Cardano.Withdrawal[] = [
213+
{ quantity: 15n, stakeAddress: foreignRewardAccount },
214+
{ quantity: 5n, stakeAddress: rewardAccount }
215+
];
216+
const coin = Cardano.util.computeImplicitCoin(protocolParameters, { certificates, withdrawals }, [rewardAccount]);
217+
expect(coin.withdrawals).toBe(5n);
218+
});
219+
206220
it('sums certificates and proposal procedures for deposit', () => {
207221
const protocolParameters = { governanceActionDeposit: 4, stakeKeyDeposit: 2 } as Cardano.ProtocolParameters;
208222
const governanceActionDeposit = BigInt(protocolParameters.governanceActionDeposit!);

0 commit comments

Comments
 (0)