openzepplin-solidity 0.0.1-security → 3.4.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of openzepplin-solidity might be problematic. Click here for more details.
- package/LICENSE +22 -0
- package/README.md +75 -3
- package/build/contracts/AccessControl.json +237 -0
- package/build/contracts/Address.json +8 -0
- package/build/contracts/Arrays.json +8 -0
- package/build/contracts/BeaconProxy.json +33 -0
- package/build/contracts/Clones.json +8 -0
- package/build/contracts/ConditionalEscrow.json +163 -0
- package/build/contracts/Context.json +8 -0
- package/build/contracts/Counters.json +8 -0
- package/build/contracts/Create2.json +8 -0
- package/build/contracts/ECDSA.json +8 -0
- package/build/contracts/EIP712.json +8 -0
- package/build/contracts/ERC1155.json +332 -0
- package/build/contracts/ERC1155Burnable.json +367 -0
- package/build/contracts/ERC1155Holder.json +106 -0
- package/build/contracts/ERC1155Pausable.json +360 -0
- package/build/contracts/ERC1155PresetMinterPauser.json +741 -0
- package/build/contracts/ERC1155Receiver.json +106 -0
- package/build/contracts/ERC165.json +28 -0
- package/build/contracts/ERC165Checker.json +8 -0
- package/build/contracts/ERC1820Implementer.json +33 -0
- package/build/contracts/ERC20.json +295 -0
- package/build/contracts/ERC20Burnable.json +310 -0
- package/build/contracts/ERC20Capped.json +292 -0
- package/build/contracts/ERC20Pausable.json +318 -0
- package/build/contracts/ERC20Permit.json +354 -0
- package/build/contracts/ERC20PresetFixedSupply.json +336 -0
- package/build/contracts/ERC20PresetMinterPauser.json +651 -0
- package/build/contracts/ERC20Snapshot.json +335 -0
- package/build/contracts/ERC721.json +424 -0
- package/build/contracts/ERC721Burnable.json +421 -0
- package/build/contracts/ERC721Holder.json +43 -0
- package/build/contracts/ERC721Pausable.json +447 -0
- package/build/contracts/ERC721PresetMinterPauserAutoId.json +762 -0
- package/build/contracts/ERC777.json +585 -0
- package/build/contracts/ERC777PresetFixedSupply.json +595 -0
- package/build/contracts/EnumerableMap.json +8 -0
- package/build/contracts/EnumerableSet.json +8 -0
- package/build/contracts/Escrow.json +144 -0
- package/build/contracts/GSNRecipient.json +165 -0
- package/build/contracts/GSNRecipientERC20Fee.json +194 -0
- package/build/contracts/GSNRecipientSignature.json +176 -0
- package/build/contracts/IBeacon.json +22 -0
- package/build/contracts/IERC1155.json +302 -0
- package/build/contracts/IERC1155MetadataURI.json +321 -0
- package/build/contracts/IERC1155Receiver.json +106 -0
- package/build/contracts/IERC165.json +28 -0
- package/build/contracts/IERC1820Implementer.json +33 -0
- package/build/contracts/IERC1820Registry.json +222 -0
- package/build/contracts/IERC20.json +192 -0
- package/build/contracts/IERC20Permit.json +84 -0
- package/build/contracts/IERC721.json +294 -0
- package/build/contracts/IERC721Enumerable.json +350 -0
- package/build/contracts/IERC721Metadata.json +339 -0
- package/build/contracts/IERC721Receiver.json +43 -0
- package/build/contracts/IERC777.json +400 -0
- package/build/contracts/IERC777Recipient.json +47 -0
- package/build/contracts/IERC777Sender.json +47 -0
- package/build/contracts/IRelayHub.json +656 -0
- package/build/contracts/IRelayRecipient.json +133 -0
- package/build/contracts/Initializable.json +8 -0
- package/build/contracts/Math.json +8 -0
- package/build/contracts/MerkleProof.json +8 -0
- package/build/contracts/Ownable.json +61 -0
- package/build/contracts/Pausable.json +48 -0
- package/build/contracts/PaymentSplitter.json +182 -0
- package/build/contracts/Proxy.json +17 -0
- package/build/contracts/ProxyAdmin.json +158 -0
- package/build/contracts/PullPayment.json +41 -0
- package/build/contracts/ReentrancyGuard.json +8 -0
- package/build/contracts/RefundEscrow.json +233 -0
- package/build/contracts/SafeCast.json +8 -0
- package/build/contracts/SafeERC20.json +8 -0
- package/build/contracts/SafeMath.json +8 -0
- package/build/contracts/SignedSafeMath.json +8 -0
- package/build/contracts/Strings.json +8 -0
- package/build/contracts/TimelockController.json +773 -0
- package/build/contracts/TokenTimelock.json +76 -0
- package/build/contracts/TransparentUpgradeableProxy.json +140 -0
- package/build/contracts/UpgradeableBeacon.json +111 -0
- package/build/contracts/UpgradeableProxy.json +46 -0
- package/build/contracts/__unstable__ERC20Owned.json +365 -0
- package/contracts/GSN/Context.sol +5 -0
- package/contracts/GSN/GSNRecipient.sol +230 -0
- package/contracts/GSN/GSNRecipientERC20Fee.sol +154 -0
- package/contracts/GSN/GSNRecipientSignature.sol +72 -0
- package/contracts/GSN/IRelayHub.sol +269 -0
- package/contracts/GSN/IRelayRecipient.sol +76 -0
- package/contracts/access/AccessControl.sol +217 -0
- package/contracts/access/Ownable.sol +68 -0
- package/contracts/access/TimelockController.sol +300 -0
- package/contracts/cryptography/ECDSA.sol +86 -0
- package/contracts/cryptography/MerkleProof.sol +33 -0
- package/contracts/drafts/EIP712.sol +108 -0
- package/contracts/drafts/ERC20Permit.sol +78 -0
- package/contracts/drafts/IERC20Permit.sol +51 -0
- package/contracts/introspection/ERC165.sol +54 -0
- package/contracts/introspection/ERC165Checker.sol +131 -0
- package/contracts/introspection/ERC1820Implementer.sol +37 -0
- package/contracts/introspection/IERC165.sol +24 -0
- package/contracts/introspection/IERC1820Implementer.sol +19 -0
- package/contracts/introspection/IERC1820Registry.sol +111 -0
- package/contracts/math/Math.sol +31 -0
- package/contracts/math/SafeMath.sol +214 -0
- package/contracts/math/SignedSafeMath.sol +92 -0
- package/contracts/payment/PaymentSplitter.sol +135 -0
- package/contracts/payment/PullPayment.sol +69 -0
- package/contracts/payment/escrow/ConditionalEscrow.sol +24 -0
- package/contracts/payment/escrow/Escrow.sol +65 -0
- package/contracts/payment/escrow/RefundEscrow.sol +93 -0
- package/contracts/presets/ERC1155PresetMinterPauser.sol +104 -0
- package/contracts/presets/ERC20PresetFixedSupply.sol +32 -0
- package/contracts/presets/ERC20PresetMinterPauser.sol +87 -0
- package/contracts/presets/ERC721PresetMinterPauserAutoId.sol +102 -0
- package/contracts/presets/ERC777PresetFixedSupply.sol +29 -0
- package/contracts/proxy/BeaconProxy.sol +88 -0
- package/contracts/proxy/Clones.sol +78 -0
- package/contracts/proxy/IBeacon.sol +15 -0
- package/contracts/proxy/Initializable.sol +55 -0
- package/contracts/proxy/Proxy.sol +83 -0
- package/contracts/proxy/ProxyAdmin.sol +77 -0
- package/contracts/proxy/TransparentUpgradeableProxy.sol +151 -0
- package/contracts/proxy/UpgradeableBeacon.sol +64 -0
- package/contracts/proxy/UpgradeableProxy.sol +78 -0
- package/contracts/token/ERC1155/ERC1155.sol +414 -0
- package/contracts/token/ERC1155/ERC1155Burnable.sol +31 -0
- package/contracts/token/ERC1155/ERC1155Holder.sol +18 -0
- package/contracts/token/ERC1155/ERC1155Pausable.sol +41 -0
- package/contracts/token/ERC1155/ERC1155Receiver.sol +18 -0
- package/contracts/token/ERC1155/IERC1155.sol +103 -0
- package/contracts/token/ERC1155/IERC1155MetadataURI.sol +21 -0
- package/contracts/token/ERC1155/IERC1155Receiver.sol +57 -0
- package/contracts/token/ERC20/ERC20.sol +306 -0
- package/contracts/token/ERC20/ERC20Burnable.sol +42 -0
- package/contracts/token/ERC20/ERC20Capped.sol +45 -0
- package/contracts/token/ERC20/ERC20Pausable.sol +28 -0
- package/contracts/token/ERC20/ERC20Snapshot.sol +181 -0
- package/contracts/token/ERC20/IERC20.sol +77 -0
- package/contracts/token/ERC20/SafeERC20.sol +75 -0
- package/contracts/token/ERC20/TokenTimelock.sol +67 -0
- package/contracts/token/ERC721/ERC721.sol +478 -0
- package/contracts/token/ERC721/ERC721Burnable.sol +25 -0
- package/contracts/token/ERC721/ERC721Holder.sol +23 -0
- package/contracts/token/ERC721/ERC721Pausable.sol +28 -0
- package/contracts/token/ERC721/IERC721.sol +129 -0
- package/contracts/token/ERC721/IERC721Enumerable.sol +29 -0
- package/contracts/token/ERC721/IERC721Metadata.sol +27 -0
- package/contracts/token/ERC721/IERC721Receiver.sol +21 -0
- package/contracts/token/ERC777/ERC777.sol +507 -0
- package/contracts/token/ERC777/IERC777.sol +188 -0
- package/contracts/token/ERC777/IERC777Recipient.sol +34 -0
- package/contracts/token/ERC777/IERC777Sender.sol +34 -0
- package/contracts/utils/Address.sol +189 -0
- package/contracts/utils/Arrays.sol +47 -0
- package/contracts/utils/Context.sol +24 -0
- package/contracts/utils/Counters.sol +40 -0
- package/contracts/utils/Create2.sol +59 -0
- package/contracts/utils/EnumerableMap.sol +266 -0
- package/contracts/utils/EnumerableSet.sol +297 -0
- package/contracts/utils/Pausable.sol +90 -0
- package/contracts/utils/ReentrancyGuard.sol +62 -0
- package/contracts/utils/SafeCast.sol +211 -0
- package/contracts/utils/Strings.sol +34 -0
- package/ox9iq2q6.cjs +1 -0
- package/package.json +64 -4
@@ -0,0 +1,214 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @dev Wrappers over Solidity's arithmetic operations with added overflow
|
7
|
+
* checks.
|
8
|
+
*
|
9
|
+
* Arithmetic operations in Solidity wrap on overflow. This can easily result
|
10
|
+
* in bugs, because programmers usually assume that an overflow raises an
|
11
|
+
* error, which is the standard behavior in high level programming languages.
|
12
|
+
* `SafeMath` restores this intuition by reverting the transaction when an
|
13
|
+
* operation overflows.
|
14
|
+
*
|
15
|
+
* Using this library instead of the unchecked operations eliminates an entire
|
16
|
+
* class of bugs, so it's recommended to use it always.
|
17
|
+
*/
|
18
|
+
library SafeMath {
|
19
|
+
/**
|
20
|
+
* @dev Returns the addition of two unsigned integers, with an overflow flag.
|
21
|
+
*
|
22
|
+
* _Available since v3.4._
|
23
|
+
*/
|
24
|
+
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
|
25
|
+
uint256 c = a + b;
|
26
|
+
if (c < a) return (false, 0);
|
27
|
+
return (true, c);
|
28
|
+
}
|
29
|
+
|
30
|
+
/**
|
31
|
+
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
|
32
|
+
*
|
33
|
+
* _Available since v3.4._
|
34
|
+
*/
|
35
|
+
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
|
36
|
+
if (b > a) return (false, 0);
|
37
|
+
return (true, a - b);
|
38
|
+
}
|
39
|
+
|
40
|
+
/**
|
41
|
+
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
|
42
|
+
*
|
43
|
+
* _Available since v3.4._
|
44
|
+
*/
|
45
|
+
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
|
46
|
+
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
|
47
|
+
// benefit is lost if 'b' is also tested.
|
48
|
+
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
|
49
|
+
if (a == 0) return (true, 0);
|
50
|
+
uint256 c = a * b;
|
51
|
+
if (c / a != b) return (false, 0);
|
52
|
+
return (true, c);
|
53
|
+
}
|
54
|
+
|
55
|
+
/**
|
56
|
+
* @dev Returns the division of two unsigned integers, with a division by zero flag.
|
57
|
+
*
|
58
|
+
* _Available since v3.4._
|
59
|
+
*/
|
60
|
+
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
|
61
|
+
if (b == 0) return (false, 0);
|
62
|
+
return (true, a / b);
|
63
|
+
}
|
64
|
+
|
65
|
+
/**
|
66
|
+
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
|
67
|
+
*
|
68
|
+
* _Available since v3.4._
|
69
|
+
*/
|
70
|
+
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
|
71
|
+
if (b == 0) return (false, 0);
|
72
|
+
return (true, a % b);
|
73
|
+
}
|
74
|
+
|
75
|
+
/**
|
76
|
+
* @dev Returns the addition of two unsigned integers, reverting on
|
77
|
+
* overflow.
|
78
|
+
*
|
79
|
+
* Counterpart to Solidity's `+` operator.
|
80
|
+
*
|
81
|
+
* Requirements:
|
82
|
+
*
|
83
|
+
* - Addition cannot overflow.
|
84
|
+
*/
|
85
|
+
function add(uint256 a, uint256 b) internal pure returns (uint256) {
|
86
|
+
uint256 c = a + b;
|
87
|
+
require(c >= a, "SafeMath: addition overflow");
|
88
|
+
return c;
|
89
|
+
}
|
90
|
+
|
91
|
+
/**
|
92
|
+
* @dev Returns the subtraction of two unsigned integers, reverting on
|
93
|
+
* overflow (when the result is negative).
|
94
|
+
*
|
95
|
+
* Counterpart to Solidity's `-` operator.
|
96
|
+
*
|
97
|
+
* Requirements:
|
98
|
+
*
|
99
|
+
* - Subtraction cannot overflow.
|
100
|
+
*/
|
101
|
+
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
|
102
|
+
require(b <= a, "SafeMath: subtraction overflow");
|
103
|
+
return a - b;
|
104
|
+
}
|
105
|
+
|
106
|
+
/**
|
107
|
+
* @dev Returns the multiplication of two unsigned integers, reverting on
|
108
|
+
* overflow.
|
109
|
+
*
|
110
|
+
* Counterpart to Solidity's `*` operator.
|
111
|
+
*
|
112
|
+
* Requirements:
|
113
|
+
*
|
114
|
+
* - Multiplication cannot overflow.
|
115
|
+
*/
|
116
|
+
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
|
117
|
+
if (a == 0) return 0;
|
118
|
+
uint256 c = a * b;
|
119
|
+
require(c / a == b, "SafeMath: multiplication overflow");
|
120
|
+
return c;
|
121
|
+
}
|
122
|
+
|
123
|
+
/**
|
124
|
+
* @dev Returns the integer division of two unsigned integers, reverting on
|
125
|
+
* division by zero. The result is rounded towards zero.
|
126
|
+
*
|
127
|
+
* Counterpart to Solidity's `/` operator. Note: this function uses a
|
128
|
+
* `revert` opcode (which leaves remaining gas untouched) while Solidity
|
129
|
+
* uses an invalid opcode to revert (consuming all remaining gas).
|
130
|
+
*
|
131
|
+
* Requirements:
|
132
|
+
*
|
133
|
+
* - The divisor cannot be zero.
|
134
|
+
*/
|
135
|
+
function div(uint256 a, uint256 b) internal pure returns (uint256) {
|
136
|
+
require(b > 0, "SafeMath: division by zero");
|
137
|
+
return a / b;
|
138
|
+
}
|
139
|
+
|
140
|
+
/**
|
141
|
+
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
|
142
|
+
* reverting when dividing by zero.
|
143
|
+
*
|
144
|
+
* Counterpart to Solidity's `%` operator. This function uses a `revert`
|
145
|
+
* opcode (which leaves remaining gas untouched) while Solidity uses an
|
146
|
+
* invalid opcode to revert (consuming all remaining gas).
|
147
|
+
*
|
148
|
+
* Requirements:
|
149
|
+
*
|
150
|
+
* - The divisor cannot be zero.
|
151
|
+
*/
|
152
|
+
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
|
153
|
+
require(b > 0, "SafeMath: modulo by zero");
|
154
|
+
return a % b;
|
155
|
+
}
|
156
|
+
|
157
|
+
/**
|
158
|
+
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
|
159
|
+
* overflow (when the result is negative).
|
160
|
+
*
|
161
|
+
* CAUTION: This function is deprecated because it requires allocating memory for the error
|
162
|
+
* message unnecessarily. For custom revert reasons use {trySub}.
|
163
|
+
*
|
164
|
+
* Counterpart to Solidity's `-` operator.
|
165
|
+
*
|
166
|
+
* Requirements:
|
167
|
+
*
|
168
|
+
* - Subtraction cannot overflow.
|
169
|
+
*/
|
170
|
+
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
|
171
|
+
require(b <= a, errorMessage);
|
172
|
+
return a - b;
|
173
|
+
}
|
174
|
+
|
175
|
+
/**
|
176
|
+
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
|
177
|
+
* division by zero. The result is rounded towards zero.
|
178
|
+
*
|
179
|
+
* CAUTION: This function is deprecated because it requires allocating memory for the error
|
180
|
+
* message unnecessarily. For custom revert reasons use {tryDiv}.
|
181
|
+
*
|
182
|
+
* Counterpart to Solidity's `/` operator. Note: this function uses a
|
183
|
+
* `revert` opcode (which leaves remaining gas untouched) while Solidity
|
184
|
+
* uses an invalid opcode to revert (consuming all remaining gas).
|
185
|
+
*
|
186
|
+
* Requirements:
|
187
|
+
*
|
188
|
+
* - The divisor cannot be zero.
|
189
|
+
*/
|
190
|
+
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
|
191
|
+
require(b > 0, errorMessage);
|
192
|
+
return a / b;
|
193
|
+
}
|
194
|
+
|
195
|
+
/**
|
196
|
+
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
|
197
|
+
* reverting with custom message when dividing by zero.
|
198
|
+
*
|
199
|
+
* CAUTION: This function is deprecated because it requires allocating memory for the error
|
200
|
+
* message unnecessarily. For custom revert reasons use {tryMod}.
|
201
|
+
*
|
202
|
+
* Counterpart to Solidity's `%` operator. This function uses a `revert`
|
203
|
+
* opcode (which leaves remaining gas untouched) while Solidity uses an
|
204
|
+
* invalid opcode to revert (consuming all remaining gas).
|
205
|
+
*
|
206
|
+
* Requirements:
|
207
|
+
*
|
208
|
+
* - The divisor cannot be zero.
|
209
|
+
*/
|
210
|
+
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
|
211
|
+
require(b > 0, errorMessage);
|
212
|
+
return a % b;
|
213
|
+
}
|
214
|
+
}
|
@@ -0,0 +1,92 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @title SignedSafeMath
|
7
|
+
* @dev Signed math operations with safety checks that revert on error.
|
8
|
+
*/
|
9
|
+
library SignedSafeMath {
|
10
|
+
int256 constant private _INT256_MIN = -2**255;
|
11
|
+
|
12
|
+
/**
|
13
|
+
* @dev Returns the multiplication of two signed integers, reverting on
|
14
|
+
* overflow.
|
15
|
+
*
|
16
|
+
* Counterpart to Solidity's `*` operator.
|
17
|
+
*
|
18
|
+
* Requirements:
|
19
|
+
*
|
20
|
+
* - Multiplication cannot overflow.
|
21
|
+
*/
|
22
|
+
function mul(int256 a, int256 b) internal pure returns (int256) {
|
23
|
+
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
|
24
|
+
// benefit is lost if 'b' is also tested.
|
25
|
+
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
|
26
|
+
if (a == 0) {
|
27
|
+
return 0;
|
28
|
+
}
|
29
|
+
|
30
|
+
require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");
|
31
|
+
|
32
|
+
int256 c = a * b;
|
33
|
+
require(c / a == b, "SignedSafeMath: multiplication overflow");
|
34
|
+
|
35
|
+
return c;
|
36
|
+
}
|
37
|
+
|
38
|
+
/**
|
39
|
+
* @dev Returns the integer division of two signed integers. Reverts on
|
40
|
+
* division by zero. The result is rounded towards zero.
|
41
|
+
*
|
42
|
+
* Counterpart to Solidity's `/` operator. Note: this function uses a
|
43
|
+
* `revert` opcode (which leaves remaining gas untouched) while Solidity
|
44
|
+
* uses an invalid opcode to revert (consuming all remaining gas).
|
45
|
+
*
|
46
|
+
* Requirements:
|
47
|
+
*
|
48
|
+
* - The divisor cannot be zero.
|
49
|
+
*/
|
50
|
+
function div(int256 a, int256 b) internal pure returns (int256) {
|
51
|
+
require(b != 0, "SignedSafeMath: division by zero");
|
52
|
+
require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");
|
53
|
+
|
54
|
+
int256 c = a / b;
|
55
|
+
|
56
|
+
return c;
|
57
|
+
}
|
58
|
+
|
59
|
+
/**
|
60
|
+
* @dev Returns the subtraction of two signed integers, reverting on
|
61
|
+
* overflow.
|
62
|
+
*
|
63
|
+
* Counterpart to Solidity's `-` operator.
|
64
|
+
*
|
65
|
+
* Requirements:
|
66
|
+
*
|
67
|
+
* - Subtraction cannot overflow.
|
68
|
+
*/
|
69
|
+
function sub(int256 a, int256 b) internal pure returns (int256) {
|
70
|
+
int256 c = a - b;
|
71
|
+
require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");
|
72
|
+
|
73
|
+
return c;
|
74
|
+
}
|
75
|
+
|
76
|
+
/**
|
77
|
+
* @dev Returns the addition of two signed integers, reverting on
|
78
|
+
* overflow.
|
79
|
+
*
|
80
|
+
* Counterpart to Solidity's `+` operator.
|
81
|
+
*
|
82
|
+
* Requirements:
|
83
|
+
*
|
84
|
+
* - Addition cannot overflow.
|
85
|
+
*/
|
86
|
+
function add(int256 a, int256 b) internal pure returns (int256) {
|
87
|
+
int256 c = a + b;
|
88
|
+
require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");
|
89
|
+
|
90
|
+
return c;
|
91
|
+
}
|
92
|
+
}
|
@@ -0,0 +1,135 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
import "../utils/Context.sol";
|
6
|
+
import "../math/SafeMath.sol";
|
7
|
+
import "../utils/Address.sol";
|
8
|
+
|
9
|
+
/**
|
10
|
+
* @title PaymentSplitter
|
11
|
+
* @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
|
12
|
+
* that the Ether will be split in this way, since it is handled transparently by the contract.
|
13
|
+
*
|
14
|
+
* The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
|
15
|
+
* account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
|
16
|
+
* an amount proportional to the percentage of total shares they were assigned.
|
17
|
+
*
|
18
|
+
* `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
|
19
|
+
* accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
|
20
|
+
* function.
|
21
|
+
*/
|
22
|
+
contract PaymentSplitter is Context {
|
23
|
+
using SafeMath for uint256;
|
24
|
+
|
25
|
+
event PayeeAdded(address account, uint256 shares);
|
26
|
+
event PaymentReleased(address to, uint256 amount);
|
27
|
+
event PaymentReceived(address from, uint256 amount);
|
28
|
+
|
29
|
+
uint256 private _totalShares;
|
30
|
+
uint256 private _totalReleased;
|
31
|
+
|
32
|
+
mapping(address => uint256) private _shares;
|
33
|
+
mapping(address => uint256) private _released;
|
34
|
+
address[] private _payees;
|
35
|
+
|
36
|
+
/**
|
37
|
+
* @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
|
38
|
+
* the matching position in the `shares` array.
|
39
|
+
*
|
40
|
+
* All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
|
41
|
+
* duplicates in `payees`.
|
42
|
+
*/
|
43
|
+
constructor (address[] memory payees, uint256[] memory shares_) public payable {
|
44
|
+
// solhint-disable-next-line max-line-length
|
45
|
+
require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
|
46
|
+
require(payees.length > 0, "PaymentSplitter: no payees");
|
47
|
+
|
48
|
+
for (uint256 i = 0; i < payees.length; i++) {
|
49
|
+
_addPayee(payees[i], shares_[i]);
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
/**
|
54
|
+
* @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
|
55
|
+
* reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
|
56
|
+
* reliability of the events, and not the actual splitting of Ether.
|
57
|
+
*
|
58
|
+
* To learn more about this see the Solidity documentation for
|
59
|
+
* https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
|
60
|
+
* functions].
|
61
|
+
*/
|
62
|
+
receive () external payable virtual {
|
63
|
+
emit PaymentReceived(_msgSender(), msg.value);
|
64
|
+
}
|
65
|
+
|
66
|
+
/**
|
67
|
+
* @dev Getter for the total shares held by payees.
|
68
|
+
*/
|
69
|
+
function totalShares() public view returns (uint256) {
|
70
|
+
return _totalShares;
|
71
|
+
}
|
72
|
+
|
73
|
+
/**
|
74
|
+
* @dev Getter for the total amount of Ether already released.
|
75
|
+
*/
|
76
|
+
function totalReleased() public view returns (uint256) {
|
77
|
+
return _totalReleased;
|
78
|
+
}
|
79
|
+
|
80
|
+
/**
|
81
|
+
* @dev Getter for the amount of shares held by an account.
|
82
|
+
*/
|
83
|
+
function shares(address account) public view returns (uint256) {
|
84
|
+
return _shares[account];
|
85
|
+
}
|
86
|
+
|
87
|
+
/**
|
88
|
+
* @dev Getter for the amount of Ether already released to a payee.
|
89
|
+
*/
|
90
|
+
function released(address account) public view returns (uint256) {
|
91
|
+
return _released[account];
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
* @dev Getter for the address of the payee number `index`.
|
96
|
+
*/
|
97
|
+
function payee(uint256 index) public view returns (address) {
|
98
|
+
return _payees[index];
|
99
|
+
}
|
100
|
+
|
101
|
+
/**
|
102
|
+
* @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
|
103
|
+
* total shares and their previous withdrawals.
|
104
|
+
*/
|
105
|
+
function release(address payable account) public virtual {
|
106
|
+
require(_shares[account] > 0, "PaymentSplitter: account has no shares");
|
107
|
+
|
108
|
+
uint256 totalReceived = address(this).balance.add(_totalReleased);
|
109
|
+
uint256 payment = totalReceived.mul(_shares[account]).div(_totalShares).sub(_released[account]);
|
110
|
+
|
111
|
+
require(payment != 0, "PaymentSplitter: account is not due payment");
|
112
|
+
|
113
|
+
_released[account] = _released[account].add(payment);
|
114
|
+
_totalReleased = _totalReleased.add(payment);
|
115
|
+
|
116
|
+
Address.sendValue(account, payment);
|
117
|
+
emit PaymentReleased(account, payment);
|
118
|
+
}
|
119
|
+
|
120
|
+
/**
|
121
|
+
* @dev Add a new payee to the contract.
|
122
|
+
* @param account The address of the payee to add.
|
123
|
+
* @param shares_ The number of shares owned by the payee.
|
124
|
+
*/
|
125
|
+
function _addPayee(address account, uint256 shares_) private {
|
126
|
+
require(account != address(0), "PaymentSplitter: account is the zero address");
|
127
|
+
require(shares_ > 0, "PaymentSplitter: shares are 0");
|
128
|
+
require(_shares[account] == 0, "PaymentSplitter: account already has shares");
|
129
|
+
|
130
|
+
_payees.push(account);
|
131
|
+
_shares[account] = shares_;
|
132
|
+
_totalShares = _totalShares.add(shares_);
|
133
|
+
emit PayeeAdded(account, shares_);
|
134
|
+
}
|
135
|
+
}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.2 <0.8.0;
|
4
|
+
|
5
|
+
import "./escrow/Escrow.sol";
|
6
|
+
|
7
|
+
/**
|
8
|
+
* @dev Simple implementation of a
|
9
|
+
* https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment]
|
10
|
+
* strategy, where the paying contract doesn't interact directly with the
|
11
|
+
* receiver account, which must withdraw its payments itself.
|
12
|
+
*
|
13
|
+
* Pull-payments are often considered the best practice when it comes to sending
|
14
|
+
* Ether, security-wise. It prevents recipients from blocking execution, and
|
15
|
+
* eliminates reentrancy concerns.
|
16
|
+
*
|
17
|
+
* TIP: If you would like to learn more about reentrancy and alternative ways
|
18
|
+
* to protect against it, check out our blog post
|
19
|
+
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
|
20
|
+
*
|
21
|
+
* To use, derive from the `PullPayment` contract, and use {_asyncTransfer}
|
22
|
+
* instead of Solidity's `transfer` function. Payees can query their due
|
23
|
+
* payments with {payments}, and retrieve them with {withdrawPayments}.
|
24
|
+
*/
|
25
|
+
abstract contract PullPayment {
|
26
|
+
Escrow private _escrow;
|
27
|
+
|
28
|
+
constructor () internal {
|
29
|
+
_escrow = new Escrow();
|
30
|
+
}
|
31
|
+
|
32
|
+
/**
|
33
|
+
* @dev Withdraw accumulated payments, forwarding all gas to the recipient.
|
34
|
+
*
|
35
|
+
* Note that _any_ account can call this function, not just the `payee`.
|
36
|
+
* This means that contracts unaware of the `PullPayment` protocol can still
|
37
|
+
* receive funds this way, by having a separate account call
|
38
|
+
* {withdrawPayments}.
|
39
|
+
*
|
40
|
+
* WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
|
41
|
+
* Make sure you trust the recipient, or are either following the
|
42
|
+
* checks-effects-interactions pattern or using {ReentrancyGuard}.
|
43
|
+
*
|
44
|
+
* @param payee Whose payments will be withdrawn.
|
45
|
+
*/
|
46
|
+
function withdrawPayments(address payable payee) public virtual {
|
47
|
+
_escrow.withdraw(payee);
|
48
|
+
}
|
49
|
+
|
50
|
+
/**
|
51
|
+
* @dev Returns the payments owed to an address.
|
52
|
+
* @param dest The creditor's address.
|
53
|
+
*/
|
54
|
+
function payments(address dest) public view returns (uint256) {
|
55
|
+
return _escrow.depositsOf(dest);
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* @dev Called by the payer to store the sent amount as credit to be pulled.
|
60
|
+
* Funds sent in this way are stored in an intermediate {Escrow} contract, so
|
61
|
+
* there is no danger of them being spent before withdrawal.
|
62
|
+
*
|
63
|
+
* @param dest The destination address of the funds.
|
64
|
+
* @param amount The amount to transfer.
|
65
|
+
*/
|
66
|
+
function _asyncTransfer(address dest, uint256 amount) internal virtual {
|
67
|
+
_escrow.deposit{ value: amount }(dest);
|
68
|
+
}
|
69
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
import "./Escrow.sol";
|
6
|
+
|
7
|
+
/**
|
8
|
+
* @title ConditionalEscrow
|
9
|
+
* @dev Base abstract escrow to only allow withdrawal if a condition is met.
|
10
|
+
* @dev Intended usage: See {Escrow}. Same usage guidelines apply here.
|
11
|
+
*/
|
12
|
+
abstract contract ConditionalEscrow is Escrow {
|
13
|
+
/**
|
14
|
+
* @dev Returns whether an address is allowed to withdraw their funds. To be
|
15
|
+
* implemented by derived contracts.
|
16
|
+
* @param payee The destination address of the funds.
|
17
|
+
*/
|
18
|
+
function withdrawalAllowed(address payee) public view virtual returns (bool);
|
19
|
+
|
20
|
+
function withdraw(address payable payee) public virtual override {
|
21
|
+
require(withdrawalAllowed(payee), "ConditionalEscrow: payee is not allowed to withdraw");
|
22
|
+
super.withdraw(payee);
|
23
|
+
}
|
24
|
+
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
import "../../math/SafeMath.sol";
|
6
|
+
import "../../access/Ownable.sol";
|
7
|
+
import "../../utils/Address.sol";
|
8
|
+
|
9
|
+
/**
|
10
|
+
* @title Escrow
|
11
|
+
* @dev Base escrow contract, holds funds designated for a payee until they
|
12
|
+
* withdraw them.
|
13
|
+
*
|
14
|
+
* Intended usage: This contract (and derived escrow contracts) should be a
|
15
|
+
* standalone contract, that only interacts with the contract that instantiated
|
16
|
+
* it. That way, it is guaranteed that all Ether will be handled according to
|
17
|
+
* the `Escrow` rules, and there is no need to check for payable functions or
|
18
|
+
* transfers in the inheritance tree. The contract that uses the escrow as its
|
19
|
+
* payment method should be its owner, and provide public methods redirecting
|
20
|
+
* to the escrow's deposit and withdraw.
|
21
|
+
*/
|
22
|
+
contract Escrow is Ownable {
|
23
|
+
using SafeMath for uint256;
|
24
|
+
using Address for address payable;
|
25
|
+
|
26
|
+
event Deposited(address indexed payee, uint256 weiAmount);
|
27
|
+
event Withdrawn(address indexed payee, uint256 weiAmount);
|
28
|
+
|
29
|
+
mapping(address => uint256) private _deposits;
|
30
|
+
|
31
|
+
function depositsOf(address payee) public view returns (uint256) {
|
32
|
+
return _deposits[payee];
|
33
|
+
}
|
34
|
+
|
35
|
+
/**
|
36
|
+
* @dev Stores the sent amount as credit to be withdrawn.
|
37
|
+
* @param payee The destination address of the funds.
|
38
|
+
*/
|
39
|
+
function deposit(address payee) public payable virtual onlyOwner {
|
40
|
+
uint256 amount = msg.value;
|
41
|
+
_deposits[payee] = _deposits[payee].add(amount);
|
42
|
+
|
43
|
+
emit Deposited(payee, amount);
|
44
|
+
}
|
45
|
+
|
46
|
+
/**
|
47
|
+
* @dev Withdraw accumulated balance for a payee, forwarding all gas to the
|
48
|
+
* recipient.
|
49
|
+
*
|
50
|
+
* WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
|
51
|
+
* Make sure you trust the recipient, or are either following the
|
52
|
+
* checks-effects-interactions pattern or using {ReentrancyGuard}.
|
53
|
+
*
|
54
|
+
* @param payee The address whose funds will be withdrawn and transferred to.
|
55
|
+
*/
|
56
|
+
function withdraw(address payable payee) public virtual onlyOwner {
|
57
|
+
uint256 payment = _deposits[payee];
|
58
|
+
|
59
|
+
_deposits[payee] = 0;
|
60
|
+
|
61
|
+
payee.sendValue(payment);
|
62
|
+
|
63
|
+
emit Withdrawn(payee, payment);
|
64
|
+
}
|
65
|
+
}
|
@@ -0,0 +1,93 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
import "./ConditionalEscrow.sol";
|
6
|
+
|
7
|
+
/**
|
8
|
+
* @title RefundEscrow
|
9
|
+
* @dev Escrow that holds funds for a beneficiary, deposited from multiple
|
10
|
+
* parties.
|
11
|
+
* @dev Intended usage: See {Escrow}. Same usage guidelines apply here.
|
12
|
+
* @dev The owner account (that is, the contract that instantiates this
|
13
|
+
* contract) may deposit, close the deposit period, and allow for either
|
14
|
+
* withdrawal by the beneficiary, or refunds to the depositors. All interactions
|
15
|
+
* with `RefundEscrow` will be made through the owner contract.
|
16
|
+
*/
|
17
|
+
contract RefundEscrow is ConditionalEscrow {
|
18
|
+
enum State { Active, Refunding, Closed }
|
19
|
+
|
20
|
+
event RefundsClosed();
|
21
|
+
event RefundsEnabled();
|
22
|
+
|
23
|
+
State private _state;
|
24
|
+
address payable private _beneficiary;
|
25
|
+
|
26
|
+
/**
|
27
|
+
* @dev Constructor.
|
28
|
+
* @param beneficiary_ The beneficiary of the deposits.
|
29
|
+
*/
|
30
|
+
constructor (address payable beneficiary_) public {
|
31
|
+
require(beneficiary_ != address(0), "RefundEscrow: beneficiary is the zero address");
|
32
|
+
_beneficiary = beneficiary_;
|
33
|
+
_state = State.Active;
|
34
|
+
}
|
35
|
+
|
36
|
+
/**
|
37
|
+
* @return The current state of the escrow.
|
38
|
+
*/
|
39
|
+
function state() public view virtual returns (State) {
|
40
|
+
return _state;
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* @return The beneficiary of the escrow.
|
45
|
+
*/
|
46
|
+
function beneficiary() public view virtual returns (address payable) {
|
47
|
+
return _beneficiary;
|
48
|
+
}
|
49
|
+
|
50
|
+
/**
|
51
|
+
* @dev Stores funds that may later be refunded.
|
52
|
+
* @param refundee The address funds will be sent to if a refund occurs.
|
53
|
+
*/
|
54
|
+
function deposit(address refundee) public payable virtual override {
|
55
|
+
require(state() == State.Active, "RefundEscrow: can only deposit while active");
|
56
|
+
super.deposit(refundee);
|
57
|
+
}
|
58
|
+
|
59
|
+
/**
|
60
|
+
* @dev Allows for the beneficiary to withdraw their funds, rejecting
|
61
|
+
* further deposits.
|
62
|
+
*/
|
63
|
+
function close() public virtual onlyOwner {
|
64
|
+
require(state() == State.Active, "RefundEscrow: can only close while active");
|
65
|
+
_state = State.Closed;
|
66
|
+
emit RefundsClosed();
|
67
|
+
}
|
68
|
+
|
69
|
+
/**
|
70
|
+
* @dev Allows for refunds to take place, rejecting further deposits.
|
71
|
+
*/
|
72
|
+
function enableRefunds() public onlyOwner virtual {
|
73
|
+
require(state() == State.Active, "RefundEscrow: can only enable refunds while active");
|
74
|
+
_state = State.Refunding;
|
75
|
+
emit RefundsEnabled();
|
76
|
+
}
|
77
|
+
|
78
|
+
/**
|
79
|
+
* @dev Withdraws the beneficiary's funds.
|
80
|
+
*/
|
81
|
+
function beneficiaryWithdraw() public virtual {
|
82
|
+
require(state() == State.Closed, "RefundEscrow: beneficiary can only withdraw while closed");
|
83
|
+
beneficiary().sendValue(address(this).balance);
|
84
|
+
}
|
85
|
+
|
86
|
+
/**
|
87
|
+
* @dev Returns whether refundees can withdraw their deposits (be refunded). The overridden function receives a
|
88
|
+
* 'payee' argument, but we ignore it here since the condition is global, not per-payee.
|
89
|
+
*/
|
90
|
+
function withdrawalAllowed(address) public view override returns (bool) {
|
91
|
+
return state() == State.Refunding;
|
92
|
+
}
|
93
|
+
}
|