Skip to content

Commit 3ce010d

Browse files
committed
- change event as request
- update test
1 parent be5c028 commit 3ce010d

File tree

3 files changed

+197
-43
lines changed

3 files changed

+197
-43
lines changed

contracts/sol6/Dao/EmergencyFeeHandler.sol

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import "../utils/PermissionGroupsNoModifiers.sol";
55
import "../utils/zeppelin/ReentrancyGuard.sol";
66
import "../utils/zeppelin/SafeMath.sol";
77
import "../utils/Utils5.sol";
8+
import "@nomiclabs/buidler/console.sol";
89

910
contract EmergencyKyberFeeHandler is IKyberFeeHandler, PermissionGroupsNoModifiers, ReentrancyGuard, Utils5 {
1011
using SafeMath for uint256;
@@ -29,9 +30,14 @@ contract EmergencyKyberFeeHandler is IKyberFeeHandler, PermissionGroupsNoModifie
2930
uint256 feeBRRWei
3031
);
3132

32-
event BRRFeeDistribution (
33+
event FeeDistribution(
34+
IERC20 indexed token,
35+
address indexed platformWallet,
36+
uint256 platformFeeWei,
3337
uint256 rewardWei,
3438
uint256 rebateWei,
39+
address[] rebateWallets,
40+
uint256[] rebatePercentBpsPerWallet,
3541
uint256 burnAmountWei
3642
);
3743

@@ -83,12 +89,24 @@ contract EmergencyKyberFeeHandler is IKyberFeeHandler, PermissionGroupsNoModifie
8389
emit HandleFee(ETH_TOKEN_ADDRESS, platformWallet, platformFee, rebateWallets, rebateBpsPerWallet, networkFee);
8490

8591
if (networkFee == 0) {
92+
emit FeeDistribution(
93+
ETH_TOKEN_ADDRESS,
94+
platformWallet,
95+
platformFee,
96+
0,
97+
0,
98+
rebateWallets,
99+
rebateBpsPerWallet,
100+
0
101+
);
86102
return;
87103
}
88104

89105
(bool success, ) = address(this).call(
90106
abi.encodeWithSignature(
91-
"calculateAndRecordFeeData(address[],uint256[],uint256)",
107+
"calculateAndRecordFeeData(address,uint256,address[],uint256[],uint256)",
108+
platformWallet,
109+
platformFee,
92110
rebateWallets,
93111
rebateBpsPerWallet,
94112
networkFee
@@ -100,6 +118,8 @@ contract EmergencyKyberFeeHandler is IKyberFeeHandler, PermissionGroupsNoModifie
100118
}
101119

102120
function calculateAndRecordFeeData(
121+
address platformWallet,
122+
uint256 platformFee,
103123
address[] calldata rebateWallets,
104124
uint256[] calldata rebateBpsPerWallet,
105125
uint256 feeBRRWei
@@ -114,9 +134,14 @@ contract EmergencyKyberFeeHandler is IKyberFeeHandler, PermissionGroupsNoModifie
114134

115135
uint burnAmountWei = feeBRRWei.sub(rewardWei).sub(rebateWei);
116136

117-
emit BRRFeeDistribution(
137+
emit FeeDistribution(
138+
ETH_TOKEN_ADDRESS,
139+
platformWallet,
140+
platformFee,
118141
rewardWei,
119142
rebateWei,
143+
rebateWallets,
144+
rebateBpsPerWallet,
120145
burnAmountWei
121146
);
122147
}

contracts/sol6/Dao/mock/MockEmergencyFeeHandler.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ contract MockEmergencyFeeHandler is EmergencyKyberFeeHandler {
1313
) public EmergencyKyberFeeHandler(admin, _kyberNetwork, _rewardBps, _rebateBps, _burnBps) {}
1414

1515
function calculateAndRecordFeeData(
16+
address,
17+
uint256,
1618
address[] calldata,
1719
uint256[] calldata,
1820
uint256

test/sol6/emergencyFeeHandler.js

Lines changed: 167 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,19 @@ const TestToken = artifacts.require('Token.sol')
88
const Helper = require('../helper.js')
99
const nwHelper = require('./networkHelper.js')
1010
const BN = web3.utils.BN
11-
const {BPS, precisionUnits, ethDecimals, ethAddress, zeroAddress, emptyHint, zeroBN, MAX_QTY, MAX_RATE} = require('../helper.js')
11+
const {
12+
BPS,
13+
precisionUnits,
14+
ethDecimals,
15+
ethAddress,
16+
zeroAddress,
17+
emptyHint,
18+
zeroBN,
19+
MAX_QTY,
20+
MAX_RATE
21+
} = require('../helper.js')
1222
const {expectEvent, expectRevert} = require('@openzeppelin/test-helpers')
23+
const {assert} = require('chai')
1324

1425
let admin
1526
let feeHandler
@@ -35,7 +46,10 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
3546

3647
describe('valid constructor params', async () => {
3748
it('test total BRR value should be BPS', async () => {
38-
await expectRevert(EmergencyKyberFeeHandler.new(admin, network, rewardBps, rebateBps, burnBps.add(new BN(1))), 'Bad BRR values')
49+
await expectRevert(
50+
EmergencyKyberFeeHandler.new(admin, network, rewardBps, rebateBps, burnBps.add(new BN(1))),
51+
'Bad BRR values'
52+
)
3953
})
4054

4155
it('test total BRR value should not be overflow', async () => {
@@ -73,6 +87,7 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
7387
it('should handle Fee', async () => {
7488
let platformFee = new BN(10).pow(new BN(17))
7589
let fee = new BN(10).pow(new BN(18))
90+
let networkFee = fee.sub(platformFee)
7691

7792
let initalState = await getFeeHanlerState(feeHandler, rebateWallets, platformWallet)
7893
let txResult = await feeHandler.handleFees(
@@ -81,51 +96,68 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
8196
rebateBpsPerWallet,
8297
platformWallet,
8398
platformFee,
84-
fee.sub(platformFee),
99+
networkFee,
85100
{
86101
from: network,
87102
value: fee
88103
}
89104
)
90105

91-
let feeBrrWei = fee.sub(platformFee)
92-
let rewardWei = feeBrrWei.mul(rewardBps).div(BPS)
106+
let brrFeeResult = calculateBrrFee(networkFee, rewardBps, rebateBps, rebateWallets, rebateBpsPerWallet)
93107

94108
await expectEvent(txResult, 'HandleFee', {
95109
platformWallet,
96110
platformFeeWei: platformFee,
97-
feeBRRWei: feeBrrWei
111+
rebateWallets,
112+
feeBRRWei: networkFee
98113
})
99114

100-
await expectEvent(txResult, 'BRRFeeDistribution', {
101-
rewardWei: rewardWei
115+
await expectEvent(txResult, 'FeeDistribution', {
116+
platformWallet,
117+
platformFeeWei: platformFee,
118+
rewardWei: brrFeeResult.rewardWei,
119+
rebateWei: brrFeeResult.rebateWei,
120+
rebateWallets,
121+
burnAmountWei: brrFeeResult.burnWei
102122
})
103123

104-
await assertStateAfterHandlerFees(feeHandler, initalState, rebateWallets, rebateBpsPerWallet, platformWallet, platformFee, fee)
124+
await assertStateAfterHandlerFees(feeHandler, initalState, platformWallet, platformFee, brrFeeResult)
105125
})
106126

107127
it('should handle Fee with only platform Fee', async () => {
108128
let platformFee = new BN(10).pow(new BN(17))
109129
let initalState = await getFeeHanlerState(feeHandler, rebateWallets, platformWallet)
110-
let txResult = await feeHandler.handleFees(ethAddress, rebateWallets, rebateBpsPerWallet, platformWallet, platformFee, zeroBN, {
111-
from: network,
112-
value: platformFee
113-
})
130+
let txResult = await feeHandler.handleFees(
131+
ethAddress,
132+
rebateWallets,
133+
rebateBpsPerWallet,
134+
platformWallet,
135+
platformFee,
136+
zeroBN,
137+
{
138+
from: network,
139+
value: platformFee
140+
}
141+
)
114142

115143
await expectEvent(txResult, 'HandleFee', {
116144
platformWallet,
117145
platformFeeWei: platformFee,
118146
feeBRRWei: new BN(0)
119147
})
120-
await assertStateAfterHandlerFees(
121-
feeHandler,
122-
initalState,
123-
rebateWallets,
124-
rebateBpsPerWallet,
148+
149+
await expectEvent(txResult, 'FeeDistribution', {
125150
platformWallet,
126-
platformFee,
127-
platformFee
128-
)
151+
platformFeeWei: platformFee,
152+
rewardWei: zeroBN,
153+
rebateWei: zeroBN,
154+
rebateWallets,
155+
burnAmountWei: zeroBN
156+
})
157+
158+
let brrFeeResult = calculateBrrFee(zeroBN, rewardBps, rebateBps, rebateWallets, rebateBpsPerWallet)
159+
160+
await assertStateAfterHandlerFees(feeHandler, initalState, platformWallet, platformFee, brrFeeResult)
129161
})
130162

131163
it('test failtolerance when calculateAndRecordFeeData failed', async () => {
@@ -152,7 +184,77 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
152184
})
153185
//platform fee should update as normal
154186
let afterFeePerPlatformWallet = await feeHandler.feePerPlatformWallet(platformWallet)
155-
Helper.assertEqual(initalFeePerPlatformWallet.add(platformFee), afterFeePerPlatformWallet, 'unexpected feePerPlatformWallet')
187+
Helper.assertEqual(
188+
initalFeePerPlatformWallet.add(platformFee),
189+
afterFeePerPlatformWallet,
190+
'unexpected feePerPlatformWallet'
191+
)
192+
})
193+
194+
describe('test validate condition', async () => {
195+
it('test only network call handleFee', async () => {
196+
let platformFee = new BN(10).pow(new BN(17))
197+
let fee = new BN(10).pow(new BN(18))
198+
let networkFee = fee.sub(platformFee)
199+
200+
await expectRevert(
201+
feeHandler.handleFees(
202+
ethAddress,
203+
rebateWallets,
204+
rebateBpsPerWallet,
205+
platformWallet,
206+
platformFee,
207+
networkFee,
208+
{
209+
from: admin,
210+
value: fee
211+
}
212+
),
213+
'only kyberNetwork'
214+
)
215+
})
216+
217+
it('test calculateAndRecordFeeData only call by feehandler', async () => {
218+
let platformFee = new BN(10).pow(new BN(17))
219+
let networkFee = new BN(10).pow(new BN(18))
220+
221+
try {
222+
await feeHandler.calculateAndRecordFeeData(
223+
platformWallet,
224+
platformFee,
225+
rebateWallets,
226+
rebateBpsPerWallet,
227+
networkFee,
228+
{from: admin}
229+
)
230+
assert(false, 'transaction should be revert')
231+
} catch (e) {
232+
assert(Helper.isRevertErrorMessage(e), 'expected throw but got: ' + e)
233+
}
234+
})
235+
236+
it('test revert if token is not eth', async () => {
237+
testToken = await TestToken.new('test', 'KNC', 18)
238+
let platformFee = new BN(10).pow(new BN(17))
239+
let fee = new BN(10).pow(new BN(18))
240+
let networkFee = fee.sub(platformFee)
241+
242+
await expectRevert(
243+
feeHandler.handleFees(
244+
testToken.address,
245+
rebateWallets,
246+
rebateBpsPerWallet,
247+
platformWallet,
248+
platformFee,
249+
networkFee,
250+
{
251+
from: admin,
252+
value: fee
253+
}
254+
),
255+
'only kyberNetwork'
256+
)
257+
})
156258
})
157259
})
158260

@@ -214,6 +316,7 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
214316
afterTotalPlatformFee,
215317
'total balance platform fee wei is not update as expected'
216318
)
319+
await expectRevert(feeHandler.claimPlatformFee(platformWallet), 'no fee to claim')
217320
})
218321
})
219322

@@ -311,7 +414,17 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
311414
.mul(networkFeeBps)
312415
.div(BPS)
313416
.add(platformFeeWei)
314-
await assertStateAfterHandlerFees(feeHandler, initalState, [rebateWallet], [BPS], platformWallet, platformFeeWei, fee)
417+
let brrFeeResult = calculateBrrFee(fee.sub(platformFeeWei), rewardBps, rebateBps, [rebateWallet], [BPS])
418+
await expectEvent.inTransaction(txResult.tx, feeHandler, 'HandleFee')
419+
await expectEvent.inTransaction(txResult.tx, feeHandler, 'FeeDistribution', {
420+
platformWallet,
421+
platformFeeWei,
422+
rewardWei: brrFeeResult.rewardWei,
423+
rebateWei: brrFeeResult.rebateWei,
424+
rebateWallets: [rebateWallet],
425+
burnAmountWei: brrFeeResult.burnWei
426+
})
427+
await assertStateAfterHandlerFees(feeHandler, initalState, platformWallet, platformFeeWei, brrFeeResult)
315428
})
316429
})
317430
})
@@ -329,30 +442,44 @@ async function getFeeHanlerState (feeHandler, rebateWallets, platformWallet) {
329442
}
330443
}
331444

