@@ -8,8 +8,19 @@ const TestToken = artifacts.require('Token.sol')
88const Helper = require ( '../helper.js' )
99const nwHelper = require ( './networkHelper.js' )
1010const 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' )
1222const { expectEvent, expectRevert} = require ( '@openzeppelin/test-helpers' )
23+ const { assert} = require ( 'chai' )
1324
1425let admin
1526let 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