1
1
const { sha3, soliditySha3 } = require ( 'web3-utils' )
2
+ const { assertRevert } = require ( '../../helpers/assertThrow' )
2
3
const { getEventArgument, getNewProxyAddress } = require ( '../../helpers/events' )
3
4
4
5
const ACL = artifacts . require ( 'ACL' )
@@ -7,10 +8,10 @@ const Relayer = artifacts.require('Relayer')
7
8
const DAOFactory = artifacts . require ( 'DAOFactory' )
8
9
const SampleApp = artifacts . require ( 'RelayedAppMock' )
9
10
10
- contract ( 'VolatileRelayedApp ' , ( [ _ , root , sender , vault , offChainRelayerService ] ) => {
11
- let daoFactory , dao , acl , app , relayer , relayedTx , nonce = 1
11
+ contract ( 'RelayedApp ' , ( [ _ , root , member , anyone , vault , offChainRelayerService ] ) => {
12
+ let daoFactory , dao , acl , app , relayer , relayedTx , nonce = 0
12
13
let kernelBase , aclBase , sampleAppBase , relayerBase
13
- let WRITING_ROLE , APP_MANAGER_ROLE , RELAYER_ROLE , ALLOW_OFF_CHAIN_SERVICE_ROLE
14
+ let WRITING_ROLE , APP_MANAGER_ROLE , ALLOW_OFF_CHAIN_SERVICE_ROLE , RELAYER_APP_ID
14
15
15
16
before ( 'deploy base implementations' , async ( ) => {
16
17
aclBase = await ACL . new ( )
@@ -20,9 +21,9 @@ contract('VolatileRelayedApp', ([_, root, sender, vault, offChainRelayerService]
20
21
daoFactory = await DAOFactory . new ( kernelBase . address , aclBase . address , '0x0' )
21
22
} )
22
23
23
- before ( 'load roles' , async ( ) => {
24
+ before ( 'load constants' , async ( ) => {
25
+ RELAYER_APP_ID = await kernelBase . DEFAULT_RELAYER_APP_ID ( )
24
26
WRITING_ROLE = await sampleAppBase . WRITING_ROLE ( )
25
- RELAYER_ROLE = await sampleAppBase . RELAYER_ROLE ( )
26
27
APP_MANAGER_ROLE = await kernelBase . APP_MANAGER_ROLE ( )
27
28
ALLOW_OFF_CHAIN_SERVICE_ROLE = await relayerBase . ALLOW_OFF_CHAIN_SERVICE_ROLE ( )
28
29
} )
@@ -36,7 +37,7 @@ contract('VolatileRelayedApp', ([_, root, sender, vault, offChainRelayerService]
36
37
} )
37
38
38
39
before ( 'create relayer instance' , async ( ) => {
39
- const receipt = await dao . newAppInstance ( '0x11111' , relayerBase . address , '0x' , false , { from : root } )
40
+ const receipt = await dao . newAppInstance ( RELAYER_APP_ID , relayerBase . address , '0x' , true , { from : root } )
40
41
relayer = Relayer . at ( getNewProxyAddress ( receipt ) )
41
42
await relayer . initialize ( )
42
43
@@ -51,32 +52,48 @@ contract('VolatileRelayedApp', ([_, root, sender, vault, offChainRelayerService]
51
52
app = SampleApp . at ( getNewProxyAddress ( receipt ) )
52
53
await app . initialize ( )
53
54
54
- await acl . createPermission ( sender , app . address , WRITING_ROLE , root , { from : root } )
55
- await acl . createPermission ( relayer . address , app . address , RELAYER_ROLE , root , { from : root } )
55
+ await acl . createPermission ( member , app . address , WRITING_ROLE , root , { from : root } )
56
56
} )
57
57
58
- beforeEach ( 'relay transaction' , async ( ) => {
59
- const calldata = app . contract . write . getData ( 10 )
60
- const messageHash = soliditySha3 ( sha3 ( calldata ) , nonce )
61
- const signature = web3 . eth . sign ( sender , messageHash )
58
+ beforeEach ( 'increment nonce' , ( ) => nonce ++ )
62
59
63
- relayedTx = await relayer . relay ( sender , app . address , nonce , calldata , signature , { from : offChainRelayerService } )
64
- nonce ++
65
- } )
60
+ context ( 'when the sender is authorized' , ( ) => {
61
+ const sender = member
62
+
63
+ beforeEach ( 'relay transaction' , async ( ) => {
64
+ const calldata = app . contract . write . getData ( 10 )
65
+ const messageHash = soliditySha3 ( sha3 ( calldata ) , nonce )
66
+ const signature = web3 . eth . sign ( sender , messageHash )
67
+
68
+ relayedTx = await relayer . relay ( sender , app . address , nonce , calldata , signature , { from : offChainRelayerService } )
69
+ } )
70
+
71
+ it ( 'relays transactions to app' , async ( ) => {
72
+ assert . equal ( ( await app . read ( ) ) . toString ( ) , 10 , 'app value does not match' )
73
+ } )
74
+
75
+ it ( 'overloads a transaction with ~34k of gas' , async ( ) => {
76
+ const { receipt : { cumulativeGasUsed : relayedGasUsed } } = relayedTx
77
+ const { receipt : { cumulativeGasUsed : nonRelayerGasUsed } } = await app . write ( 10 , { from : sender } )
78
+
79
+ const gasOverload = relayedGasUsed - nonRelayerGasUsed
80
+ console . log ( 'relayedGasUsed:' , relayedGasUsed )
81
+ console . log ( 'nonRelayerGasUsed:' , nonRelayerGasUsed )
82
+ console . log ( 'gasOverload:' , gasOverload )
66
83
67
- it ( 'relays transactions to app' , async ( ) => {
68
- assert . equal ( ( await app . read ( ) ) . toString ( ) , 10 , 'app value does not match' )
84
+ assert . isBelow ( gasOverload , 34000 , 'relayed txs gas overload is higher than 34k' )
85
+ } )
69
86
} )
70
87
71
- it ( 'overloads a transaction with ~78k of gas' , async ( ) => {
72
- const { receipt : { cumulativeGasUsed : relayedGasUsed } } = relayedTx
73
- const { receipt : { cumulativeGasUsed : nonRelayerGasUsed } } = await app . write ( 10 , { from : sender } )
88
+ context ( 'when the sender is not authorized' , ( ) => {
89
+ const sender = anyone
74
90
75
- const gasOverload = relayedGasUsed - nonRelayerGasUsed
76
- console . log ( 'relayedGasUsed:' , relayedGasUsed )
77
- console . log ( 'nonRelayerGasUsed:' , nonRelayerGasUsed )
78
- console . log ( 'gasOverload:' , gasOverload )
91
+ it ( 'reverts' , async ( ) => {
92
+ const calldata = app . contract . write . getData ( 10 )
93
+ const messageHash = soliditySha3 ( sha3 ( calldata ) , nonce )
94
+ const signature = web3 . eth . sign ( sender , messageHash )
79
95
80
- assert . isBelow ( gasOverload , 78000 , 'relayed txs gas overload is higher than 78k' )
96
+ await assertRevert ( relayer . relay ( sender , app . address , nonce , calldata , signature , { from : offChainRelayerService } ) , 'APP_AUTH_FAILED' )
97
+ } )
81
98
} )
82
99
} )
0 commit comments