Compare commits

...

117 Commits

Author SHA1 Message Date
5294f3b9b7 3.0.2 2020-06-08 13:09:47 -03:00
b191e67552 Add changelog entry 2020-06-08 13:07:02 -03:00
fac773ac99 Add SPX license identifier (#2235)
(cherry picked from commit 56de324afe)
2020-06-08 13:05:11 -03:00
087d314daf 3.0.1 2020-04-27 15:30:27 -03:00
6e3de4d48a Merge pull request #2213 from nventuro/merge-v2.5.1
Merge v2.5.1 into v3.0.0
2020-04-27 15:25:11 -03:00
dc3f92210b Bump mocha from 7.1.1 to 7.1.2 (#2216)
Bumps [mocha](https://github.com/mochajs/mocha) from 7.1.1 to 7.1.2.
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/v7.1.1...v7.1.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-27 12:00:45 -03:00
1ff8a97d11 add docs badge 2020-04-24 19:46:24 -03:00
dd226e1987 Add latest audit notice 2020-04-24 16:35:24 -03:00
d0f67f99a7 Add changelog entry 2020-04-24 16:08:00 -03:00
e156b617b9 Merge branch 'release-v2.5.0' 2020-04-24 16:04:40 -03:00
837828967a 2.5.1 2020-04-24 15:57:33 -03:00
3843c9beb7 Add changelog entry 2020-04-24 15:34:38 -03:00
c75b016919 Add missing requirements to ERC777 (#2212)
* Restore _approve check for zero sender

* Add non-zero operator check to _send
2020-04-24 15:33:22 -03:00
ad290e7181 Use msg.sender in docs 2020-04-23 12:15:06 -03:00
364da52a49 Add note about default admin role security (#2211)
* Add note about default admin security

* Update contracts/access/AccessControl.sol

Co-Authored-By: Francisco Giordano <frangio.1@gmail.com>

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
2020-04-22 17:17:33 -03:00
e50e496f5b Remove unnecessary linter ignore 2020-04-21 15:04:04 -03:00
c4be4d16e8 ERC721 documentation (#2164)
* Add documentation to the IERC721 contract

* Add documentation to the IERC721Metadata contract

* Add documentation to the IERC721Enumerable contract

* Improves IERC721 documentation

* Improves IERC721Metadata documentation

* Improves IERC721Enumerable documentation

* Fixes documentations issues in IERC721

* Improves ERC721 interfaces documentation
2020-04-21 15:00:48 -03:00
6f40ed3fbf Fix crossreference 2020-04-20 21:27:48 -03:00
57551c8516 Fix asciidoc typos 2020-04-20 21:06:36 -03:00
b7452960be 3.0.0 2020-04-20 20:37:38 -03:00
32f55009af Remove outdated notes to v2.x docs 2020-04-20 20:37:20 -03:00
a4320108d5 Remove prerelease tag from docs 2020-04-20 20:24:24 -03:00
05085aa605 Merge branch 'master' into release-v3.0.0 2020-04-20 20:21:14 -03:00
528c23d679 Remove ethpm.json and update releasing docs (#2205)
* remove ethpm.json

* update releasing document

* fix release documentation to be more realistic
2020-04-20 20:10:30 -03:00
715ec806f0 ERC721 deploy ready fixes (#2192)
* Add baseURI to ERC721MinterPauser constructor

* Add tokenURI to mint

* Remove tokenId and tokenURI from ERC721 deploy ready

* Rename ERC721MinterPauser to ERC721MinterAutoID, remove Pausable mechanisms

* Restore pausing to ERC721

* Rename deploy ready to presets

* Rename ERC721 preset
2020-04-20 20:05:48 -03:00
5bb8d0245b Improve Hooks documentation (#2199)
* Improve Hooks docs

* Improve Utils docs

* Apply suggestions from code review

Co-Authored-By: Francisco Giordano <frangio.1@gmail.com>

* Add enumerable code samples

* Remove import statement from example

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
2020-04-20 16:43:05 -03:00
c986dfb256 [Security] Bump acorn from 6.4.0 to 6.4.1 (#2204)
Bumps [acorn](https://github.com/acornjs/acorn) from 6.4.0 to 6.4.1. **This update includes security fixes.**
- [Release notes](https://github.com/acornjs/acorn/releases)
- [Commits](https://github.com/acornjs/acorn/compare/6.4.0...6.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-20 14:17:12 -03:00
6d5ef3ef5f Bump solhint from 3.0.0-rc.7 to 3.0.0-rc.8 (#2202)
Bumps [solhint](https://github.com/protofire/solhint) from 3.0.0-rc.7 to 3.0.0-rc.8.
- [Release notes](https://github.com/protofire/solhint/releases)
- [Changelog](https://github.com/protofire/solhint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/protofire/solhint/compare/v3.0.0-rc.7...v3.0.0-rc.8)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-20 14:02:33 -03:00
2663c5ee0f Bump @openzeppelin/test-environment from 0.1.3 to 0.1.4 (#2201)
Bumps [@openzeppelin/test-environment](https://github.com/OpenZeppelin/openzeppelin-test-environment) from 0.1.3 to 0.1.4.
- [Release notes](https://github.com/OpenZeppelin/openzeppelin-test-environment/releases)
- [Changelog](https://github.com/OpenZeppelin/openzeppelin-test-environment/blob/master/CHANGELOG.md)
- [Commits](https://github.com/OpenZeppelin/openzeppelin-test-environment/compare/v0.1.3...v0.1.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-20 13:43:00 -03:00
1075898b06 Bump @openzeppelin/cli from 2.8.1 to 2.8.2 (#2200)
Bumps [@openzeppelin/cli](https://github.com/OpenZeppelin/openzeppelin-sdk) from 2.8.1 to 2.8.2.
- [Release notes](https://github.com/OpenZeppelin/openzeppelin-sdk/releases)
- [Commits](https://github.com/OpenZeppelin/openzeppelin-sdk/compare/v2.8.1...v2.8.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-20 12:33:00 -03:00
c7705712ba Remove in-constructor requirements (#2195)
* Remove isConstructor requirement from _setupRole

* Remove isConstructor requirement from _setupDecimals

* Update contracts/access/AccessControl.sol

Co-Authored-By: Francisco Giordano <frangio.1@gmail.com>

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
2020-04-17 17:00:30 -03:00
13e113df81 Improve usage of toString 2020-04-17 11:37:58 -03:00
cca71ab709 Fix deprecation warnings (#2115)
* Fix deprecation warnings

* Workaround linter bug
2020-04-16 12:13:49 -03:00
8b10cb38d8 Rename Strings.fromUint256 to Strings.toString (#2188)
* rename Strings.fromUint256 to Strings.toString

* add changelog entry

* fix conflict with js toString method
2020-04-15 18:04:00 -03:00
3e139baa50 Add missing hook to ERC777, fix relevant documentation (#2191)
* Improve ERC20/721 Pausable docs

* Add ERC20Pausable mint and burn tests

* Add ERC721Pausable mint and burn tests

* Add _beforeTransfer hook in ERC777 to mint and burn
2020-04-15 17:58:24 -03:00
b6513f6ad7 provide 'automatic' token URI by appending the token ID to the base URI (#2174)
* provide 'automatic' token URI by appending the token ID to the base URI, if a base is set but no token-specific URI is available

* make the three cases more explicit, avoid else after return

* adjust comments to reflect reality
2020-04-15 15:39:33 -03:00
4ca719bf8b Fix typo 2020-04-15 14:35:27 -03:00
3216fd9729 Configure line length in .editorconfig 2020-04-15 13:33:49 -03:00
b734bf3fa5 Tweak wording in ERC20Snapshot docs 2020-04-15 13:33:24 -03:00
3b10205c8e Improve ERC20Snapshot documentation (#2186)
Co-authored-by: Nicolás Venturo <nicolas.venturo@gmail.com>
2020-04-14 19:06:51 -03:00
d2ab599bd3 Update IERC777.sol (#2184) 2020-04-14 14:41:33 -03:00
281bcb747e Bump @openzeppelin/cli from 2.8.0 to 2.8.1 (#2182)
Bumps [@openzeppelin/cli](https://github.com/OpenZeppelin/openzeppelin-sdk) from 2.8.0 to 2.8.1.
- [Release notes](https://github.com/OpenZeppelin/openzeppelin-sdk/releases)
- [Commits](https://github.com/OpenZeppelin/openzeppelin-sdk/compare/v2.8.0...v2.8.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-13 13:30:27 -03:00
e03c05774b Bump solhint from 3.0.0-rc.6 to 3.0.0-rc.7 (#2183)
Bumps [solhint](https://github.com/protofire/solhint) from 3.0.0-rc.6 to 3.0.0-rc.7.
- [Release notes](https://github.com/protofire/solhint/releases)
- [Changelog](https://github.com/protofire/solhint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/protofire/solhint/compare/v3.0.0-rc.6...v3.0.0-rc.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-13 13:21:09 -03:00
05d1618d01 Update Contracts docs to make examples compile (#2170)
* Update access-control.adoc to make compile

Add call to `ERC20("MyToken", "TKN")` in `MyToken` constructor

* Update access-control.adoc to make compile

Add call to `ERC20("MyToken", "TKN")` in `MyToken` constructor

* Update access-control.adoc MyToken formatting

* Update erc20-supply.adoc to make compile

Add call to `ERC20("MyToken", "TKN")` in `ERC20FixedSupply` constructor

* Update erc20-supply.adoc to make compile

Add constructor to `ERC20WithMinerReward`

* Update erc20-supply.adoc to make compile

In `MinerRewardMinter` use `ERC20MinterPauser`

* Update erc20-supply.adoc to make compile

Add constructor and override to `ERC20WithAutoMinerReward`

* Update erc777.adoc to make compile

* Update gsn-strategies.adoc to make compile

* Update gsn-strategies.adoc to make compile

Fix imports, add overrides, and revert reason to `MyContract`
2020-04-07 08:45:48 -03:00
885378e421 Fix some of the code formatting in docs 2020-04-03 21:13:55 -03:00
0292d793f3 add passthrough delimiters to avoid italics from underscores (#2169)
Co-authored-by: Nicolás Venturo <nicolas.venturo@gmail.com>
2020-04-03 20:51:14 -03:00
f4566aaade Fix rc generator 2020-04-03 17:55:36 -03:00
d8a5ffeee9 Fix prerelease marker 2020-04-03 17:23:57 -03:00
9edee8a7a8 Fix linter errors 2020-04-03 17:15:40 -03:00
bbb245fc43 Add rc marker to docs 2020-04-03 17:13:56 -03:00
cd6f52997e Merge branch 'master' into release-v3.0.0 2020-04-03 17:06:39 -03:00
c4e5daff86 Fix Pausable docs 2020-04-03 17:06:33 -03:00
96a7113a16 Fix broken links 2020-04-03 17:05:36 -03:00
21ceabc77c Improve API docgen sorting 2020-04-03 17:02:04 -03:00
7c19c56844 Improve API docgen sorting 2020-04-03 17:01:29 -03:00
63a3665a17 3.0.0-rc.1 2020-04-03 16:22:56 -03:00
92a60b2587 Merge branch 'master' into release-v3.0.0 2020-04-03 16:22:25 -03:00
a0f6bd3926 Add 'deploy-ready' token contracts (#2167)
* Add ERC20DeployReady

* Add ERC721DeployReady

* Improve docs

* Fix linter errors

* Rename DeployReady contracts to MinterPauser, add docs

* Fix deploy ready docs

* Minor doc adjustment
2020-04-03 16:21:58 -03:00
402c6ab4cc Update docs (#2168)
* Update docs for ERC20 and ERC721

* Add EnumerableMap to docs

* Update misc guides

* Apply suggestions from code review

Co-Authored-By: Francisco Giordano <frangio.1@gmail.com>

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
2020-04-03 13:17:24 -03:00
6668a4d05c Remove unused behavior 2020-04-02 19:14:33 -03:00
bd0778461d Add EnumerableMap, refactor ERC721 (#2160)
* Implement AddressSet in terms of a generic Set

* Add Uint256Set

* Add EnumerableMap

* Fix wording on EnumerableSet docs and tests

* Refactor ERC721 using EnumerableSet and EnumerableMap

* Fix tests

* Fix linter error

* Gas optimization for EnumerableMap

* Gas optimization for EnumerableSet

* Remove often not-taken if from Enumerable data structures

* Fix failing test

* Gas optimization for EnumerableMap

* Fix linter errors

* Add comment for clarification

* Improve test naming

* Rename EnumerableMap.add to set

* Add overload for EnumerableMap.get with custom error message

* Improve Enumerable docs

* Rename Uint256Set to UintSet

* Add changelog entry
2020-04-02 15:43:06 -03:00
0408e51ae6 Bundle ERC20Detailed (#2161)
* Merge ERC20Detailed into ERC20, make derived contracts abstract

* Fix Create2 tests

* Fix failing test

* Default decimals to 18

* Add tests for setupDecimals

* Add changelog entry

* Update CHANGELOG.md

* Update CHANGELOG.md

* Replace isConstructor for !isContract

* Update CHANGELOG.md

Co-Authored-By: Francisco Giordano <frangio.1@gmail.com>

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
2020-04-02 15:30:21 -03:00
5b5d91c9d4 Remove 'external' functions (#2162)
* Remove _grantRole and _revokeRole, replace with _setupRole

* Make all external AccessControl functions public

* Remove Ownable._transferOwnership

* Rename ERC721's _safeTransferFrom and _transferFrom to _safeTransfer and _transfer

* Make all ERC721 external functions public

* Make all miscelaneous external functions public instead

* Add changelog entry

* Move calldata arguments to memory

* Update contracts/access/AccessControl.sol

Co-Authored-By: Francisco Giordano <frangio.1@gmail.com>

* Restrict setupRole to the constructor

* Replace isConstructor for !isContract

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
2020-04-02 15:29:58 -03:00
1bc923b6a2 fix use of asciidoc quotes 2020-03-30 20:13:30 -03:00
d704b5257b Fix typo in changelog, replace burn(owner) with burn(tokenId) (#2159) 2020-03-30 13:34:36 -03:00
06ae096586 Bump @openzeppelin/cli from 2.7.2 to 2.8.0 (#2157)
Bumps [@openzeppelin/cli](https://github.com/OpenZeppelin/openzeppelin-sdk) from 2.7.2 to 2.8.0.
- [Release notes](https://github.com/OpenZeppelin/openzeppelin-sdk/releases)
- [Commits](https://github.com/OpenZeppelin/openzeppelin-sdk/compare/v2.7.2...v2.8.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-30 13:22:59 -03:00
0f9adc1749 Fix broken xrefs (#2153)
* fix mentions of drafts.adoc

* fix 721.adoc
2020-03-30 12:47:13 -03:00
feb7ead005 Add revert if the bytecode length is zero (#2117)
* Add revert if the bytecode length is not greater than zero

* Add value parameter to create2 deploy function

Add tests for contract balance revert and depositing funds

* Change parameter name to amount for clarity

* Fix test for value sending

* Fix linter error

* Change revert reason

* Improve Create2.deploy documentation

* Slight test improvement

* Add changelog entry

Co-authored-by: Nicolás Venturo <nicolas.venturo@gmail.com>
2020-03-28 12:55:13 -03:00
7415ebe8bc API improvements for EnumerableSet (#2151)
* Add revert reason to EnumerableSet.get.

* Rename EnumerableSet values to keys

* Rename get to at

* Add changelog entry

* Rename keys to values

* Add leading underscore to struct members
2020-03-27 18:39:18 -03:00
24c37c1f9e Bundle ERC721 extensions into base contract (#2149)
* Add IERC721Metadata implementation into ERC721

* Add IERC721Enumerable into ERC721

* Update ERC721Pausable and ERC721Burnable

* Delete ERC721Metadata, ERC721Enumerable and ERC721 (now ERC721)

* Update mocks

* Update tests

* Update contracts/token/ERC721/ERC721.sol

Co-Authored-By: Francisco Giordano <frangio.1@gmail.com>

* Make ERC721Pausable and ERC721Burnable abstract

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
2020-03-27 17:27:41 -03:00
c8bef057f8 [Security] Bump acorn from 6.4.0 to 6.4.1 (#2152)
Bumps [acorn](https://github.com/acornjs/acorn) from 6.4.0 to 6.4.1. **This update includes a security fix.**
- [Release notes](https://github.com/acornjs/acorn/releases)
- [Commits](https://github.com/acornjs/acorn/compare/6.4.0...6.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-27 17:19:00 -03:00
97894a140d Adhere to naming convention (#2150)
* Upgrade to latest solhint rc

* Add private-vars-leading-underscore linter rule

* Add leading underscore to GSNRecipient constants

* Remove leading underscore from ERC165Checker functions

* Add leading underscore to multiple private constants

* Fix linter errors in mocks

* Add leading underscore to ERC777's ERC1820 registry

* Add changelog entry
2020-03-27 13:49:08 -03:00
4476a2d531 Unsigned conversion #2111 (#2123)
* Add signed to unsigned conversion to SafeCast

* Update SafeCast exception message

* Add test for SafeCast int to uint conversion

- Update SafeCastMock
- Add tests for SafeCast int256 to uint256

* Update SafeCast int to uint definition

Apply suggestions from code review.

Co-Authored-By: Nicolás Venturo <nicolas.venturo@gmail.com>

* Update test for SafeCast int to uint conversion

* Update SafeCast test after code review

- Change "downcasts" to "casts"
- Move test closer to its function

* Fix error in SafeCast toUint256 description

* Fix breaking error in SafeCast

* Add uint256 to int256 conversion to SafeCast

- Add function
- Add mock
- Add test

* Update SafeCast unsigned to signed conversion

- Update error in conversion to be more clear
- Update constants in test to be powers of 2 instead of shifts

* Add changelog entry

* Update SafeCast tests

- Add minus in INT256_MIN for clarity

Co-Authored-By: Nicolás Venturo <nicolas.venturo@gmail.com>

Co-authored-by: Nicolás Venturo <nicolas.venturo@gmail.com>
2020-03-27 10:56:30 -03:00
7554ea84a3 Update support request (#2148) 2020-03-26 10:11:55 -03:00
3118bb33ac Add forum link in new issue page 2020-03-25 19:59:41 -03:00
7c3606a19b Bump solidity-docgen from 0.4.0-beta.1 to 0.4.1 (#2145)
Bumps solidity-docgen from 0.4.0-beta.1 to 0.4.1.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-25 15:06:43 -03:00
d6616fdb0d Bump mocha from 7.1.0 to 7.1.1 (#2144)
Bumps [mocha](https://github.com/mochajs/mocha) from 7.1.0 to 7.1.1.
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/v7.1.0...v7.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-25 15:06:10 -03:00
c8aab57d8c Bump eslint-config-standard from 14.1.0 to 14.1.1 (#2143)
Bumps [eslint-config-standard](https://github.com/standard/eslint-config-standard) from 14.1.0 to 14.1.1.
- [Release notes](https://github.com/standard/eslint-config-standard/releases)
- [Changelog](https://github.com/standard/eslint-config-standard/blob/master/CHANGELOG.md)
- [Commits](https://github.com/standard/eslint-config-standard/compare/v14.1.0...v14.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-25 15:05:46 -03:00
3ae631c81d Fix display of array arguments in documentation (#2141)
* remove pass:normal from docs template

* add back pass:normal for auto links
2020-03-20 19:22:24 -03:00
0afba1fb9d [Security] Bump handlebars from 4.1.2 to 4.7.3 (#2138)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.2 to 4.7.3. **This update includes a security fix.**
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2...v4.7.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Nicolás Venturo <nicolas.venturo@gmail.com>
2020-03-18 00:07:59 -03:00
a65bcfdbe8 [Security] Bump acorn from 5.7.3 to 6.4.1 (#2137)
Bumps [acorn](https://github.com/acornjs/acorn) from 5.7.3 to 6.4.1. **This update includes a security fix.**
- [Release notes](https://github.com/acornjs/acorn/releases)
- [Commits](https://github.com/acornjs/acorn/compare/5.7.3...6.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-18 00:07:34 -03:00
60a73c6365 Merge branch 'master' into release-v3.0.0 2020-03-17 12:01:13 -03:00
5112b6b1b5 update solidity-docgen with support for solidity 0.6 (#2136) 2020-03-17 12:00:43 -03:00
865aae0106 Temporarily hide hooks page 2020-03-17 11:49:05 -03:00
5ccecab631 Add prerelease marker 2020-03-17 11:48:13 -03:00
a3c6e5f088 3.0.0-rc.0 2020-03-16 20:47:28 -03:00
a8d6f13c94 Remove all 'available since' notices 2020-03-16 20:44:56 -03:00
e7b22483af Make ERC777 operator the caller (#2134)
* Make the sender the operator

* Make hook methods private

* Add changelog entry
2020-03-16 19:49:17 -03:00
90058040f0 Make AccessControl GSN compatible (#2135) 2020-03-16 19:40:28 -03:00
63c89c772b [Security] Bump acorn from 6.4.0 to 6.4.1 (#2132)
Bumps [acorn](https://github.com/acornjs/acorn) from 6.4.0 to 6.4.1. **This update includes a security fix.**
- [Release notes](https://github.com/acornjs/acorn/releases)
- [Commits](https://github.com/acornjs/acorn/compare/6.4.0...6.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-16 19:37:48 -03:00
9975a1a0c2 Remove Address.toPayable (#2133)
* Remove Address.toPayable

* Add changelog entry
2020-03-16 18:22:02 -03:00
eb34ae67ff Make IERC721 contracts interfaces instead (#2113)
* Make IERC721 contracts interfaces instead

* Bump minimum compiler version for IERC721
2020-03-16 18:21:16 -03:00
f1db30955d Remove deprecated functions and contracts (#2125)
* Remove ERC721.burn(owner, tokenId)

* Remove ERC721._checkOnERC721Received from the contract's API

* Fix linter error

* Remove Escrow and PullPayment withdrawWithGas, replace for withdraw

* Add changelog entry

* Add reentrancy notice
2020-03-16 17:42:33 -03:00
c173392e15 Revamped Access Control (#2112)
* Remove Roles

* Add AccessControl and tests

* Removed IAccessControl

* Add RoleGranted and RoleRevoked events

* Make roles grantable and revokable regardless of their previous status

* Fix typo

* Add documentation

* Cleanup tests

* Add enumeration tests

* Add _setRoleAdmin tests

* Fix lint error

* Fix AccessControl link in docs

* WIP on access control guide

* Rename getRoleMembersCount

* Add tests for new role admin

* Make AccessControl GSN compatible

* Update access control guide

* Rename admin to adminRole

* Rename roleIds to roles

* Add 'operator' to RoleGranted and RoleRevoked events.

* Only emit events if the roles were not previously granted/revoked

* Uncomment expectEvent.not tests

* Rename operator to sender

* Add changelog entry
2020-03-16 17:41:24 -03:00
c9630526e2 Draft and lifecycles directories cleanup (#2122)
* Move Pausable into utils

* Move Strings into utils

* Move Counters into utils

* Move SignedSafeMath into math

* Remove ERC1046

* Make ERC20Snapshot.snapshot internal

* Move ERC20Snapshot into ERC20

* Add drafts deprecation notice

* Remove drafts directory

* Add changelog entry

* Apply suggestions from code review

Co-Authored-By: Francisco Giordano <frangio.1@gmail.com>

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
2020-03-16 16:27:15 -03:00
8176a901a9 Cleanup of Ownership directory (#2120)
* Remove Ownable.isOwner.

* Remove ownable behavior from tests

* Make Escrow use Ownable instead of Secondary

* Migrate GSNRecipientERC20Fee to Ownable

* Remove Secondary

* Move Ownable to access directory

* Remove mentions of Secondary

* Add changelog entry

* Move Ownable tests to access

* Remove unused mock
2020-03-16 15:12:29 -03:00
baaadde3c5 Remove ERC20._burnFrom (#2119)
* Remove ERC20._burnFrom

* Add changelog entry
2020-03-16 15:06:19 -03:00
68ad1ed18f Bump @openzeppelin/cli from 2.7.1 to 2.7.2 (#2129)
Bumps [@openzeppelin/cli](https://github.com/OpenZeppelin/openzeppelin-sdk) from 2.7.1 to 2.7.2.
- [Release notes](https://github.com/OpenZeppelin/openzeppelin-sdk/releases)
- [Commits](https://github.com/OpenZeppelin/openzeppelin-sdk/compare/v2.7.1...v2.7.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-16 13:28:42 -03:00
d14007d035 Bump @openzeppelin/test-helpers from 0.5.4 to 0.5.5 (#2127)
Bumps [@openzeppelin/test-helpers](https://github.com/OpenZeppelin/openzeppelin-test-helpers) from 0.5.4 to 0.5.5.
- [Release notes](https://github.com/OpenZeppelin/openzeppelin-test-helpers/releases)
- [Changelog](https://github.com/OpenZeppelin/openzeppelin-test-helpers/blob/master/CHANGELOG.md)
- [Commits](https://github.com/OpenZeppelin/openzeppelin-test-helpers/compare/v0.5.4...v0.5.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-16 13:28:18 -03:00
a949d4e2bf Bump @openzeppelin/gsn-provider from 0.1.9 to 0.1.10 (#2126)
Bumps [@openzeppelin/gsn-provider](https://github.com/OpenZeppelin/openzeppelin-gsn-provider) from 0.1.9 to 0.1.10.
- [Release notes](https://github.com/OpenZeppelin/openzeppelin-gsn-provider/releases)
- [Changelog](https://github.com/OpenZeppelin/openzeppelin-gsn-provider/blob/master/CHANGELOG.md)
- [Commits](https://github.com/OpenZeppelin/openzeppelin-gsn-provider/compare/v0.1.9...v0.1.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-16 13:28:05 -03:00
ed2c289c2c Bump acorn from 6.4.0 to 6.4.1 (#2124)
Bumps [acorn](https://github.com/acornjs/acorn) from 6.4.0 to 6.4.1.
- [Release notes](https://github.com/acornjs/acorn/releases)
- [Commits](https://github.com/acornjs/acorn/compare/6.4.0...6.4.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-03-13 17:54:03 -03:00
7acd60d152 Add notice about deprecated Crowdsales (#2116)
* Remove crowdsales from sidebar documentation, add links to old version

* Remove mentions of Crowdsales from the documentation
2020-03-11 15:26:21 -03:00
0449062126 Bump solhint from 3.0.0-rc.3 to 3.0.0-rc.5 (#2109)
Bumps [solhint](https://github.com/protofire/solhint) from 3.0.0-rc.3 to 3.0.0-rc.5.
- [Release notes](https://github.com/protofire/solhint/releases)
- [Changelog](https://github.com/protofire/solhint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/protofire/solhint/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-11 12:56:26 -03:00
65e4ffde58 Make ECDSA.recover revert on error. (#2114)
* Make ECDSA.recover revert on error

* Removed unused test

* Remove duplicate line

* Add tests for invalid signatures

* Fix linter errors

* Add changelog entry
2020-03-10 20:13:32 -03:00
e2813df879 Use bytes32 explicitly for Create2.computeAddress() (#2088)
* Use bytes32 explicitly for Create2.computeAddress(), to force users cache hash of the bytecode

* Remove only from test :)
2020-03-09 13:02:14 -03:00
ca19cea05e install @openzeppelin/docs-utils 2020-03-09 11:37:41 -03:00
3296ca7219 Rearrange erc721metadata layout to mimic eth-pkg (#2098)
In https://github.com/OpenZeppelin/openzeppelin-contracts-ethereum-package/pull/76, we are rearranging the erc721metadata contract storage layout, so the new variable is added at the end. This commit applies the same change to the vanilla contracts repository, so migration from 2.5 to 3.0 is easier for users using the transpiler.
2020-03-04 15:31:57 -03:00
cb458f3250 Bump mocha from 7.0.1 to 7.1.0 (#2104)
Bumps [mocha](https://github.com/mochajs/mocha) from 7.0.1 to 7.1.0.
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/v7.0.1...v7.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 13:05:48 -03:00
21d2b90d74 allow running specific test files on their own 2020-02-28 18:56:14 -03:00
ab19138f1f Bump @openzeppelin/test-environment from 0.1.2 to 0.1.3 (#2101)
Bumps [@openzeppelin/test-environment](https://github.com/OpenZeppelin/openzeppelin-test-environment) from 0.1.2 to 0.1.3.
- [Release notes](https://github.com/OpenZeppelin/openzeppelin-test-environment/releases)
- [Changelog](https://github.com/OpenZeppelin/openzeppelin-test-environment/blob/master/CHANGELOG.md)
- [Commits](https://github.com/OpenZeppelin/openzeppelin-test-environment/compare/v0.1.2...v0.1.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-26 15:17:07 -03:00
970122a9d5 Bump solhint from 3.0.0-rc.2 to 3.0.0-rc.3 (#2096)
Bumps [solhint](https://github.com/protofire/solhint) from 3.0.0-rc.2 to 3.0.0-rc.3.
- [Release notes](https://github.com/protofire/solhint/releases)
- [Changelog](https://github.com/protofire/solhint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/protofire/solhint/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-18 11:20:10 -03:00
62065cf043 add prepare-docs script to subpackage 2020-02-17 19:02:13 -03:00
03b61e074e Bump @openzeppelin/cli from 2.7.0-rc.2 to 2.7.1 (#2097)
Bumps [@openzeppelin/cli](https://github.com/OpenZeppelin/openzeppelin-sdk) from 2.7.0-rc.2 to 2.7.1.
- [Release notes](https://github.com/OpenZeppelin/openzeppelin-sdk/releases)
- [Commits](https://github.com/OpenZeppelin/openzeppelin-sdk/compare/v2.7.0-rc.2...v2.7.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-17 18:22:57 -03:00
1350f49939 Bump openzeppelin-docs-utils from af3466e to 459f171 (#2094)
Bumps [openzeppelin-docs-utils](https://github.com/OpenZeppelin/docs-utils) from `af3466e` to `459f171`.
- [Release notes](https://github.com/OpenZeppelin/docs-utils/releases)
- [Commits](af3466e234...459f1710a0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-17 17:00:43 -03:00
1c22c79a32 [Security] Bump eslint-utils from 1.4.0 to 1.4.3 (#2093)
Bumps [eslint-utils](https://github.com/mysticatea/eslint-utils) from 1.4.0 to 1.4.3. **This update includes security fixes.**
- [Release notes](https://github.com/mysticatea/eslint-utils/releases)
- [Commits](https://github.com/mysticatea/eslint-utils/compare/v1.4.0...v1.4.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-17 16:43:26 -03:00
08cea10aa7 Fix operatorBurn description typo. (#2091) 2020-02-17 16:31:26 -03:00
82147dc2ee [Security] Bump handlebars from 4.1.2 to 4.7.3 (#2095)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.2 to 4.7.3. **This update includes a security fix.**
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2...v4.7.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-17 16:23:28 -03:00
199 changed files with 8759 additions and 8049 deletions

View File

@ -9,6 +9,7 @@ end_of_line = lf
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
max_line_length = 120
[*.sol]
indent_size = 4

4
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@ -0,0 +1,4 @@
contact_links:
- name: Support request
url: https://forum.openzeppelin.com/c/support/contracts/18
about: Ask the community in the Community Forum

View File

@ -4,6 +4,7 @@
"func-order": "off",
"mark-callable-contracts": "off",
"no-empty-blocks": "off",
"compiler-version": ["error", "^0.6.0"]
"compiler-version": ["error", "^0.6.0"],
"private-vars-leading-underscore": "error"
}
}

View File

@ -1,5 +1,57 @@
# Changelog
## 3.0.2 (2020-06-08)
### Improvements
* Added SPX license identifier to all contracts. ([#2235](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2235))
## 3.0.1 (2020-04-27)
### Bugfixes
* `ERC777`: fixed the `_approve` internal function not validating some of their arguments for non-zero addresses. ([#2213](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2213))
## 3.0.0 (2020-04-20)
### New features
* `AccessControl`: new contract for managing permissions in a system, replacement for `Ownable` and `Roles`. ([#2112](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2112))
* `SafeCast`: new functions to convert to and from signed and unsigned values: `toUint256` and `toInt256`. ([#2123](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2123))
* `EnumerableMap`: a new data structure for key-value pairs (like `mapping`) that can be iterated over. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160))
### Breaking changes
* `ERC721`: `burn(owner, tokenId)` was removed, use `burn(tokenId)` instead. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125))
* `ERC721`: `_checkOnERC721Received` was removed. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125))
* `ERC721`: `_transferFrom` and `_safeTransferFrom` were renamed to `_transfer` and `_safeTransfer`. ([#2162](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2162))
* `Ownable`: removed `_transferOwnership`. ([#2162](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2162))
* `PullPayment`, `Escrow`: `withdrawWithGas` was removed. The old `withdraw` function now forwards all gas. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125))
* `Roles` was removed, use `AccessControl` as a replacement. ([#2112](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2112))
* `ECDSA`: when receiving an invalid signature, `recover` now reverts instead of returning the zero address. ([#2114](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2114))
* `Create2`: added an `amount` argument to `deploy` for contracts with `payable` constructors. ([#2117](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2117))
* `Pausable`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122))
* `Strings`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122))
* `Counters`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122))
* `SignedSafeMath`: moved to the `math` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122))
* `ERC20Snapshot`: moved to the `token/ERC20` directory. `snapshot` was changed into an `internal` function. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122))
* `Ownable`: moved to the `access` directory. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120))
* `Ownable`: removed `isOwner`. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120))
* `Secondary`: removed from the library, use `Ownable` instead. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120))
* `Escrow`, `ConditionalEscrow`, `RefundEscrow`: these now use `Ownable` instead of `Secondary`, their external API changed accordingly. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120))
* `ERC20`: removed `_burnFrom`. ([#2119](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2119))
* `Address`: removed `toPayable`, use `payable(address)` instead. ([#2133](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2133))
* `ERC777`: `_send`, `_mint` and `_burn` now use the caller as the operator. ([#2134](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2134))
* `ERC777`: removed `_callsTokensToSend` and `_callTokensReceived`. ([#2134](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2134))
* `EnumerableSet`: renamed `get` to `at`. ([#2151](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2151))
* `ERC165Checker`: functions no longer have a leading underscore. ([#2150](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2150))
* `ERC721Metadata`, `ERC721Enumerable`: these contracts were removed, and their functionality merged into `ERC721`. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160))
* `ERC721`: added a constructor for `name` and `symbol`. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160))
* `ERC20Detailed`: this contract was removed and its functionality merged into `ERC20`. ([#2161](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2161))
* `ERC20`: added a constructor for `name` and `symbol`. `decimals` now defaults to 18. ([#2161](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2161))
* `Strings`: renamed `fromUint256` to `toString` ([#2188](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2188))
## 2.5.1 (2020-04-24)
### Bugfixes
* `ERC777`: fixed the `_send` and `_approve` internal functions not validating some of their arguments for non-zero addresses. ([#2212](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2212))
## 2.5.0 (2020-02-04)
### New features
@ -91,7 +143,7 @@ Refer to the table below to adjust your inheritance list.
### Improvements
* Upgraded the minimum compiler version to v0.5.2: this removes many Solidity warnings that were false positives. ([#1606](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1606))
* `ECDSA`: `recover` no longer accepts malleable signatures (those using upper-range values for `s`, or 0/1 for `v`). ([#1622](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1622))
* `ERC721`'s transfers are now more gas efficient due to removal of unnecessary `SafeMath` calls. ([#1610](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1610))
* ``ERC721``'s transfers are now more gas efficient due to removal of unnecessary `SafeMath` calls. ([#1610](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1610))
* Fixed variable shadowing issues. ([#1606](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1606))
### Bugfixes

View File

@ -1,5 +1,6 @@
# <img src="logo.png" alt="OpenZeppelin" height="40px">
[![Docs](https://img.shields.io/badge/docs-%F0%9F%93%84-blue)](https://docs.openzeppelin.com/contracts)
[![NPM Package](https://img.shields.io/npm/v/@openzeppelin/contracts.svg)](https://www.npmjs.org/package/@openzeppelin/contracts)
[![Build Status](https://circleci.com/gh/OpenZeppelin/openzeppelin-contracts.svg?style=shield)](https://circleci.com/gh/OpenZeppelin/openzeppelin-contracts)
[![Coverage Status](https://codecov.io/gh/OpenZeppelin/openzeppelin-contracts/graph/badge.svg)](https://codecov.io/gh/OpenZeppelin/openzeppelin-contracts)
@ -10,7 +11,7 @@
* Flexible [role-based permissioning](https://docs.openzeppelin.com/contracts/access-control) scheme.
* Reusable [Solidity components](https://docs.openzeppelin.com/contracts/utilities) to build custom contracts and complex decentralized systems.
* First-class integration with the [Gas Station Network](https://docs.openzeppelin.com/contracts/gsn) for systems with no gas fees!
* Audited by leading security firms.
* Audited by leading security firms (_last full audit on v2.0.0_).
## Overview

View File

@ -1,83 +1,20 @@
# Releasing
This document describes our release process, and contains the steps to be followed by an OpenZeppelin maintainer at the several stages of a release.
> Visit the documentation for [details about release schedule].
We release a new version of OpenZeppelin monthly. Release cycles are tracked in the [issue milestones](https://github.com/OpenZeppelin/openzeppelin-contracts/milestones).
Start on an up-to-date `master` branch.
Each release has at least one release candidate published first, intended for community review and any critical fixes that may come out of it. At the moment we leave 1 week between the first release candidate and the final release.
Create the release branch with `npm run release start minor`.
Before starting make sure to verify the following items.
* Your local `master` branch is in sync with your `upstream` remote (it may have another name depending on your setup).
* Your repo is clean, particularly with no untracked files in the contracts and tests directories. Verify with `git clean -n`.
Publish a release candidate with `npm run release rc`.
Publish the final release with `npm run release final`.
## Creating the release branch
Follow the general [OpenZeppelin release checklist].
We'll refer to a release `vX.Y.Z`.
[details about release schedule]: https://docs.openzeppelin.com/contracts/releases-stability
[OpenZeppelin release checklist]: https://github.com/OpenZeppelin/code-style/blob/master/RELEASE_CHECKLIST.md
```
git checkout master
git checkout -b release-vX.Y.Z
```
## Creating a release candidate
Once in the release branch, change the version string in `package.json`, `package-lock.json` and `ethpm.json` to `X.Y.Z-rc.R`. (This will be `X.Y.Z-rc.1` for the first release candidate.) Commit these changes and tag the commit as `vX.Y.Z-rc.R`.
```
git add package.json package-lock.json ethpm.json
git commit -m "Release candidate vX.Y.Z-rc.R"
git tag -a vX.Y.Z-rc.R
git push upstream release-vX.Y.Z
git push upstream vX.Y.Z-rc.R
```
Draft the release notes in our [GitHub releases](https://github.com/OpenZeppelin/openzeppelin-contracts/releases). Make sure to mark it as a pre-release! Try to be consistent with our previous release notes in the title and format of the text. Release candidates don't need a detailed changelog, but make sure to include a link to GitHub's compare page.
Once the CI run for the new tag is green, publish on npm under the `next` tag. You should see the contracts compile automatically.
```
npm publish --tag next
```
Publish the release notes on GitHub and the forum, and ask our community manager to announce the release candidate on at least Twitter.
## Creating the final release
Make sure to have the latest changes from `upstream` in your local release branch.
```
git checkout release-vX.Y.Z
git pull upstream
```
Before starting the release process, make one final commit to CHANGELOG.md, including the date of the release.
Change the version string in `package.json`, `package-lock.json` and `ethpm.json` removing the "-rc.R" suffix. Commit these changes and tag the commit as `vX.Y.Z`.
```
git add package.json package-lock.json ethpm.json
git commit -m "Release vX.Y.Z"
git tag -a vX.Y.Z
git push upstream release-vX.Y.Z
git push upstream vX.Y.Z
```
Draft the release notes in GitHub releases. Try to be consistent with our previous release notes in the title and format of the text. Make sure to include a detailed changelog.
Once the CI run for the new tag is green, publish on npm. You should see the contracts compile automatically.
```
npm publish
```
Publish the release notes on GitHub and ask our community manager to announce the release!
Delete the `next` tag in the npm package as there is no longer a release candidate.
```
npm dist-tag rm --otp $2FA_CODE @openzeppelin/contracts next
```
## Merging the release branch

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/*

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./IRelayRecipient.sol";
@ -19,11 +21,11 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
// Default RelayHub address, deployed on mainnet and all testnets at the same address
address private _relayHub = 0xD216153c06E857cD7f72665E0aF1d7D82172F494;
uint256 constant private RELAYED_CALL_ACCEPTED = 0;
uint256 constant private RELAYED_CALL_REJECTED = 11;
uint256 constant private _RELAYED_CALL_ACCEPTED = 0;
uint256 constant private _RELAYED_CALL_REJECTED = 11;
// How much gas is forwarded to postRelayedCall
uint256 constant internal POST_RELAYED_CALL_MAX_GAS = 100000;
uint256 constant internal _POST_RELAYED_CALL_MAX_GAS = 100000;
/**
* @dev Emitted when a contract changes its {IRelayHub} contract to a new one.
@ -119,7 +121,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
*
* - the caller must be the `RelayHub` contract.
*/
function preRelayedCall(bytes calldata context) external virtual override returns (bytes32) {
function preRelayedCall(bytes memory context) public virtual override returns (bytes32) {
require(msg.sender == getHubAddr(), "GSNRecipient: caller is not RelayHub");
return _preRelayedCall(context);
}
@ -142,7 +144,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
*
* - the caller must be the `RelayHub` contract.
*/
function postRelayedCall(bytes calldata context, bool success, uint256 actualCharge, bytes32 preRetVal) external virtual override {
function postRelayedCall(bytes memory context, bool success, uint256 actualCharge, bytes32 preRetVal) public virtual override {
require(msg.sender == getHubAddr(), "GSNRecipient: caller is not RelayHub");
_postRelayedCall(context, success, actualCharge, preRetVal);
}
@ -170,14 +172,14 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
* This overload forwards `context` to _preRelayedCall and _postRelayedCall.
*/
function _approveRelayedCall(bytes memory context) internal pure returns (uint256, bytes memory) {
return (RELAYED_CALL_ACCEPTED, context);
return (_RELAYED_CALL_ACCEPTED, context);
}
/**
* @dev Return this in acceptRelayedCall to impede execution of a relayed call. No fees will be charged.
*/
function _rejectRelayedCall(uint256 errorCode) internal pure returns (uint256, bytes memory) {
return (RELAYED_CALL_REJECTED + errorCode, "");
return (_RELAYED_CALL_REJECTED + errorCode, "");
}
/*

View File

@ -1,11 +1,12 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./GSNRecipient.sol";
import "../math/SafeMath.sol";
import "../ownership/Secondary.sol";
import "../access/Ownable.sol";
import "../token/ERC20/SafeERC20.sol";
import "../token/ERC20/ERC20.sol";
import "../token/ERC20/ERC20Detailed.sol";
/**
* @dev A xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategy] that charges transaction fees in a special purpose ERC20
@ -17,20 +18,20 @@ import "../token/ERC20/ERC20Detailed.sol";
* internal {_mint} function.
*/
contract GSNRecipientERC20Fee is GSNRecipient {
using SafeERC20 for __unstable__ERC20PrimaryAdmin;
using SafeERC20 for __unstable__ERC20Owned;
using SafeMath for uint256;
enum GSNRecipientERC20FeeErrorCodes {
INSUFFICIENT_BALANCE
}
__unstable__ERC20PrimaryAdmin private _token;
__unstable__ERC20Owned private _token;
/**
* @dev The arguments to the constructor are the details that the gas payment token will have: `name` and `symbol`. `decimals` is hard-coded to 18.
*/
constructor(string memory name, string memory symbol) public {
_token = new __unstable__ERC20PrimaryAdmin(name, symbol, 18);
_token = new __unstable__ERC20Owned(name, symbol);
}
/**
@ -53,15 +54,15 @@ contract GSNRecipientERC20Fee is GSNRecipient {
function acceptRelayedCall(
address,
address from,
bytes calldata,
bytes memory,
uint256 transactionFee,
uint256 gasPrice,
uint256,
uint256,
bytes calldata,
bytes memory,
uint256 maxPossibleCharge
)
external
public
view
virtual
override
@ -97,7 +98,7 @@ contract GSNRecipientERC20Fee is GSNRecipient {
// actualCharge is an _estimated_ charge, which assumes postRelayedCall will use all available gas.
// This implementation's gas cost can be roughly estimated as 10k gas, for the two SSTORE operations in an
// ERC20 transfer.
uint256 overestimation = _computeCharge(POST_RELAYED_CALL_MAX_GAS.sub(10000), gasPrice, transactionFee);
uint256 overestimation = _computeCharge(_POST_RELAYED_CALL_MAX_GAS.sub(10000), gasPrice, transactionFee);
actualCharge = actualCharge.sub(overestimation);
// After the relayed call has been executed and the actual charge estimated, the excess pre-charge is returned
@ -106,42 +107,42 @@ contract GSNRecipientERC20Fee is GSNRecipient {
}
/**
* @title __unstable__ERC20PrimaryAdmin
* @title __unstable__ERC20Owned
* @dev An ERC20 token owned by another contract, which has minting permissions and can use transferFrom to receive
* anyone's tokens. This contract is an internal helper for GSNRecipientERC20Fee, and should not be used
* outside of this context.
*/
// solhint-disable-next-line contract-name-camelcase
contract __unstable__ERC20PrimaryAdmin is ERC20, ERC20Detailed, Secondary {
uint256 private constant UINT256_MAX = 2**256 - 1;
contract __unstable__ERC20Owned is ERC20, Ownable {
uint256 private constant _UINT256_MAX = 2**256 - 1;
constructor(string memory name, string memory symbol, uint8 decimals) public ERC20Detailed(name, symbol, decimals) { }
constructor(string memory name, string memory symbol) public ERC20(name, symbol) { }
// The primary account (GSNRecipientERC20Fee) can mint tokens
function mint(address account, uint256 amount) public onlyPrimary {
// The owner (GSNRecipientERC20Fee) can mint tokens
function mint(address account, uint256 amount) public onlyOwner {
_mint(account, amount);
}
// The primary account has 'infinite' allowance for all token holders
function allowance(address owner, address spender) public view override(ERC20, IERC20) returns (uint256) {
if (spender == primary()) {
return UINT256_MAX;
// The owner has 'infinite' allowance for all token holders
function allowance(address tokenOwner, address spender) public view override returns (uint256) {
if (spender == owner()) {
return _UINT256_MAX;
} else {
return super.allowance(owner, spender);
return super.allowance(tokenOwner, spender);
}
}
// Allowance for the primary account cannot be changed (it is always 'infinite')
function _approve(address owner, address spender, uint256 value) internal override {
if (spender == primary()) {
// Allowance for the owner cannot be changed (it is always 'infinite')
function _approve(address tokenOwner, address spender, uint256 value) internal override {
if (spender == owner()) {
return;
} else {
super._approve(owner, spender, value);
super._approve(tokenOwner, spender, value);
}
}
function transferFrom(address sender, address recipient, uint256 amount) public override(ERC20, IERC20) returns (bool) {
if (recipient == primary()) {
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
if (recipient == owner()) {
_transfer(sender, recipient, amount);
return true;
} else {

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./GSNRecipient.sol";
@ -32,15 +34,15 @@ contract GSNRecipientSignature is GSNRecipient {
function acceptRelayedCall(
address relay,
address from,
bytes calldata encodedFunction,
bytes memory encodedFunction,
uint256 transactionFee,
uint256 gasPrice,
uint256 gasLimit,
uint256 nonce,
bytes calldata approvalData,
bytes memory approvalData,
uint256
)
external
public
view
virtual
override

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
@ -250,7 +252,7 @@ interface IRelayHub {
function penalizeRepeatedNonce(bytes calldata unsignedTx1, bytes calldata signature1, bytes calldata unsignedTx2, bytes calldata signature2) external;
/**
* @dev Penalize a relay that sent a transaction that didn't target `RelayHub`'s {registerRelay} or {relayCall}.
* @dev Penalize a relay that sent a transaction that didn't target ``RelayHub``'s {registerRelay} or {relayCall}.
*/
function penalizeIllegalTransaction(bytes calldata unsignedTx, bytes calldata signature) external;

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
@ -17,7 +19,7 @@ interface IRelayRecipient {
*
* The relay request was originated by `from` and will be served by `relay`. `encodedFunction` is the relayed call
* calldata, so its first four bytes are the function selector. The relayed call will be forwarded `gasLimit` gas,
* and the transaction executed with a gas price of at least `gasPrice`. `relay`'s fee is `transactionFee`, and the
* and the transaction executed with a gas price of at least `gasPrice`. ``relay``'s fee is `transactionFee`, and the
* recipient will be charged at most `maxPossibleCharge` (in wei). `nonce` is the sender's (`from`) nonce for
* replay attack protection in {IRelayHub}, and `approvalData` is a optional parameter that can be used to hold a signature
* over all or some of the previous values.

View File

@ -1,7 +1,5 @@
= Gas Station Network (GSN)
_Available since v2.4.0._
This set of contracts provide all the tools required to make a contract callable via the https://gsn.openzeppelin.com[Gas Station Network].
TIP: If you're new to the GSN, head over to our xref:learn::sending-gasless-transactions.adoc[overview of the system] and basic guide to xref:ROOT:gsn.adoc[creating a GSN-capable contract].

View File

@ -0,0 +1,204 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../utils/EnumerableSet.sol";
import "../utils/Address.sol";
import "../GSN/Context.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context {
using EnumerableSet for EnumerableSet.AddressSet;
using Address for address;
struct RoleData {
EnumerableSet.AddressSet members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view returns (bool) {
return _roles[role].members.contains(account);
}
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) public view returns (uint256) {
return _roles[role].members.length();
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
return _roles[role].members.at(index);
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual {
require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual {
require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (_roles[role].members.add(account)) {
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (_roles[role].members.remove(account)) {
emit RoleRevoked(role, account, _msgSender());
}
}
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../GSN/Context.sol";
@ -6,6 +8,9 @@ import "../GSN/Context.sol";
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
@ -35,17 +40,10 @@ contract Ownable is Context {
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(isOwner(), "Ownable: caller is not the owner");
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Returns true if the caller is the current owner.
*/
function isOwner() public view returns (bool) {
return _msgSender() == _owner;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
@ -63,13 +61,6 @@ contract Ownable is Context {
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
*/
function _transferOwnership(address newOwner) internal virtual {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;

View File

@ -1,7 +1,9 @@
= Access
NOTE: This page is incomplete. We're working to improve it for the next release. Stay tuned!
Contract modules for authorization and access control mechanisms.
== Library
== Contracts
{{Roles}}
{{Ownable}}
{{AccessControl}}

View File

@ -1,36 +0,0 @@
pragma solidity ^0.6.0;
/**
* @title Roles
* @dev Library for managing addresses assigned to a Role.
*/
library Roles {
struct Role {
mapping (address => bool) bearer;
}
/**
* @dev Give an account access to this role.
*/
function add(Role storage role, address account) internal {
require(!has(role, account), "Roles: account already has role");
role.bearer[account] = true;
}
/**
* @dev Remove an account's access to this role.
*/
function remove(Role storage role, address account) internal {
require(has(role, account), "Roles: account does not have role");
role.bearer[account] = false;
}
/**
* @dev Check if an account has this role.
* @return bool
*/
function has(Role storage role, address account) internal view returns (bool) {
require(account != address(0), "Roles: account is the zero address");
return role.bearer[account];
}
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
@ -15,10 +17,6 @@ library ECDSA {
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* NOTE: This call _does not revert_ if the signature is invalid, or
* if the signer is otherwise unable to be retrieved. In those scenarios,
* the zero address is returned.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
@ -28,7 +26,7 @@ library ECDSA {
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
// Check the signature length
if (signature.length != 65) {
return (address(0));
revert("ECDSA: invalid signature length");
}
// Divide the signature in r, s and v variables
@ -55,15 +53,18 @@ library ECDSA {
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return address(0);
revert("ECDSA: invalid signature 's' value");
}
if (v != 27 && v != 28) {
return address(0);
revert("ECDSA: invalid signature 'v' value");
}
// If the signature is valid (and not malleable), return the signer address
return ecrecover(hash, v, r, s);
address signer = ecrecover(hash, v, r, s);
require(signer != address(0), "ECDSA: invalid signature");
return signer;
}
/**

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**

View File

@ -1,24 +0,0 @@
pragma solidity ^0.6.0;
import "../../token/ERC20/IERC20.sol";
/**
* @title ERC-1047 Token Metadata
* @dev See https://eips.ethereum.org/EIPS/eip-1046
* @dev {tokenURI} must respond with a URI that implements https://eips.ethereum.org/EIPS/eip-1047
*/
contract ERC20Metadata {
string private _tokenURI;
constructor (string memory tokenURI_) public {
_setTokenURI(tokenURI_);
}
function tokenURI() external view returns (string memory) {
return _tokenURI;
}
function _setTokenURI(string memory tokenURI_) internal virtual {
_tokenURI = tokenURI_;
}
}

View File

@ -1,142 +0,0 @@
pragma solidity ^0.6.0;
import "../math/SafeMath.sol";
import "../utils/Arrays.sol";
import "../drafts/Counters.sol";
import "../token/ERC20/ERC20.sol";
/**
* @title ERC20 token with snapshots.
* @dev Inspired by Jordi Baylina's
* https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol[MiniMeToken]
* to record historical balances.
*
* When a snapshot is made, the balances and total supply at the time of the snapshot are recorded for later
* access.
*
* To make a snapshot, call the {snapshot} function, which will emit the {Snapshot} event and return a snapshot id.
* To get the total supply from a snapshot, call the function {totalSupplyAt} with the snapshot id.
* To get the balance of an account from a snapshot, call the {balanceOfAt} function with the snapshot id and the
* account address.
* @author Validity Labs AG <info@validitylabs.org>
*/
contract ERC20Snapshot is ERC20 {
using SafeMath for uint256;
using Arrays for uint256[];
using Counters for Counters.Counter;
// Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a
// Snapshot struct, but that would impede usage of functions that work on an array.
struct Snapshots {
uint256[] ids;
uint256[] values;
}
mapping (address => Snapshots) private _accountBalanceSnapshots;
Snapshots private _totalSupplySnapshots;
// Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid.
Counters.Counter private _currentSnapshotId;
event Snapshot(uint256 id);
// Creates a new snapshot id. Balances are only stored in snapshots on demand: unless a snapshot was taken, a
// balance change will not be recorded. This means the extra added cost of storing snapshotted balances is only paid
// when required, but is also flexible enough that it allows for e.g. daily snapshots.
function snapshot() public virtual returns (uint256) {
_currentSnapshotId.increment();
uint256 currentId = _currentSnapshotId.current();
emit Snapshot(currentId);
return currentId;
}
function balanceOfAt(address account, uint256 snapshotId) public view returns (uint256) {
(bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);
return snapshotted ? value : balanceOf(account);
}
function totalSupplyAt(uint256 snapshotId) public view returns(uint256) {
(bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);
return snapshotted ? value : totalSupply();
}
// _transfer, _mint and _burn are the only functions where the balances are modified, so it is there that the
// snapshots are updated. Note that the update happens _before_ the balance change, with the pre-modified value.
// The same is true for the total supply and _mint and _burn.
function _transfer(address from, address to, uint256 value) internal virtual override {
_updateAccountSnapshot(from);
_updateAccountSnapshot(to);
super._transfer(from, to, value);
}
function _mint(address account, uint256 value) internal virtual override {
_updateAccountSnapshot(account);
_updateTotalSupplySnapshot();
super._mint(account, value);
}
function _burn(address account, uint256 value) internal virtual override {
_updateAccountSnapshot(account);
_updateTotalSupplySnapshot();
super._burn(account, value);
}
// When a valid snapshot is queried, there are three possibilities:
// a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never
// created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds
// to this id is the current one.
// b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the
// requested id, and its value is the one to return.
// c) More snapshots were created after the requested one, and the queried value was later modified. There will be
// no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is
// larger than the requested one.
//
// In summary, we need to find an element in an array, returning the index of the smallest value that is larger if
// it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does
// exactly this.
function _valueAt(uint256 snapshotId, Snapshots storage snapshots)
private view returns (bool, uint256)
{
require(snapshotId > 0, "ERC20Snapshot: id is 0");
// solhint-disable-next-line max-line-length
require(snapshotId <= _currentSnapshotId.current(), "ERC20Snapshot: nonexistent id");
uint256 index = snapshots.ids.findUpperBound(snapshotId);
if (index == snapshots.ids.length) {
return (false, 0);
} else {
return (true, snapshots.values[index]);
}
}
function _updateAccountSnapshot(address account) private {
_updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
}
function _updateTotalSupplySnapshot() private {
_updateSnapshot(_totalSupplySnapshots, totalSupply());
}
function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {
uint256 currentId = _currentSnapshotId.current();
if (_lastSnapshotId(snapshots.ids) < currentId) {
snapshots.ids.push(currentId);
snapshots.values.push(currentValue);
}
}
function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {
if (ids.length == 0) {
return 0;
} else {
return ids[ids.length - 1];
}
}
}

View File

@ -1,23 +0,0 @@
= Drafts
Contracts in this category should be considered unstable. They are as thoroughly reviewed as everything else in OpenZeppelin Contracts, but we have doubts about their API so we don't commit to backwards compatibility. This means these contracts can receive breaking changes in a minor version, so you should pay special attention to the changelog when upgrading. For anything that is outside of this category you can read more about xref:ROOT:api-stability.adoc[API Stability].
NOTE: This page is incomplete. We're working to improve it for the next release. Stay tuned!
== ERC 20
{{ERC20Migrator}}
{{ERC20Snapshot}}
{{TokenVesting}}
== Miscellaneous
{{Counters}}
{{SignedSafeMath}}
== ERC 1046
{{ERC1046}}

View File

@ -1,7 +1,7 @@
pragma solidity ^0.6.0;
import "../token/ERC20/SafeERC20.sol";
import "../ownership/Ownable.sol";
import "../access/Ownable.sol";
import "../math/SafeMath.sol";
/**

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./IERC165.sol";
@ -30,7 +32,7 @@ contract ERC165 is IERC165 {
*
* Time complexity O(1), guaranteed to always use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view override returns (bool) {
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
return _supportedInterfaces[interfaceId];
}

View File

@ -1,4 +1,6 @@
pragma solidity ^0.6.0;
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;
/**
* @dev Library used to query support of an interface declared via {IERC165}.
@ -19,7 +21,7 @@ library ERC165Checker {
/**
* @dev Returns true if `account` supports the {IERC165} interface,
*/
function _supportsERC165(address account) internal view returns (bool) {
function supportsERC165(address account) internal view returns (bool) {
// Any contract that implements ERC165 must explicitly indicate support of
// InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&
@ -32,9 +34,9 @@ library ERC165Checker {
*
* See {IERC165-supportsInterface}.
*/
function _supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
// query support of both ERC165 as per the spec and support of _interfaceId
return _supportsERC165(account) &&
return supportsERC165(account) &&
_supportsERC165Interface(account, interfaceId);
}
@ -47,9 +49,9 @@ library ERC165Checker {
*
* See {IERC165-supportsInterface}.
*/
function _supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
// query support of ERC165 itself
if (!_supportsERC165(account)) {
if (!supportsERC165(account)) {
return false;
}
@ -72,7 +74,7 @@ library ERC165Checker {
* identifier interfaceId, false otherwise
* @dev Assumes that account contains a contract that supports ERC165, otherwise
* the behavior of this method is undefined. This precondition can be checked
* with the `supportsERC165` method in this library.
* with {supportsERC165}.
* Interface identification is specified in ERC-165.
*/
function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {
@ -97,7 +99,7 @@ library ERC165Checker {
returns (bool, bool)
{
bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);
(bool success, bytes memory result) = account.staticcall.gas(30000)(encodedParams);
(bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);
if (result.length < 32) return (false, false);
return (success, abi.decode(result, (bool)));
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./IERC1820Implementer.sol";
@ -11,15 +13,15 @@ import "./IERC1820Implementer.sol";
* registration to be complete.
*/
contract ERC1820Implementer is IERC1820Implementer {
bytes32 constant private ERC1820_ACCEPT_MAGIC = keccak256(abi.encodePacked("ERC1820_ACCEPT_MAGIC"));
bytes32 constant private _ERC1820_ACCEPT_MAGIC = keccak256(abi.encodePacked("ERC1820_ACCEPT_MAGIC"));
mapping(bytes32 => mapping(address => bool)) private _supportedInterfaces;
/**
* See {IERC1820Implementer-canImplementInterfaceForAddress}.
*/
function canImplementInterfaceForAddress(bytes32 interfaceHash, address account) external view override returns (bytes32) {
return _supportedInterfaces[interfaceHash][account] ? ERC1820_ACCEPT_MAGIC : bytes32(0x00);
function canImplementInterfaceForAddress(bytes32 interfaceHash, address account) public view override returns (bytes32) {
return _supportedInterfaces[interfaceHash][account] ? _ERC1820_ACCEPT_MAGIC : bytes32(0x00);
}
/**

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
@ -38,7 +40,7 @@ interface IERC1820Registry {
function getManager(address account) external view returns (address);
/**
* @dev Sets the `implementer` contract as `account`'s implementer for
* @dev Sets the `implementer` contract as ``account``'s implementer for
* `interfaceHash`.
*
* `account` being the zero address is an alias for the caller's address.

View File

@ -1,5 +0,0 @@
= Lifecycle
== Pausable
{{Pausable}}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**

View File

@ -6,4 +6,6 @@ These are math-related utilities.
{{SafeMath}}
{{SignedSafeMath}}
{{Math}}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
@ -51,8 +53,6 @@ library SafeMath {
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
@ -109,8 +109,6 @@ library SafeMath {
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
@ -146,8 +144,6 @@ library SafeMath {
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
@ -5,7 +7,7 @@ pragma solidity ^0.6.0;
* @dev Signed math operations with safety checks that revert on error.
*/
library SignedSafeMath {
int256 constant private INT256_MIN = -2**255;
int256 constant private _INT256_MIN = -2**255;
/**
* @dev Multiplies two signed integers, reverts on overflow.
@ -18,7 +20,7 @@ library SignedSafeMath {
return 0;
}
require(!(a == -1 && b == INT256_MIN), "SignedSafeMath: multiplication overflow");
require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");
int256 c = a * b;
require(c / a == b, "SignedSafeMath: multiplication overflow");
@ -31,7 +33,7 @@ library SignedSafeMath {
*/
function div(int256 a, int256 b) internal pure returns (int256) {
require(b != 0, "SignedSafeMath: division by zero");
require(!(b == -1 && a == INT256_MIN), "SignedSafeMath: division overflow");
require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");
int256 c = a / b;

View File

@ -0,0 +1,15 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../access/AccessControl.sol";
contract AccessControlMock is AccessControl {
constructor() public {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
}
function setRoleAdmin(bytes32 roleId, bytes32 adminRoleId) public {
_setRoleAdmin(roleId, adminRoleId);
}
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../utils/Address.sol";
@ -7,10 +9,6 @@ contract AddressImpl {
return Address.isContract(account);
}
function toPayable(address account) external pure returns (address payable) {
return Address.toPayable(account);
}
function sendValue(address payable receiver, uint256 amount) external {
Address.sendValue(receiver, amount);
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../utils/Arrays.sol";
@ -5,13 +7,13 @@ import "../utils/Arrays.sol";
contract ArraysImpl {
using Arrays for uint256[];
uint256[] private array;
uint256[] private _array;
constructor (uint256[] memory _array) public {
array = _array;
constructor (uint256[] memory array) public {
_array = array;
}
function findUpperBound(uint256 _element) external view returns (uint256) {
return array.findUpperBound(_element);
function findUpperBound(uint256 element) external view returns (uint256) {
return _array.findUpperBound(element);
}
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../payment/escrow/ConditionalEscrow.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../GSN/Context.sol";

View File

@ -1,6 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../drafts/Counters.sol";
import "../utils/Counters.sol";
contract CountersImpl {
using Counters for Counters.Counter;

View File

@ -1,27 +1,27 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../utils/Create2.sol";
import "../token/ERC20/ERC20.sol";
import "../introspection/ERC1820Implementer.sol";
contract Create2Impl {
function deploy(bytes32 salt, bytes memory code) public {
Create2.deploy(salt, code);
function deploy(uint256 value, bytes32 salt, bytes memory code) public {
Create2.deploy(value, salt, code);
}
function deployERC20(bytes32 salt) public {
function deployERC1820Implementer(uint256 value, bytes32 salt) public {
// solhint-disable-next-line indent
Create2.deploy(salt, type(ERC20).creationCode);
Create2.deploy(value, salt, type(ERC1820Implementer).creationCode);
}
function computeAddress(bytes32 salt, bytes memory code) public view returns (address) {
return Create2.computeAddress(salt, code);
function computeAddress(bytes32 salt, bytes32 codeHash) public view returns (address) {
return Create2.computeAddress(salt, codeHash);
}
function computeAddress(bytes32 salt, bytes memory code, address deployer) public pure returns (address) {
return Create2.computeAddress(salt, code, deployer);
}
function computeAddress(bytes32 salt, bytes32 codeHash, address deployer) public pure returns (address) {
function computeAddressWithDeployer(bytes32 salt, bytes32 codeHash, address deployer) public pure returns (address) {
return Create2.computeAddress(salt, codeHash, deployer);
}
receive() payable external {}
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../cryptography/ECDSA.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../../introspection/IERC165.sol";
@ -34,7 +36,7 @@ contract SupportsInterfaceWithLookupMock is IERC165 {
/**
* @dev Implement supportsInterface(bytes4) using a lookup table.
*/
function supportsInterface(bytes4 interfaceId) external view override returns (bool) {
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
return _supportedInterfaces[interfaceId];
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract ERC165NotSupported { }

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../introspection/ERC165Checker.sol";
@ -6,14 +8,14 @@ contract ERC165CheckerMock {
using ERC165Checker for address;
function supportsERC165(address account) public view returns (bool) {
return account._supportsERC165();
return account.supportsERC165();
}
function supportsInterface(address account, bytes4 interfaceId) public view returns (bool) {
return account._supportsInterface(interfaceId);
return account.supportsInterface(interfaceId);
}
function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) public view returns (bool) {
return account._supportsAllInterfaces(interfaceIds);
return account.supportsAllInterfaces(interfaceIds);
}
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../introspection/ERC165.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../introspection/ERC1820Implementer.sol";

View File

@ -1,9 +1,16 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../token/ERC20/ERC20Burnable.sol";
contract ERC20BurnableMock is ERC20Burnable {
constructor (address initialAccount, uint256 initialBalance) public {
constructor (
string memory name,
string memory symbol,
address initialAccount,
uint256 initialBalance
) public ERC20(name, symbol) {
_mint(initialAccount, initialBalance);
}
}

View File

@ -1,9 +1,13 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../token/ERC20/ERC20Capped.sol";
contract ERC20CappedMock is ERC20Capped {
constructor (uint256 cap) public ERC20Capped(cap) { }
constructor (string memory name, string memory symbol, uint256 cap)
public ERC20(name, symbol) ERC20Capped(cap)
{ }
function mint(address to, uint256 tokenId) public {
_mint(to, tokenId);

View File

@ -0,0 +1,11 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../token/ERC20/ERC20.sol";
contract ERC20DecimalsMock is ERC20 {
constructor (string memory name, string memory symbol, uint8 decimals) public ERC20(name, symbol) {
_setupDecimals(decimals);
}
}

View File

@ -1,13 +0,0 @@
pragma solidity ^0.6.0;
import "../token/ERC20/ERC20.sol";
import "../token/ERC20/ERC20Detailed.sol";
contract ERC20DetailedMock is ERC20, ERC20Detailed {
constructor (string memory name, string memory symbol, uint8 decimals)
public
ERC20Detailed(name, symbol, decimals)
{
}
}

View File

@ -1,12 +0,0 @@
pragma solidity ^0.6.0;
import "../token/ERC20/ERC20.sol";
import "../drafts/ERC1046/ERC20Metadata.sol";
contract ERC20MetadataMock is ERC20, ERC20Metadata {
constructor (string memory tokenURI) public ERC20Metadata(tokenURI) { }
function setTokenURI(string memory tokenURI) public {
_setTokenURI(tokenURI);
}
}

View File

@ -1,10 +1,17 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../token/ERC20/ERC20.sol";
// mock class using ERC20
contract ERC20Mock is ERC20 {
constructor (address initialAccount, uint256 initialBalance) public {
constructor (
string memory name,
string memory symbol,
address initialAccount,
uint256 initialBalance
) public payable ERC20(name, symbol) {
_mint(initialAccount, initialBalance);
}
@ -16,10 +23,6 @@ contract ERC20Mock is ERC20 {
_burn(account, amount);
}
function burnFrom(address account, uint256 amount) public {
_burnFrom(account, amount);
}
function transferInternal(address from, address to, uint256 value) public {
_transfer(from, to, value);
}

View File

@ -1,10 +1,17 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../token/ERC20/ERC20Pausable.sol";
// mock class using ERC20Pausable
contract ERC20PausableMock is ERC20Pausable {
constructor (address initialAccount, uint256 initialBalance) public {
constructor (
string memory name,
string memory symbol,
address initialAccount,
uint256 initialBalance
) public ERC20(name, symbol) {
_mint(initialAccount, initialBalance);
}
@ -15,4 +22,12 @@ contract ERC20PausableMock is ERC20Pausable {
function unpause() external {
_unpause();
}
function mint(address to, uint256 amount) public {
_mint(to, amount);
}
function burn(address from, uint256 amount) public {
_burn(from, amount);
}
}

View File

@ -1,13 +1,24 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../drafts/ERC20Snapshot.sol";
import "../token/ERC20/ERC20Snapshot.sol";
contract ERC20SnapshotMock is ERC20Snapshot {
constructor(address initialAccount, uint256 initialBalance) public {
constructor(
string memory name,
string memory symbol,
address initialAccount,
uint256 initialBalance
) public ERC20(name, symbol) {
_mint(initialAccount, initialBalance);
}
function snapshot() public {
_snapshot();
}
function mint(address account, uint256 amount) public {
_mint(account, amount);
}

View File

@ -1,8 +1,12 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../token/ERC721/ERC721Burnable.sol";
contract ERC721BurnableMock is ERC721Burnable {
constructor(string memory name, string memory symbol) public ERC721(name, symbol) { }
function mint(address to, uint256 tokenId) public {
_mint(to, tokenId);
}

View File

@ -1,37 +0,0 @@
pragma solidity ^0.6.0;
import "../token/ERC721/ERC721Full.sol";
import "../token/ERC721/ERC721Burnable.sol";
/**
* @title ERC721FullMock
* This mock just provides public functions for setting metadata URI, getting all tokens of an owner,
* checking token existence, removal of a token from an address
*/
contract ERC721FullMock is ERC721Full, ERC721Burnable {
constructor (string memory name, string memory symbol) public ERC721Full(name, symbol) { }
function exists(uint256 tokenId) public view returns (bool) {
return _exists(tokenId);
}
function tokensOfOwner(address owner) public view returns (uint256[] memory) {
return _tokensOfOwner(owner);
}
function setTokenURI(uint256 tokenId, string memory uri) public {
_setTokenURI(tokenId, uri);
}
function setBaseURI(string memory baseURI) public {
_setBaseURI(baseURI);
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Full) {
super._beforeTokenTransfer(from, to, tokenId);
}
function mint(address to, uint256 tokenId) public {
_mint(to, tokenId);
}
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../token/ERC721/ERC721.sol";
@ -9,7 +11,11 @@ import "../GSN/GSNRecipientSignature.sol";
* A simple ERC721 mock that has GSN support enabled
*/
contract ERC721GSNRecipientMock is ERC721, GSNRecipient, GSNRecipientSignature {
constructor(address trustedSigner) public GSNRecipientSignature(trustedSigner) { }
constructor(string memory name, string memory symbol, address trustedSigner)
public
ERC721(name, symbol)
GSNRecipientSignature(trustedSigner)
{ }
function mint(uint256 tokenId) public {
_mint(_msgSender(), tokenId);

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../token/ERC721/ERC721.sol";
@ -7,6 +9,24 @@ import "../token/ERC721/ERC721.sol";
* This mock just provides a public safeMint, mint, and burn functions for testing purposes
*/
contract ERC721Mock is ERC721 {
constructor (string memory name, string memory symbol) public ERC721(name, symbol) { }
function exists(uint256 tokenId) public view returns (bool) {
return _exists(tokenId);
}
function setTokenURI(uint256 tokenId, string memory uri) public {
_setTokenURI(tokenId, uri);
}
function setBaseURI(string memory baseURI) public {
_setBaseURI(baseURI);
}
function mint(address to, uint256 tokenId) public {
_mint(to, tokenId);
}
function safeMint(address to, uint256 tokenId) public {
_safeMint(to, tokenId);
}
@ -15,14 +35,6 @@ contract ERC721Mock is ERC721 {
_safeMint(to, tokenId, _data);
}
function mint(address to, uint256 tokenId) public {
_mint(to, tokenId);
}
function burn(address owner, uint256 tokenId) public {
_burn(owner, tokenId);
}
function burn(uint256 tokenId) public {
_burn(tokenId);
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../token/ERC721/ERC721Pausable.sol";
@ -7,6 +9,8 @@ import "../token/ERC721/ERC721Pausable.sol";
* This mock just provides a public mint, burn and exists functions for testing purposes
*/
contract ERC721PausableMock is ERC721Pausable {
constructor (string memory name, string memory symbol) public ERC721(name, symbol) { }
function mint(address to, uint256 tokenId) public {
super._mint(to, tokenId);
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../token/ERC721/IERC721Receiver.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../GSN/Context.sol";
@ -11,16 +13,19 @@ contract ERC777Mock is Context, ERC777 {
string memory symbol,
address[] memory defaultOperators
) public ERC777(name, symbol, defaultOperators) {
_mint(_msgSender(), initialHolder, initialBalance, "", "");
_mint(initialHolder, initialBalance, "", "");
}
function mintInternal (
address operator,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData
) public {
_mint(operator, to, amount, userData, operatorData);
_mint(to, amount, userData, operatorData);
}
function approveInternal(address holder, address spender, uint256 value) public {
_approve(holder, spender, value);
}
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../GSN/Context.sol";
@ -37,8 +39,8 @@ contract ERC777SenderRecipientMock is Context, IERC777Sender, IERC777Recipient,
IERC1820Registry private _erc1820 = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);
bytes32 constant private TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");
bytes32 constant private TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");
bytes32 constant private _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");
bytes32 constant private _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");
function tokensToSend(
address operator,
@ -103,7 +105,7 @@ contract ERC777SenderRecipientMock is Context, IERC777Sender, IERC777Recipient,
}
function senderFor(address account) public {
_registerInterfaceForAddress(TOKENS_SENDER_INTERFACE_HASH, account);
_registerInterfaceForAddress(_TOKENS_SENDER_INTERFACE_HASH, account);
address self = address(this);
if (account == self) {
@ -112,11 +114,11 @@ contract ERC777SenderRecipientMock is Context, IERC777Sender, IERC777Recipient,
}
function registerSender(address sender) public {
_erc1820.setInterfaceImplementer(address(this), TOKENS_SENDER_INTERFACE_HASH, sender);
_erc1820.setInterfaceImplementer(address(this), _TOKENS_SENDER_INTERFACE_HASH, sender);
}
function recipientFor(address account) public {
_registerInterfaceForAddress(TOKENS_RECIPIENT_INTERFACE_HASH, account);
_registerInterfaceForAddress(_TOKENS_RECIPIENT_INTERFACE_HASH, account);
address self = address(this);
if (account == self) {
@ -125,7 +127,7 @@ contract ERC777SenderRecipientMock is Context, IERC777Sender, IERC777Recipient,
}
function registerRecipient(address recipient) public {
_erc1820.setInterfaceImplementer(address(this), TOKENS_RECIPIENT_INTERFACE_HASH, recipient);
_erc1820.setInterfaceImplementer(address(this), _TOKENS_RECIPIENT_INTERFACE_HASH, recipient);
}
function setShouldRevertSend(bool shouldRevert) public {

View File

@ -0,0 +1,40 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../utils/EnumerableMap.sol";
contract EnumerableMapMock {
using EnumerableMap for EnumerableMap.UintToAddressMap;
event OperationResult(bool result);
EnumerableMap.UintToAddressMap private _map;
function contains(uint256 key) public view returns (bool) {
return _map.contains(key);
}
function set(uint256 key, address value) public {
bool result = _map.set(key, value);
emit OperationResult(result);
}
function remove(uint256 key) public {
bool result = _map.remove(key);
emit OperationResult(result);
}
function length() public view returns (uint256) {
return _map.length();
}
function at(uint256 index) public view returns (uint256 key, address value) {
return _map.at(index);
}
function get(uint256 key) public view returns (address) {
return _map.get(key);
}
}

View File

@ -1,37 +1,35 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../utils/EnumerableSet.sol";
contract EnumerableSetMock{
contract EnumerableSetMock {
using EnumerableSet for EnumerableSet.AddressSet;
event TransactionResult(bool result);
event OperationResult(bool result);
EnumerableSet.AddressSet private set;
EnumerableSet.AddressSet private _set;
function contains(address value) public view returns (bool) {
return set.contains(value);
return _set.contains(value);
}
function add(address value) public {
bool result = set.add(value);
emit TransactionResult(result);
bool result = _set.add(value);
emit OperationResult(result);
}
function remove(address value) public {
bool result = set.remove(value);
emit TransactionResult(result);
}
function enumerate() public view returns (address[] memory) {
return set.enumerate();
bool result = _set.remove(value);
emit OperationResult(result);
}
function length() public view returns (uint256) {
return set.length();
return _set.length();
}
function get(uint256 index) public view returns (address) {
return set.get(index);
function at(uint256 index) public view returns (address) {
return _set.at(index);
}
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract EtherReceiverMock {

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../GSN/GSNRecipient.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./ContextMock.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../GSN/GSNRecipient.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../math/Math.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import { MerkleProof } from "../cryptography/MerkleProof.sol";

View File

@ -1,15 +0,0 @@
pragma solidity ^0.6.0;
import "../ownership/Ownable.sol";
/**
* @title Ownable interface id calculator.
* @dev See the EIP165 specification for more information:
* https://eips.ethereum.org/EIPS/eip-165#specification
*/
contract OwnableInterfaceId {
function getInterfaceId() public pure returns (bytes4) {
Ownable i;
return i.owner.selector ^ i.isOwner.selector ^ i.renounceOwnership.selector ^ i.transferOwnership.selector;
}
}

View File

@ -1,5 +1,7 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../ownership/Ownable.sol";
import "../access/Ownable.sol";
contract OwnableMock is Ownable { }

View File

@ -1,6 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../lifecycle/Pausable.sol";
import "../utils/Pausable.sol";
contract PausableMock is Pausable {
bool public drasticMeasureTaken;

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../payment/PullPayment.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../GSN/Context.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../utils/ReentrancyGuard.sol";
@ -11,19 +13,19 @@ contract ReentrancyMock is ReentrancyGuard {
}
function callback() external nonReentrant {
count();
_count();
}
function countLocalRecursive(uint256 n) public nonReentrant {
if (n > 0) {
count();
_count();
countLocalRecursive(n - 1);
}
}
function countThisRecursive(uint256 n) public nonReentrant {
if (n > 0) {
count();
_count();
// solhint-disable-next-line avoid-low-level-calls
(bool success,) = address(this).call(abi.encodeWithSignature("countThisRecursive(uint256)", n - 1));
require(success, "ReentrancyMock: failed call");
@ -31,12 +33,12 @@ contract ReentrancyMock is ReentrancyGuard {
}
function countAndCall(ReentrancyAttack attacker) public nonReentrant {
count();
_count();
bytes4 func = bytes4(keccak256("callback()"));
attacker.callSender(func);
}
function count() private {
function _count() private {
counter += 1;
}
}

View File

@ -1,21 +0,0 @@
pragma solidity ^0.6.0;
import "../access/Roles.sol";
contract RolesMock {
using Roles for Roles.Role;
Roles.Role private dummyRole;
function add(address account) public {
dummyRole.add(account);
}
function remove(address account) public {
dummyRole.remove(account);
}
function has(address account) public view returns (bool) {
return dummyRole.has(account);
}
}

View File

@ -1,9 +1,20 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../utils/SafeCast.sol";
contract SafeCastMock {
using SafeCast for uint;
using SafeCast for int;
function toUint256(int a) public pure returns (uint256) {
return a.toUint256();
}
function toInt256(uint a) public pure returns (int256) {
return a.toInt256();
}
function toUint128(uint a) public pure returns (uint128) {
return a.toUint128();

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../GSN/Context.sol";

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../math/SafeMath.sol";

View File

@ -1,7 +0,0 @@
pragma solidity ^0.6.0;
import "../ownership/Secondary.sol";
contract SecondaryMock is Secondary {
function onlyPrimaryMock() public view onlyPrimary { }
}

View File

@ -1,6 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../drafts/SignedSafeMath.sol";
import "../math/SignedSafeMath.sol";
contract SignedSafeMathMock {
function mul(int256 a, int256 b) public pure returns (int256) {

View File

@ -1,9 +1,11 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../drafts/Strings.sol";
import "../utils/Strings.sol";
contract StringsMock {
function fromUint256(uint256 value) public pure returns (string memory) {
return Strings.fromUint256(value);
return Strings.toString(value);
}
}

View File

@ -1,11 +0,0 @@
= Ownership
Contract modules for simple authorization and access control mechanisms.
TIP: For more complex needs see xref:access.adoc[Access].
== Contracts
{{Ownable}}
{{Secondary}}

View File

@ -1,50 +0,0 @@
pragma solidity ^0.6.0;
import "../GSN/Context.sol";
/**
* @dev A Secondary contract can only be used by its primary account (the one that created it).
*/
contract Secondary is Context {
address private _primary;
/**
* @dev Emitted when the primary contract changes.
*/
event PrimaryTransferred(
address recipient
);
/**
* @dev Sets the primary account to the one that is creating the Secondary contract.
*/
constructor () internal {
address msgSender = _msgSender();
_primary = msgSender;
emit PrimaryTransferred(msgSender);
}
/**
* @dev Reverts if called from any account other than the primary.
*/
modifier onlyPrimary() {
require(_msgSender() == _primary, "Secondary: caller is not the primary account");
_;
}
/**
* @return the address of the primary.
*/
function primary() public view returns (address) {
return _primary;
}
/**
* @dev Transfers contract to a new primary.
* @param recipient The address of new primary.
*/
function transferPrimary(address recipient) public virtual onlyPrimary {
require(recipient != address(0), "Secondary: new primary is the zero address");
_primary = recipient;
emit PrimaryTransferred(recipient);
}
}

View File

@ -1,6 +1,6 @@
{
"name": "@openzeppelin/contracts",
"version": "2.5.0",
"version": "3.0.2",
"description": "Secure Smart Contract library for Solidity",
"files": [
"**/*.sol",
@ -9,7 +9,8 @@
"!/examples"
],
"scripts": {
"prepare": "bash ../scripts/prepare-contracts-package.sh"
"prepare": "bash ../scripts/prepare-contracts-package.sh",
"prepare-docs": "cd ..; npm run prepare-docs"
},
"repository": {
"type": "git",

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../GSN/Context.sol";

View File

@ -1,4 +1,6 @@
pragma solidity ^0.6.0;
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;
import "./escrow/Escrow.sol";
@ -28,17 +30,16 @@ contract PullPayment {
}
/**
* @dev Withdraw accumulated payments.
* @dev Withdraw accumulated payments, forwarding all gas to the recipient.
*
* Note that _any_ account can call this function, not just the `payee`.
* This means that contracts unaware of the `PullPayment` protocol can still
* receive funds this way, by having a separate account call
* {withdrawPayments}.
*
* NOTE: This function has been deprecated, use {withdrawPaymentsWithGas}
* instead. Calling contracts with fixed gas limits is an anti-pattern and
* may break contract interactions in network upgrades (hardforks).
* https://diligence.consensys.net/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more.]
* WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
* Make sure you trust the recipient, or are either following the
* checks-effects-interactions pattern or using {ReentrancyGuard}.
*
* @param payee Whose payments will be withdrawn.
*/
@ -46,19 +47,6 @@ contract PullPayment {
_escrow.withdraw(payee);
}
/**
* @dev Same as {withdrawPayments}, but forwarding all gas to the recipient.
*
* WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
* Make sure you trust the recipient, or are either following the
* checks-effects-interactions pattern or using {ReentrancyGuard}.
*
* _Available since v2.4.0._
*/
function withdrawPaymentsWithGas(address payable payee) external virtual {
_escrow.withdrawWithGas(payee);
}
/**
* @dev Returns the payments owed to an address.
* @param dest The creditor's address.
@ -76,6 +64,6 @@ contract PullPayment {
* @param amount The amount to transfer.
*/
function _asyncTransfer(address dest, uint256 amount) internal virtual {
_escrow.deposit.value(amount)(dest);
_escrow.deposit{ value: amount }(dest);
}
}

View File

@ -1,6 +1,8 @@
= Payment
NOTE: This page is incomplete. We're working to improve it for the next release. Stay tuned!
Utilities related to sending and receiving payments. Examples are {PullPayment}, which implements the best security practices when sending funds to third parties, and {PaymentSplitter} to receive incoming payments among a number of beneficiaries.
TIP: When transferring funds to and from untrusted third parties, there is always a security risk of reentrancy. If you would like to learn more about this and ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
== Utilities

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./Escrow.sol";

View File

@ -1,7 +1,9 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../../math/SafeMath.sol";
import "../../ownership/Secondary.sol";
import "../../access/Ownable.sol";
import "../../utils/Address.sol";
/**
@ -14,10 +16,10 @@ import "../../utils/Address.sol";
* it. That way, it is guaranteed that all Ether will be handled according to
* the `Escrow` rules, and there is no need to check for payable functions or
* transfers in the inheritance tree. The contract that uses the escrow as its
* payment method should be its primary, and provide public methods redirecting
* payment method should be its owner, and provide public methods redirecting
* to the escrow's deposit and withdraw.
*/
contract Escrow is Secondary {
contract Escrow is Ownable {
using SafeMath for uint256;
using Address for address payable;
@ -34,7 +36,7 @@ contract Escrow is Secondary {
* @dev Stores the sent amount as credit to be withdrawn.
* @param payee The destination address of the funds.
*/
function deposit(address payee) public virtual payable onlyPrimary {
function deposit(address payee) public virtual payable onlyOwner {
uint256 amount = msg.value;
_deposits[payee] = _deposits[payee].add(amount);
@ -42,36 +44,16 @@ contract Escrow is Secondary {
}
/**
* @dev Withdraw accumulated balance for a payee, forwarding 2300 gas (a
* Solidity `transfer`).
*
* NOTE: This function has been deprecated, use {withdrawWithGas} instead.
* Calling contracts with fixed-gas limits is an anti-pattern and may break
* contract interactions in network upgrades (hardforks).
* https://diligence.consensys.net/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more.]
*
* @param payee The address whose funds will be withdrawn and transferred to.
*/
function withdraw(address payable payee) public virtual onlyPrimary {
uint256 payment = _deposits[payee];
_deposits[payee] = 0;
payee.transfer(payment);
emit Withdrawn(payee, payment);
}
/**
* @dev Same as {withdraw}, but forwarding all gas to the recipient.
* @dev Withdraw accumulated balance for a payee, forwarding all gas to the
* recipient.
*
* WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
* Make sure you trust the recipient, or are either following the
* checks-effects-interactions pattern or using {ReentrancyGuard}.
*
* _Available since v2.4.0._
* @param payee The address whose funds will be withdrawn and transferred to.
*/
function withdrawWithGas(address payable payee) public virtual onlyPrimary {
function withdraw(address payable payee) public virtual onlyOwner {
uint256 payment = _deposits[payee];
_deposits[payee] = 0;

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./ConditionalEscrow.sol";
@ -7,11 +9,10 @@ import "./ConditionalEscrow.sol";
* @dev Escrow that holds funds for a beneficiary, deposited from multiple
* parties.
* @dev Intended usage: See {Escrow}. Same usage guidelines apply here.
* @dev The primary account (that is, the contract that instantiates this
* @dev The owner account (that is, the contract that instantiates this
* contract) may deposit, close the deposit period, and allow for either
* withdrawal by the beneficiary, or refunds to the depositors. All interactions
* with `RefundEscrow` will be made through the primary contract. See the
* `RefundableCrowdsale` contract for an example of `RefundEscrow`s use.
* with `RefundEscrow` will be made through the owner contract.
*/
contract RefundEscrow is ConditionalEscrow {
enum State { Active, Refunding, Closed }
@ -59,7 +60,7 @@ contract RefundEscrow is ConditionalEscrow {
* @dev Allows for the beneficiary to withdraw their funds, rejecting
* further deposits.
*/
function close() public onlyPrimary virtual {
function close() public onlyOwner virtual {
require(_state == State.Active, "RefundEscrow: can only close while active");
_state = State.Closed;
emit RefundsClosed();
@ -68,7 +69,7 @@ contract RefundEscrow is ConditionalEscrow {
/**
* @dev Allows for refunds to take place, rejecting further deposits.
*/
function enableRefunds() public onlyPrimary virtual {
function enableRefunds() public onlyOwner virtual {
require(_state == State.Active, "RefundEscrow: can only enable refunds while active");
_state = State.Refunding;
emit RefundsEnabled();

View File

@ -0,0 +1,87 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../access/AccessControl.sol";
import "../GSN/Context.sol";
import "../token/ERC20/ERC20.sol";
import "../token/ERC20/ERC20Burnable.sol";
import "../token/ERC20/ERC20Pausable.sol";
/**
* @dev {ERC20} token, including:
*
* - ability for holders to burn (destroy) their tokens
* - a minter role that allows for token minting (creation)
* - a pauser role that allows to stop all token transfers
*
* This contract uses {AccessControl} to lock permissioned functions using the
* different roles - head to its documentation for details.
*
* The account that deploys the contract will be granted the minter and pauser
* roles, as well as the default admin role, which will let it grant both minter
* and pauser roles to aother accounts
*/
contract ERC20PresetMinterPauser is Context, AccessControl, ERC20Burnable, ERC20Pausable {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
/**
* @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
* account that deploys the contract.
*
* See {ERC20-constructor}.
*/
constructor(string memory name, string memory symbol) public ERC20(name, symbol) {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender());
_setupRole(PAUSER_ROLE, _msgSender());
}
/**
* @dev Creates `amount` new tokens for `to`.
*
* See {ERC20-_mint}.
*
* Requirements:
*
* - the caller must have the `MINTER_ROLE`.
*/
function mint(address to, uint256 amount) public {
require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint");
_mint(to, amount);
}
/**
* @dev Pauses all token transfers.
*
* See {ERC20Pausable} and {Pausable-_pause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function pause() public {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause");
_pause();
}
/**
* @dev Unpauses all token transfers.
*
* See {ERC20Pausable} and {Pausable-_unpause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function unpause() public {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause");
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Pausable) {
super._beforeTokenTransfer(from, to, amount);
}
}

View File

@ -0,0 +1,102 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../access/AccessControl.sol";
import "../GSN/Context.sol";
import "../utils/Counters.sol";
import "../token/ERC721/ERC721.sol";
import "../token/ERC721/ERC721Burnable.sol";
import "../token/ERC721/ERC721Pausable.sol";
/**
* @dev {ERC721} token, including:
*
* - ability for holders to burn (destroy) their tokens
* - a minter role that allows for token minting (creation)
* - a pauser role that allows to stop all token transfers
* - token ID and URI autogeneration
*
* This contract uses {AccessControl} to lock permissioned functions using the
* different roles - head to its documentation for details.
*
* The account that deploys the contract will be granted the minter and pauser
* roles, as well as the default admin role, which will let it grant both minter
* and pauser roles to aother accounts
*/
contract ERC721PresetMinterPauserAutoId is Context, AccessControl, ERC721Burnable, ERC721Pausable {
using Counters for Counters.Counter;
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
Counters.Counter private _tokenIdTracker;
/**
* @dev Grants `DEFAULT_ADMIN_ROLE` and `MINTER_ROLE` to the account that
* deploys the contract.
*
* Token URIs will be autogenerated based on `baseURI` and their token IDs.
* See {ERC721-tokenURI}.
*/
constructor(string memory name, string memory symbol, string memory baseURI) public ERC721(name, symbol) {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender());
_setupRole(PAUSER_ROLE, _msgSender());
_setBaseURI(baseURI);
}
/**
* @dev Creates a new token for `to`. Its token ID will be automatically
* assigned (and available on the emitted {IERC721-Transfer} event), and the token
* URI autogenerated based on the base URI passed at construction.
*
* See {ERC721-_mint}.
*
* Requirements:
*
* - the caller must have the `MINTER_ROLE`.
*/
function mint(address to) public {
require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint");
// We can just use balanceOf to create the new tokenId because tokens
// can be burned (destroyed), so we need a separate counter.
_mint(to, _tokenIdTracker.current());
_tokenIdTracker.increment();
}
/**
* @dev Pauses all token transfers.
*
* See {ERC721Pausable} and {Pausable-_pause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function pause() public {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause");
_pause();
}
/**
* @dev Unpauses all token transfers.
*
* See {ERC721Pausable} and {Pausable-_unpause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function unpause() public {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause");
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Pausable) {
super._beforeTokenTransfer(from, to, tokenId);
}
}

View File

@ -0,0 +1,13 @@
= Presets
These contracts integrate different Ethereum standards (ERCs) with custom extensions and modules, showcasing common configurations that are ready to deploy **without having to write any Solidity code**.
They can be used as-is for quick prototyping and testing, but are **also suitable for production environments**.
TIP: Intermediate and advanced users can use these as starting points when writing their own contracts, extending them with custom functionality as they see fit.
== Tokens
{{ERC20PresetMinterPauser}}
{{ERC721PresetMinterPauserAutoId}}

View File

@ -1,15 +1,18 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../../GSN/Context.sol";
import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20Mintable}.
* For a generic mechanism see {ERC20MinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
@ -30,6 +33,7 @@ import "../../math/SafeMath.sol";
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) private _balances;
@ -37,6 +41,57 @@ contract ERC20 is Context, IERC20 {
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name, string memory symbol) public {
_name = name;
_symbol = symbol;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
@ -92,7 +147,7 @@ contract ERC20 is Context, IERC20 {
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for `sender`'s tokens of at least
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
@ -224,14 +279,14 @@ contract ERC20 is Context, IERC20 {
}
/**
* @dev Destroys `amount` tokens from `account`.`amount` is then deducted
* from the caller's allowance.
* @dev Sets {decimals} to a value other than the default one of 18.
*
* See {_burn} and {_approve}.
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _burnFrom(address account, uint256 amount) internal virtual {
_burn(account, amount);
_approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
@ -240,13 +295,13 @@ contract ERC20 is Context, IERC20 {
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of `from`'s tokens
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of `from`'s tokens will be burned.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:using-hooks.adoc[Using Hooks].
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../../GSN/Context.sol";
@ -8,7 +10,7 @@ import "./ERC20.sol";
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
contract ERC20Burnable is Context, ERC20 {
abstract contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys `amount` tokens from the caller.
*
@ -19,9 +21,20 @@ contract ERC20Burnable is Context, ERC20 {
}
/**
* @dev See {ERC20-_burnFrom}.
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
_burnFrom(account, amount);
uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");
_approve(account, _msgSender(), decreasedAllowance);
_burn(account, amount);
}
}

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./ERC20.sol";
@ -5,7 +7,7 @@ import "./ERC20.sol";
/**
* @dev Extension of {ERC20} that adds a cap to the supply of tokens.
*/
contract ERC20Capped is ERC20 {
abstract contract ERC20Capped is ERC20 {
uint256 private _cap;
/**

View File

@ -1,54 +0,0 @@
pragma solidity ^0.6.0;
import "./IERC20.sol";
/**
* @dev Optional functions from the ERC20 standard.
*/
abstract contract ERC20Detailed is IERC20 {
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
* these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name, string memory symbol, uint8 decimals) public {
_name = name;
_symbol = symbol;
_decimals = decimals;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
}

Some files were not shown because too many files have changed in this diff Show More