diff --git a/framework/src/modules/reward/module.ts b/framework/src/modules/reward/module.ts index d930b44a0eb..955aca91c13 100644 --- a/framework/src/modules/reward/module.ts +++ b/framework/src/modules/reward/module.ts @@ -36,7 +36,7 @@ export class RewardModule extends BaseModule { this._tokenAPI = tokenAPI; this._randomAPI = randomAPI; this._bftAPI = bftAPI; - this.api.addDependencies(bftAPI, randomAPI); + this.api.addDependencies(this._bftAPI, this._randomAPI); } // eslint-disable-next-line @typescript-eslint/require-await @@ -62,9 +62,22 @@ export class RewardModule extends BaseModule { }); } - // eslint-disable-next-line @typescript-eslint/require-await - public async afterBlockExecute(_context: BlockAfterExecuteContext): Promise { - // eslint-disable-next-line no-console - console.log(this._tokenAPI, this._bftAPI, this._randomAPI, this._tokenIDReward); + public async afterBlockExecute(context: BlockAfterExecuteContext): Promise { + const blockReward = await this.api.getBlockReward( + context.getAPIContext(), + context.header, + context.assets, + ); + + if (blockReward <= BigInt(0)) { + return; + } + + await this._tokenAPI.mint( + context.getAPIContext(), + context.header.generatorAddress, + this._tokenIDReward, + blockReward, + ); } } diff --git a/framework/test/unit/modules/reward/reward_module.spec.ts b/framework/test/unit/modules/reward/reward_module.spec.ts index ead770d6e20..84cf5cc9e0b 100644 --- a/framework/test/unit/modules/reward/reward_module.spec.ts +++ b/framework/test/unit/modules/reward/reward_module.spec.ts @@ -12,6 +12,7 @@ * Removal or modification of this copyright notice is prohibited. */ import { RewardModule } from '../../../../src/modules/reward'; +import { createBlockContext, createBlockHeaderWithDefaults } from '../../../../src/testing'; describe('RewardModule', () => { const genesisConfig: any = {}; @@ -30,14 +31,15 @@ describe('RewardModule', () => { const generatorConfig: any = {}; let rewardModule: RewardModule; - - beforeAll(async () => { + let mint: any; + beforeEach(async () => { + mint = jest.fn(); rewardModule = new RewardModule(); await rewardModule.init({ genesisConfig, moduleConfig, generatorConfig }); rewardModule.addDependencies( - { mint: jest.fn() } as any, - { isValidSeedReveal: jest.fn() } as any, - { impliesMaximalPrevotes: jest.fn() } as any, + { mint } as any, + { isValidSeedReveal: jest.fn().mockReturnValue(true) } as any, + { impliesMaximalPrevotes: jest.fn().mockReturnValue(true) } as any, ); }); @@ -46,4 +48,26 @@ describe('RewardModule', () => { expect(rewardModule['_moduleConfig']).toEqual(moduleConfig); }); }); + + describe('afterBlockExecute', () => { + it(`should call mint for a valid bracket`, async () => { + const blockHeader = createBlockHeaderWithDefaults({ height: moduleConfig.offset }); + const blockAfterExecuteContext = createBlockContext({ + header: blockHeader, + }).getBlockAfterExecuteContext(); + await rewardModule.afterBlockExecute(blockAfterExecuteContext); + + expect(mint).toHaveBeenCalledTimes(1); + }); + + it('should not mint reward for reward <= 0', async () => { + const blockHeader = createBlockHeaderWithDefaults({ height: 1 }); + const blockAfterExecuteContext = createBlockContext({ + header: blockHeader, + }).getBlockAfterExecuteContext(); + await rewardModule.afterBlockExecute(blockAfterExecuteContext); + + expect(mint).not.toHaveBeenCalled(); + }); + }); });