Skip to content

Commit 11eb725

Browse files
authored
Merge pull request #1176 from input-output-hk/fix/chain-history-redeemer-purpose-mapper
fix(cardano-services): correct mapping of chain history redeemer purpose
2 parents 187ea89 + 2a1562c commit 11eb725

File tree

6 files changed

+33
-11
lines changed

6 files changed

+33
-11
lines changed

Diff for: .github/workflows/std.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ jobs:
217217
218218
for target in \
219219
"dev-preview@us-east-1" \
220-
"dev-preprod@us-east-1@v1" \
220+
"dev-preprod@us-east-1@v2" \
221221
"dev-mainnet@us-east-1" \
222222
; do
223223
nix run -L ".#cardano-services.${target}.plan" | tee k8s-plan.diff

Diff for: packages/cardano-services/src/ChainHistory/DbSyncChainHistory/mappers.ts

+17-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
WithCertType,
2121
WithdrawalModel
2222
} from './types';
23-
import { Cardano } from '@cardano-sdk/core';
23+
import { Cardano, NotImplementedError } from '@cardano-sdk/core';
2424
import { Hash32ByteBase16 } from '@cardano-sdk/crypto';
2525
import {
2626
isDelegationCertModel,
@@ -105,14 +105,29 @@ export const mapWithdrawal = (withdrawalModel: WithdrawalModel): Cardano.Withdra
105105
// Remove this and select the actual redeemer data from `redeemer_data` table.
106106
const stubRedeemerData = Buffer.from('not implemented');
107107

108+
const redeemerPurposeMap: Record<RedeemerModel['purpose'], Cardano.RedeemerPurpose> = {
109+
cert: Cardano.RedeemerPurpose.certificate,
110+
mint: Cardano.RedeemerPurpose.mint,
111+
proposing: Cardano.RedeemerPurpose.propose,
112+
reward: Cardano.RedeemerPurpose.withdrawal,
113+
spend: Cardano.RedeemerPurpose.spend,
114+
voting: Cardano.RedeemerPurpose.vote
115+
};
116+
117+
const mapRedeemerPurpose = (purpose: RedeemerModel['purpose']): Cardano.RedeemerPurpose =>
118+
redeemerPurposeMap[purpose] ||
119+
(() => {
120+
throw new NotImplementedError(`Failed to map redeemer "purpose": ${purpose}`);
121+
})();
122+
108123
export const mapRedeemer = (redeemerModel: RedeemerModel): Cardano.Redeemer => ({
109124
data: stubRedeemerData,
110125
executionUnits: {
111126
memory: Number(redeemerModel.unit_mem),
112127
steps: Number(redeemerModel.unit_steps)
113128
},
114129
index: redeemerModel.index,
115-
purpose: redeemerModel.purpose as Cardano.RedeemerPurpose
130+
purpose: mapRedeemerPurpose(redeemerModel.purpose)
116131
});
117132

118133
export const mapCertificate = (

Diff for: packages/cardano-services/src/ChainHistory/DbSyncChainHistory/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export interface WithdrawalModel {
9595

9696
export interface RedeemerModel {
9797
index: number;
98-
purpose: string;
98+
purpose: 'cert' | 'mint' | 'spend' | 'reward' | 'voting' | 'proposing';
9999
script_hash: Buffer;
100100
unit_mem: string;
101101
unit_steps: string;

Diff for: packages/cardano-services/src/ChainHistory/openApi.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,9 @@
361361
"spend",
362362
"mint",
363363
"certificate",
364-
"withdrawal"
364+
"withdrawal",
365+
"vote",
366+
"propose"
365367
]
366368
},
367369
"data": {

Diff for: packages/cardano-services/test/ChainHistory/DbSyncChainHistoryProvider/mappers.test.ts

+11-5
Original file line numberDiff line numberDiff line change
@@ -294,24 +294,30 @@ describe('chain history mappers', () => {
294294
});
295295
});
296296
describe('mapRedeemer', () => {
297-
const redeemerModel: RedeemerModel = {
297+
const redeemerModel: Omit<RedeemerModel, 'purpose'> = {
298298
index: 1,
299-
purpose: 'mint',
300299
script_hash: Buffer.from(hash28ByteBase16, 'hex'),
301300
tx_id: Buffer.from(transactionHash, 'hex'),
302301
unit_mem: '2000',
303302
unit_steps: '5000'
304303
};
305-
test('map RedeemerModel to Cardano.Redeemer', () => {
306-
const result = mappers.mapRedeemer(redeemerModel);
304+
test.each([
305+
['spend' as const, Cardano.RedeemerPurpose.spend],
306+
['mint' as const, Cardano.RedeemerPurpose.mint],
307+
['cert' as const, Cardano.RedeemerPurpose.certificate],
308+
['reward' as const, Cardano.RedeemerPurpose.withdrawal],
309+
['voting' as const, Cardano.RedeemerPurpose.vote],
310+
['proposing' as const, Cardano.RedeemerPurpose.propose]
311+
])("maps '%p' redeemer", (dbSyncRedeemerPurpose, sdkRedeemerPurpose) => {
312+
const result = mappers.mapRedeemer({ ...redeemerModel, purpose: dbSyncRedeemerPurpose });
307313
expect(result).toEqual<Cardano.Redeemer>({
308314
data: Buffer.from('not implemented'),
309315
executionUnits: {
310316
memory: 2000,
311317
steps: 5000
312318
},
313319
index: 1,
314-
purpose: Cardano.RedeemerPurpose.mint
320+
purpose: sdkRedeemerPurpose
315321
});
316322
});
317323
});

Diff for: packages/core/src/Cardano/types/Transaction.ts

-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ export enum RedeemerPurpose {
9696
mint = 'mint',
9797
certificate = 'certificate',
9898
withdrawal = 'withdrawal',
99-
delegateRepresentative = 'representative',
10099
propose = 'propose',
101100
vote = 'vote'
102101
}

0 commit comments

Comments
 (0)