332-
async function assertStateAfterHandlerFees (
333-
feeHandler,
334-
initalState,
335-
rebateWallets,
336-
rebateBpsPerWallet,
337-
platformWallet,
338-
platformFeeWei,
339-
fee
340-
) {
341-
let afterState = await getFeeHanlerState(feeHandler, rebateWallets, platformWallet)
445+
function calculateBrrFee (networkFee, rewardBps, rebateBps, rebateWallets, rebateBpsPerWallet) {
446+
let rewardWei = networkFee.mul(rewardBps).div(BPS)
447+
let rebateWei = networkFee.mul(rebateBps).div(BPS)
448+
let totalRebatePaidWei = new BN(0)
449+
rebatePerWallets = []
450+
for (let i = 0; i < rebateWallets.length; i++) {
451+
let rebatePerWallet = rebateWei.mul(rebateBpsPerWallet[i]).div(BPS)
452+
totalRebatePaidWei = totalRebatePaidWei.add(rebatePerWallet)
453+
rebatePerWallets.push(rebatePerWallet)
454+
}
455+
rebateWei = totalRebatePaidWei
456+
let burnWei = networkFee.sub(rewardWei).sub(rebateWei)
457+
return {
458+
rewardWei,
459+
burnWei,
460+
rebateWei,
461+
rebateWallets,
462+
rebatePerWallets
463+
}
464+
}
465+
466+
async function assertStateAfterHandlerFees (feeHandler, initalState, platformWallet, platformFeeWei, feeBrrResult) {
467+
let afterState = await getFeeHanlerState(feeHandler, feeBrrResult.rebateWallets, platformWallet)
342468
let expectedPlatformFeeWei = initalState.platformFeeWei.add(platformFeeWei)
343469
Helper.assertEqual(expectedPlatformFeeWei, afterState.platformFeeWei, 'unexpected platform Fee')
344470

345-
let feeBrrWei = fee.sub(platformFeeWei)
346-
let rewardWei = feeBrrWei.mul(rewardBps).div(BPS)
347-
Helper.assertEqual(afterState.rewardWei, initalState.rewardWei.add(rewardWei), 'unexpected rewardWei')
471+
Helper.assertEqual(afterState.rewardWei, initalState.rewardWei.add(feeBrrResult.rewardWei), 'unexpected rewardWei')
348472

349473
if (rebateWallets.length == 0) {
350474
return
351475
}
352-
let rebateWei = feeBrrWei.mul(rebateBps).div(BPS)
353476

354-
for (let i = 0; i < rebateWallets.length; i++) {
355-
let rebatePerWallet = rebateWei.mul(rebateBpsPerWallet[i]).div(BPS)
356-
Helper.assertEqual(rebatePerWallet.add(initalState.rebatePerWallet[i]), afterState.rebatePerWallet[i], 'unpected rebatePerWallet')
477+
for (let i = 0; i < feeBrrResult.rebateWallets.length; i++) {
478+
let rebatePerWallet = feeBrrResult.rebatePerWallets[i]
479+
Helper.assertEqual(
480+
rebatePerWallet.add(initalState.rebatePerWallet[i]),
481+
afterState.rebatePerWallet[i],
482+
'unpected rebatePerWallet'
483+
)
357484
}
358485
}

0 commit comments

Comments
 (0)