1+ pragma solidity ^ 0.6.0 ;
2+ pragma experimental ABIEncoderV2;
3+
4+ contract ReceiveAndCallbackFunction {
5+ event Info (string , uint256 );
6+ // receive function
7+ receive () external payable {
8+ require (msg .value > 10 , "receive() msg.value is zero " );
9+ emit Info ("receive() msg.value " , msg .value );
10+ }
11+
12+ // fallback function
13+ fallback () external payable {
14+ require (msg .value > 0 , "fallback() msg.value is zero " );
15+ emit Info ("fallback() msg.value " , msg .value );
16+ }
17+ }
18+
19+ contract OnlyReceiveFunction {
20+ event Info (string , uint256 );
21+ // receive function
22+ receive () external payable {
23+ require (msg .value > 10 , "receive() msg.value is zero " );
24+ emit Info ("receive() msg.value " , msg .value );
25+ }
26+ }
27+
28+ contract OnlyFallbackFunction {
29+
30+ event Info (string , uint256 );
31+
32+ // fallback function
33+ fallback () external payable {
34+ require (msg .value > 0 , "fallback() msg.value is zero " );
35+ emit Info ("fallback() msg.value " , msg .value );
36+ }
37+ }
38+
39+
40+ contract BalanceReceiveTest {
41+ modifier mustHasBalance () {
42+ require (address (this ).balance > 0 , "balance not enough " );
43+ _;
44+ }
45+
46+ function callTransfer (address payable to , uint256 amount ) public payable {
47+ to.transfer (amount);
48+ }
49+
50+ function callFallback (address payable to , uint256 amount ) public payable {
51+ (bool success , bytes memory reason ) = to.call {value: amount}("aaa() " );
52+ require (success, string (abi.encodePacked ("callFallback failed: " , reason)));
53+ }
54+
55+ function checkOnlyFallbackFunction () public payable {
56+ uint256 callValue = 7 ;
57+
58+ OnlyFallbackFunction contractAddress = new OnlyFallbackFunction ();
59+ // must success
60+ try this .callTransfer (address (contractAddress), callValue) {
61+ } catch (bytes memory reason ) {
62+ require (false , string (abi.encodePacked ("checkOnlyFallbackFunction callTransfer with value failed: " , reason)));
63+ }
64+
65+ require (address (contractAddress).balance == callValue, "checkReceive failed: balance not equal " );
66+
67+ // must failed transfer 0
68+ try this .callTransfer (address (contractAddress), 0 ) {
69+ require (false , "checkOnlyFallbackFunction callTransfer without value should revert " );
70+ } catch {
71+ }
72+
73+ // must success on fallback value is not 0
74+ try this .callFallback (address (contractAddress), callValue) {
75+ } catch (bytes memory reason ) {
76+ require (false , string (abi.encodePacked ("checkOnlyFallbackFunction callFallback with value failed: " , reason)));
77+ }
78+
79+ require (address (contractAddress).balance == callValue * 2 , "checkReceive failed: balance not equal " );
80+
81+ // must failed on fallback value is 0
82+ try this .callFallback (address (contractAddress), 0 ) {
83+ require (false , "checkOnlyFallbackFunction callFallback without value should revert " );
84+ } catch {
85+ }
86+ }
87+
88+ function checkOnlyReceiveFunction () public payable {
89+ uint256 callValue = 17 ;
90+
91+ OnlyReceiveFunction contractAddress = new OnlyReceiveFunction ();
92+ // must success
93+ try this .callTransfer (address (contractAddress), callValue) {
94+ } catch (bytes memory reason ) {
95+ require (false , string (abi.encodePacked ("checkOnlyReceiveFunction callTransfer with value failed: " , reason)));
96+ }
97+
98+ require (address (contractAddress).balance == callValue, "checkReceive failed: balance not equal " );
99+
100+ // must failed transfer lesser than 10
101+ try this .callTransfer (address (contractAddress), 1 ) {
102+ require (false , "checkOnlyReceiveFunction callTransfer without value should revert " );
103+ } catch {
104+ }
105+
106+ // must failed on fallback value is over 10
107+ try this .callFallback (address (contractAddress), callValue) {
108+ require (false , "checkOnlyReceiveFunction callFallback with value should revert " );
109+ } catch {
110+ }
111+
112+ require (address (contractAddress).balance == callValue, "checkReceive failed: balance not equal " );
113+
114+ // must failed on fallback value is lesser than 10
115+ try this .callFallback (address (contractAddress), 1 ) {
116+ require (false , "checkOnlyReceiveFunction callFallback without value should revert " );
117+ } catch {
118+ }
119+ }
120+
121+ function checkReceiveAndFallbackFunction () public payable {
122+ uint256 callValue = 17 ;
123+ ReceiveAndCallbackFunction contractAddress = new ReceiveAndCallbackFunction ();
124+ // must success
125+ try this .callTransfer (address (contractAddress), callValue) {
126+ } catch (bytes memory reason ) {
127+ require (false , string (abi.encodePacked ("checkReceiveAndFallbackFunction callTransfer with value failed: " , reason)));
128+ }
129+
130+ require (address (contractAddress).balance == callValue, "checkReceive failed: balance not equal " );
131+
132+ // must failed transfer 0
133+ try this .callTransfer (address (contractAddress), 1 ) {
134+ require (false , "checkReceiveAndFallbackFunction callTransfer without value should revert " );
135+ } catch {
136+ }
137+ require (address (contractAddress).balance == callValue, "checkReceive failed: balance not equal " );
138+
139+ uint256 callValue2 = 5 ;
140+
141+ // must success on fallback value is not 0
142+ try this .callFallback (address (contractAddress), callValue2) {
143+ } catch (bytes memory reason ) {
144+ require (false , string (abi.encodePacked ("checkReceiveAndFallbackFunction callFallback with value failed: " , reason)));
145+ }
146+
147+ require (address (contractAddress).balance == callValue + callValue2, "checkReceive failed: balance not equal " );
148+
149+ // must failed on fallback value is 0
150+ try this .callFallback (address (contractAddress), 0 ) {
151+ require (false , "checkReceiveAndFallbackFunction callFallback without value should revert " );
152+ } catch {
153+ }
154+
155+ require (address (contractAddress).balance == callValue + callValue2, "checkReceive failed2: balance not equal " );
156+ }
157+
158+ function check () public payable mustHasBalance {
159+ checkOnlyFallbackFunction ();
160+ checkOnlyReceiveFunction ();
161+ checkReceiveAndFallbackFunction ();
162+ }
163+ }
0 commit comments