Compare commits

..

215 Commits

Author SHA1 Message Date
4070719ff5 v2.2.2 2019-08-12 23:59:30 +02:00
169cac718a remove unused version script 2019-08-12 23:23:22 +02:00
9c4840a479 GSN support (#59)
* GSN support

Add base Context contract

Add GSNContext and tests

Add RelayHub deployment to tests

Add RelayProvider integration, complete GSNContext tests

Switch dependency to openzeppelin-gsn-provider

Add default txfee to provider

Add basic signing recipient

Sign more values

Add comment clarifying RelayHub's msg.data

Make context constructors internal

Rename SigningRecipient to GSNRecipientSignedData

Add ERC20Charge recipients

Harcode RelayHub address into GSNContext

Fix Solidity linter errors

Run server from binary, use gsn-helpers to fund it

Migrate to published @openzeppelin/gsn-helpers

Silence false-positive compiler warning

Use GSN helper assertions

Rename meta-tx to gsn, take out of drafts

Merge ERC20 charge recipients into a single one

Rename GSNRecipients to Bouncers

Add GSNBouncerUtils to decouple the bouncers from GSNRecipient

Add _upgradeRelayHub

Store RelayHub address using unstructored storage

Add IRelayHub

Add _withdrawDeposits to GSNRecipient

Add relayHub version to recipient

Make _acceptRelayedCall and _declineRelayedCall easier to use

Rename GSNBouncerUtils to GSNBouncerBase, make it IRelayRecipient

Improve GSNBouncerBase, make pre and post sender-protected and optional

Fix GSNBouncerERC20Fee, add tests

Add missing GSNBouncerSignature test

Override transferFrom in __unstable__ERC20PrimaryAdmin

Rhub address slot reduced by 1

Rename relay hub changed event

Use released gsn-provider

* move gsn to all caps

* update to gsn contracts in solidity/master

* Adapt for ethereum-package

* update gsn related packages

* update dependencies to match contracts repo

* remove mocha bail option

* add changelog entry

* add constructors to mocks

* use unstructured storage for bouncer implementations
2019-08-12 15:28:29 -03:00
516c120104 fix npm badge 2019-08-12 18:54:35 +02:00
fd9f404f96 update logo and badges 2019-08-12 18:53:15 +02:00
5b43fccc34 lint 2019-08-12 16:36:00 +02:00
1320dfb088 update ganache-cli dependencies 2019-08-12 16:30:14 +02:00
94d65429b7 bring over circleci migration 2019-08-12 16:30:04 +02:00
58bf37d506 Release 2.2.1 (#55)
* Release 2.2.1

* Use caret for peer dependency
2019-07-22 13:28:12 -03:00
7ac0502c50 Rename to @openzeppelin/contracts-ethereum-package (#54)
* Change import path from zos-lib to upgrades in all contracts

* Update readme with new naming

* Update package and deps names

* Change path to initializable in AST of networks.jsons

* Migrate manifest version

* Use new oz file locations

* Rename in ERC20Migrator comments

* Update SDK install instructions in README

* Update gitignore to use new session file name

* trigger CI

* Fixes to readme and package version

* Use 2.5.0 release of OpenZeppelin SDK
2019-07-20 13:37:41 -03:00
dee9a2b897 Update README.md 2019-07-19 18:46:02 -03:00
64cf73d646 Merge pull request #53 from abcoathup/patch-1
Documentation: update README links
2019-06-12 01:39:55 -03:00
c4ccdc182f Update README.md
Co-Authored-By: Nicolás Venturo <nicolas.venturo@gmail.com>
2019-06-12 10:52:47 +10:00
e592627578 Changed docs.openzeppelin.org versions to 2.3.0 2019-06-11 16:07:01 +10:00
24416fc208 Update README using referenced links 2019-06-11 16:02:50 +10:00
09dee513ed push to mainnet 2019-06-10 20:31:14 -03:00
906b18f144 add updated zos files except for mainnet deployment 2019-06-06 11:55:12 -03:00
eb6b5b6631 Bump handlebars from 4.0.12 to 4.1.2 (#51)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.0.12 to 4.1.2.
- [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.0.12...v4.1.2)

Signed-off-by: dependabot[bot] <support@github.com>
2019-06-05 20:27:04 -03:00
7d0c6280f3 Bump js-yaml from 3.6.1 to 3.13.1 (#50)
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.6.1 to 3.13.1.
- [Release notes](https://github.com/nodeca/js-yaml/releases)
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.6.1...3.13.1)
2019-06-05 17:14:06 -03:00
56b7d0713b update package-lock.json 2019-05-30 16:06:05 -03:00
a7d5c72fdc add gap to erc20snapshot 2019-05-30 16:03:15 -03:00
7050b73a89 fix use of msg.sender in example 2019-05-28 18:08:52 -03:00
2b9dc9ae87 Merge tag 'v2.2.0' of github.com:OpenZeppelin/openzeppelin-solidity
v2.2.0
2019-05-28 18:08:44 -03:00
f18fd17355 Merge pull request #48 from OpenZeppelin/docs/update-readme
Add more usage instructions to README
2019-02-13 12:22:16 -03:00
3dbf651b8e Add more usage instructions to README 2019-02-13 12:04:37 -03:00
6bf2ae8229 Merge pull request #46 from ZumZoom/linter
Fix identation and some linter warnings
2019-02-11 18:24:18 -03:00
644b121677 Merge branch 'master' into linter 2019-02-11 01:00:27 +03:00
453e3dd454 Merge pull request #39 from OpenZeppelin/fix/remove-ethpm
Remove ethpm.json
2019-02-06 12:34:52 -03:00
e8e6dd52a5 Remove ethpm.json
The package is not registered in ethpm at the moment. This file was an
artifact leftover from vanilla openzeppelin. This PR removes it, until
we decide to register openzeppelin-eth on ethpm.
2019-02-06 12:34:04 -03:00
105b927b62 Merge pull request #45 from ZumZoom/patch-2
Fix example in README.md
2019-02-06 12:31:11 -03:00
0b1e1810b1 Release v2.1.3 2019-01-29 02:15:39 -03:00
2eb0de4cd2 remove added sender argument 2019-01-28 19:31:03 -03:00
3fd5195573 remove StandardToken (unnecessary duplicate effort) 2019-01-28 19:31:03 -03:00
491fb5acd9 Merge pull request #44 from ZumZoom/patch-1
Remove initialize from ERC721Full
2019-01-28 19:07:46 -03:00
05c7d8c861 fix identation and some linter warnings 2019-01-28 22:04:50 +03:00
d032ca62e2 Fix example in README.md 2019-01-28 19:44:32 +03:00
b306c41525 Remove initialize from ERC721Full
Following d75ba162 ERC721 should not initialize their parents.
2019-01-28 19:39:29 +03:00
b39f3c2055 publish evm package to blockchains 2019-01-24 19:17:18 -03:00
4e026cd4c7 remove new gap 2019-01-24 17:49:30 -03:00
c08d63c118 rename PaymentSplitter in zos.json 2019-01-24 16:50:32 -03:00
e357592208 fix linter errors 2019-01-24 13:18:09 -03:00
f3635e1517 add missing gaps and Initializables 2019-01-23 19:38:00 -03:00
04186e2cf6 fix missing helper 2019-01-22 17:42:48 -03:00
cff2509c63 fix all tests for 2.1.2 2019-01-22 17:35:47 -03:00
dd433c41bb update package-lock.json 2019-01-21 20:07:10 -03:00
4952240620 Merge tag 'v2.1.2' of github.com:OpenZeppelin/openzeppelin-solidity into merge-v2.1
v2.1.2
2019-01-21 19:42:09 -03:00
00f7c19d02 fix remaining tests 2019-01-21 19:28:37 -03:00
5eafd1dec2 fix remaining tests in standalone contracts 2019-01-21 19:28:34 -03:00
f84278433d fix old helpers 2019-01-18 17:53:35 -03:00
73a34f96a7 fix roles initialization bug 2019-01-18 17:53:35 -03:00
877f07f0a9 fix all compilation errors 2019-01-18 17:14:53 -03:00
e808a64649 rename internal initializers 2019-01-18 16:38:26 -03:00
a221c17fb2 Merge tag 'v2.1.1' of github.com:OpenZeppelin/openzeppelin-solidity
v2.1.1
2019-01-18 15:33:51 -03:00
bce2d68e7f convert 2 spaces to 4 spaces 2019-01-17 18:02:50 -03:00
b047d28476 Bump to version 2.0.2 2018-10-22 14:54:57 +02:00
54268bfeed Move standalone ERC20 and ERC721 to token dir (#38) 2018-10-19 11:45:02 -06:00
0c05ce0eb1 Bump to v2.0.1 2018-10-18 20:40:38 +02:00
f28a4427a2 Add missing zos.json files 2018-10-18 20:34:50 +02:00
e5ba8666de Update readme 2018-10-18 20:12:09 +02:00
2fa3176399 Update to zOS 2.0.0 and version bump to 2.0.0 2018-10-18 20:05:48 +02:00
d1f2b19e6e Frozen all releases 2018-10-18 19:47:57 +02:00
a8a3e0be05 Deployed openzeppelin-eth to all networks 2018-10-18 19:28:56 +02:00
f38ff1bdbd Add publish flag to zos.json 2018-10-18 18:34:59 +02:00
34fdb0fe23 Fix split payment contract variable initialization (#37)
* Remove variables initialization on declaration for SplitPayment contracts
2018-10-18 18:20:05 +02:00
793de306cf Initialize zos project 2018-10-18 18:17:16 +02:00
0720923115 Add zos CLI as dev dependency and bump zos lib version 2018-10-18 18:17:16 +02:00
95666637b6 Add prepare script (#36) 2018-10-18 17:53:56 +02:00
0ae92d78eb Fix linter issues 2018-10-18 15:22:40 +02:00
5e69036bbc EVM Package examples (#32)
* Added StandardToken (on-chain lib)

* Added OnChainERC20 example.

* Added OnChainERC721

* Update OnChainERC721.test.js

* Renamed the contracts to Standalone*.

* Fix path to Initializable in StandardToken example
2018-10-18 15:03:34 +02:00
6395ddac2c Merge pull request #34 from nventuro/oz-eth
Updated package.json
2018-10-18 14:45:26 +02:00
a2a28b02e8 Updated package.json 2018-10-17 15:15:11 -03:00
84a37e1460 Merge pull request #33 from nventuro/erc721-init
ERC721 contracts no longer initialize their parents.
2018-10-15 14:32:28 -03:00
36043ecc3e Merge pull request #27 from nventuro/init-asserts
Added assertions to leaf initializers of (some) pseudo-abstract contr…
2018-10-15 14:32:20 -03:00
d75ba16223 ERC721 contracts no longer initialize their parents (but have some safety checks). 2018-10-15 13:41:51 -03:00
1961032592 Merge pull request #31 from nventuro/peer-dep
Added zos-lib as a peer dependency and used its Initializable.
2018-10-10 12:53:51 -03:00
fffa406aa4 Merge branch 'master' into peer-dep 2018-10-10 09:09:06 -03:00
488c3de389 Merge pull request #29 from nventuro/storage-slots
Added gaps at the end of the storage of each contract.
2018-10-10 09:07:29 -03:00
45747144ff Trying to get the Travis build to pass. 2018-10-09 19:05:39 -03:00
bc7ba69f9b Removed Initializable, now using zos-lib's. 2018-10-09 17:56:56 -03:00
423c6523ba Added zos-lib peer dependency. 2018-10-09 17:56:40 -03:00
ecd6c57faa Added internal check methods. 2018-10-09 17:21:53 -03:00
19de09afe1 Merge branch 'master' into storage-slots 2018-10-09 16:30:52 -03:00
932a39f5fd Added gaps at the end of the storage of each contract. 2018-10-08 14:42:02 -03:00
6956b935b3 Merge pull request #28 from nventuro/accidental-death
Removed BreakInvariantBounty.
2018-10-08 13:38:34 -03:00
7bdefbeb9a Removed BreakInvariantBounty. 2018-10-08 12:51:11 -03:00
6fe9b340b4 Added assertions to leaf initializers of (some) pseudo-abstract contracts. 2018-10-08 12:45:58 -03:00
b25e8b91a5 Merge pull request #26 from nventuro/sender-param
Added sender parameter to initializers using msg.sender.
2018-10-08 11:03:10 -03:00
14dd3f6610 Added sender parameter to initializers using msg.sender. 2018-10-05 17:40:38 -03:00
716efc4b51 Merge pull request #24 from nventuro/init-improvs
Initialization improvements
2018-10-05 16:39:44 -03:00
143ccf7a74 Removed Initializable from mocks, removed explicit inheritances in the crowdsale mocks. 2018-10-05 16:34:29 -03:00
dd750bc094 Added missing initializations. 2018-10-05 16:34:29 -03:00
ef83f895b9 Added initializer to ERC721MetadataMintable. 2018-10-05 16:34:29 -03:00
cd3be5fb02 Merge pull request #23 from nventuro/oz-sol-rc3
Merging OZ 2.0.0.rc3
2018-10-05 16:29:08 -03:00
f29e98f772 Merge remote-tracking branch 'solidity/release-v2.0.0' into oz-sol-rc3 2018-10-04 12:00:12 -03:00
3df0a786e4 Merge pull request #18 from OpenZeppelin/release-v2.0.0
Merge OpenZeppelin 2.0 with initializer functions
2018-10-04 08:36:30 -03:00
3c4528b8f4 fix initialization of ReetrancyGuard storage variable 2018-10-03 17:28:22 -03:00
94a7abcebc Merge pull request #14 from glesaint/patch-1
update Math.sol path
2018-10-02 10:57:53 -03:00
32d0f6770c fix lint errors 2018-10-01 18:56:50 -03:00
caa0db9fa9 Merge branch 'master' into release-v2.0.0 2018-10-01 18:54:26 -03:00
621d4b30da remove constructors from Crowdsales 2018-09-28 17:51:59 -03:00
693907d3c8 convert SampleCrowdsale and SampleCrowdsaleToken to initializers 2018-09-28 17:48:07 -03:00
2108641a37 convert distribution crowdsales to initializers 2018-09-28 16:38:04 -03:00
418b6f7cb3 convert IncreasingPriceCrowdsale to initializers 2018-09-28 16:01:57 -03:00
ed200a0219 convert IndividuallyCappedCrowdsale to initializers 2018-09-27 19:28:14 -03:00
c4487ba836 convert CappedCrowdsale 2018-09-27 19:24:02 -03:00
2c2d80d9a0 convert TimedCrowdsale to initializers 2018-09-27 19:14:30 -03:00
6247a7bf7c convert AllowanceCrowdsale to initializers 2018-09-27 18:57:59 -03:00
22f8660c8e convert MintedCrowdsale to initializers 2018-09-27 18:53:31 -03:00
175e2c7254 convert Crowdsale to initializers 2018-09-27 18:43:58 -03:00
a0a3187b30 make roles initializers idempotent 2018-09-26 19:21:25 -03:00
f3b5f9e8f0 convert SignatureBouncer to initializers 2018-09-26 19:01:36 -03:00
e6d5379e39 convert TokenVesting to initializers 2018-09-26 18:59:07 -03:00
8bf7356f38 convert ERC20Migrator to initializers 2018-09-26 18:49:47 -03:00
d7b7644e68 convert ERC1046 to initializers 2018-09-26 18:30:45 -03:00
8dd0739072 convert BreakInvariantBounty to initializers 2018-09-26 18:26:45 -03:00
838509c0a4 Merge branch 'release-v2.0.0' of github.com:OpenZeppelin/openzeppelin-solidity into release-v2.0.0 2018-09-26 18:19:41 -03:00
e6252d511c convert SimpleToken to initializers 2018-09-26 18:08:29 -03:00
e2e05294b0 convert RefundEscrow to initializers 2018-09-26 18:01:02 -03:00
3130a3f3de convert ConditionalEscrow to initializers 2018-09-26 17:55:08 -03:00
884d5e0132 convert SplitPayment to initializers 2018-09-26 17:51:33 -03:00
8d28bd445a covnert TokenTimelock into initializers 2018-09-26 17:46:54 -03:00
d643caf8fe convert CapperRole and SignerRole to initializers 2018-09-26 17:18:45 -03:00
a010d88def convert ERC721Pausable to initializers 2018-09-26 17:12:16 -03:00
d3116fcea8 add Initializable to simple ERC721 contracts 2018-09-26 17:12:16 -03:00
cda2866e7c convert ERC721Burnable to initializers 2018-09-26 16:45:37 -03:00
aa6a44bb20 convert PullPayment to initializers 2018-09-25 19:38:15 -03:00
10642d14ea convert Escrow to initializers 2018-09-25 19:33:58 -03:00
6ac45333fe convert Secondary to initializers 2018-09-25 19:31:59 -03:00
0962b9e5e6 convert ERC20Pausable to initializers 2018-09-25 18:53:24 -03:00
c630cb4016 convert Pausable to initializers 2018-09-25 18:51:19 -03:00
21e016378c convert PauserRole to initializers 2018-09-25 18:48:18 -03:00
7cee6df3f7 convert ERC20Capped to initializers 2018-09-25 18:41:19 -03:00
57325f51ff convert ERC20Burnable to initializers 2018-09-25 18:23:20 -03:00
20a2aa4274 adjust name in package.json 2018-09-25 17:59:28 -03:00
5c1c43d2e1 convert ERC721Mintable to initializers 2018-09-25 17:56:44 -03:00
f3a0a6a463 convert ERC721Full, ERC721Enumerable, ERC721Metadata to initializers 2018-09-25 17:51:28 -03:00
416c4ced2c convert ERC721 to initializers 2018-09-25 17:46:16 -03:00
3f51d342d1 convert ERC20Mintable 2018-09-25 17:42:50 -03:00
1f54c72d1d add Initializable to MinterRoleMock 2018-09-25 17:42:50 -03:00
f90fd5330e convert ERC20Detailed 2018-09-25 17:34:19 -03:00
653b154b0e convert ERC20 2018-09-25 17:32:54 -03:00
6e0ace1914 make initializer modifier check if running in constructor 2018-09-24 20:39:14 -03:00
5b8d5eb5e9 convert ERC165 to initializers 2018-09-24 20:36:32 -03:00
3a3d2b154f transform MinterRole to initializers 2018-09-24 10:34:13 -03:00
f3606e3e21 transform Ownable to initializers 2018-09-24 10:30:07 -03:00
9c16ffcaf4 add Initializable 2018-09-21 17:36:51 -03:00
4c319a1072 Merge branch 'master' into release-v2.0.0 2018-09-21 11:18:24 -03:00
5f7e43f170 update Math.sol path
To use openzeppelin-zos Math.sol
2018-09-11 16:04:13 +07:00
a23d42fc04 1.9.4 2018-08-27 19:08:43 -03:00
2a2519414b Update zos files for 1.9.4 2018-08-27 19:08:24 -03:00
c46f0353d1 Update ERC721 to latest 1.11.0 from OpenZeppelin-solidity (#11)
* Update ERC721 to latest 1.11.0 from OpenZeppelin-solidity

* Hardcode supported interfaces instead of using lookup table. This avoids shifting storage when extending supports interface.

* Update build artifacts

* Fix linter errors
2018-08-27 18:42:21 -03:00
8f4610e007 1.9.3 2018-08-23 14:59:46 -03:00
63ca200016 Upgrade to 1.9.3 2018-08-23 14:59:30 -03:00
d87e833310 feat: add indexed _tokenId on Approval event for ERC721 (#9) 2018-08-23 14:25:24 -03:00
198dbf348c 1.9.2 2018-08-23 12:05:55 -03:00
094677f179 Bump zos version to 1.9.2 2018-08-23 12:05:05 -03:00
e6167f1c0b Add build artifacts to version control 2018-08-23 11:45:35 -03:00
23ddc9db2a Update zos version 2018-08-23 11:28:20 -03:00
8443df3826 feat: indexed _tokenId on Transfer Event for ERC721 (#6) 2018-08-23 11:04:44 -03:00
6e5596e80c fix package.json repository links 2018-07-20 17:45:11 -03:00
f00d13125b modify readme for zos 2018-07-20 17:20:07 -03:00
3af2f8ad7c 1.9.1 2018-05-22 21:01:54 -03:00
59afaca753 remove distribution and kernel from zos.ropsten.json 2018-05-22 20:06:15 -03:00
f35eeed0eb freeze rinkeby version 2018-05-22 19:28:38 -03:00
8b19e3c215 fix linter errors 2018-05-22 19:21:52 -03:00
dca62efba9 add correct zos.ropsten.json 2018-05-22 19:11:41 -03:00
923bbb44a8 add zos files to npm package 2018-05-22 18:43:38 -03:00
d4c455c180 rename livenet to mainnet 2018-05-22 18:43:16 -03:00
5ac618681a add zos.rinkeby.json 2018-05-22 18:30:55 -03:00
d191247505 add full zos.livenet.json 2018-05-22 17:30:14 -03:00
9b55e96fa0 add partial zos.livenet.json 2018-05-22 17:30:14 -03:00
8868c0b6d3 update to zos-cli 0.8.0 2018-05-22 16:27:45 -03:00
534ff92ba5 add zos-lib as peerdependency 2018-05-22 16:09:41 -03:00
31ec824aef Revert "add workaround because truffle doesn't support transitive dependencies"
This reverts commit 48a7cd4e60.
2018-05-22 16:07:27 -03:00
b732b6417e bump to 1.9.0 2018-05-22 14:57:33 -03:00
998b5f43fb update zos to 0.7.0 2018-05-21 18:46:32 -03:00
ff31995104 update zos-lib to latest version 2018-05-21 15:58:05 -03:00
48a7cd4e60 add workaround because truffle doesn't support transitive dependencies 2018-05-21 15:54:35 -03:00
acd34a9372 fix bug in DetailedPremintedToken 2018-05-21 15:26:44 -03:00
2ce67a25ef add more contracts from openzeppelin-solidity 2018-05-21 15:26:44 -03:00
700b811813 fix linter errors and warnings 2018-05-21 15:26:44 -03:00
16f04b13d7 revert truffle-config.js changes from 95fdc7b 2018-05-21 15:26:44 -03:00
e3ad4a5e14 remove unnecessary sender arguments 2018-05-21 15:26:28 -03:00
579446d5d9 Fixed MintableToken's initialize not being called. 2018-05-19 01:02:12 -03:00
fc07f7a0ff RBACWithAdmin now has an initialize function instead of a constructor. 2018-05-19 00:58:52 -03:00
dd6054efeb remove unnecessary sender arguments 2018-05-18 21:45:45 -03:00
27a6a15d66 add explicit initializers 2018-05-18 21:45:34 -03:00
32e93579fa added package.zos files 2018-05-18 21:44:56 -03:00
c8719ce418 fix initialize versions 2018-05-18 21:44:08 -03:00
39fe05dfad add more openzeppelin-solidity library contracts 2018-05-18 21:44:08 -03:00
be101154fa update to newer zos.json format 2018-05-18 21:21:37 -03:00
c329fc0a5f update zos to latest version 2018-05-18 21:01:23 -03:00
e55dbc9681 update to latest zos and zos-lib 2018-05-18 19:07:15 -03:00
6f1c67af0d commit new package-lock.json format generated by npm 6 2018-05-18 18:55:24 -03:00
5284a6df88 update nan 2.6.2 -> 2.10.0 for node 10 compatibility 2018-05-18 18:19:15 -03:00
8bce0a4f2e update sha3 1.2.0 -> 1.2.2 for node 10 compatibility 2018-05-18 18:19:12 -03:00
11d2bbc092 Merge tag 'v1.9.0' into zos-release
1.9.0
2018-05-17 20:04:00 -03:00
ff69c54497 move zos (cli) to devDependency 2018-04-20 22:47:38 -03:00
6669f3fcee Merge branch 'zos-release' of github.com:OpenZeppelin/zeppelin-solidity into zos-release 2018-04-20 21:37:28 -03:00
18e16a5db0 added package.zos 2018-04-20 20:38:23 -03:00
95fdc7bd8a update contracts and config 2018-04-20 19:58:16 -03:00
27d696aa7d add deployable erc20 contracts 2018-04-20 13:31:27 -03:00
ff6a565452 bump version 2018-04-20 13:31:27 -03:00
5f079c8605 add prepack step to build contracts 2018-04-20 13:31:27 -03:00
ea335ebc64 ignore everything but official contracts for npm 2018-04-20 13:31:27 -03:00
b1a801566c fix initializers and tests 2018-04-20 13:31:26 -03:00
2eac2a79b7 add mintable erc721 token 2018-04-20 13:30:22 -03:00
f9fc8d2e96 adapt contracts for upgradeability 2018-04-20 13:29:50 -03:00
89c32f5dd7 delete contracts and tests not yet in zos 2018-04-20 12:18:08 -03:00
eff3d7ca8e bump version 2018-04-20 11:38:48 -03:00
85225ef6ae add mintable erc721 token 2018-04-20 11:38:48 -03:00
2010c6b464 add prepack step to build contracts 2018-04-19 12:32:56 -03:00
03891b00a7 ignore everything but official contracts for npm 2018-04-19 12:26:30 -03:00
d0ec491b1f adapt contracts for upgradeability 2018-04-18 18:10:53 -03:00
38536f42f4 delete contracts and tests not yet in zos 2018-04-18 18:10:53 -03:00
1053 changed files with 37989 additions and 107952 deletions

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': patch
---
Add constructors to the different signers.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`AccountERC7579`: Extension of `Account` that implements support for ERC-7579 modules of type executor, validator, and fallback handler.

View File

@ -1,12 +0,0 @@
{
"$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
"changelog": [
"@changesets/changelog-github",
{
"repo": "OpenZeppelin/openzeppelin-contracts"
}
],
"commit": false,
"access": "public",
"baseBranch": "master"
}

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`Memory`: Add library with utilities to manipulate memory

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`Checkpoints`: Add a new checkpoint variant `Checkpoint256` using `uint256` type for the value and key.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`EnumerableMap`: Add `keys(uint256,uint256)` that returns a subset (slice) of the keys in the map.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`EIP7702Utils`: Add a library for checking if an address has an EIP-7702 delegation in place.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`Account`: Added a simple ERC-4337 account implementation with minimal logic to process user operations.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`EnumerableSet`: Add `values(uint256,uint256)` that returns a subset (slice) of the values in the set.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`SignerERC7702`: Implementation of `AbstractSigner` for Externally Owned Accounts (EOAs). Useful with ERC-7702.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`EnumerableMap`: Add support for `BytesToBytesMap` type.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`ERC7739`: An abstract contract to validate signatures following the rehashing scheme from `ERC7739Utils`.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`Bytes`: Add `reverseBytes32`, `reverseBytes16`, `reverseBytes8`, `reverseBytes4`, and `reverseBytes2` functions to reverse byte order for converting between little-endian and big-endian representations.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`Strings`: Add `toHexString(bytes)`.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`ERC7913P256Verifier` and `ERC7913RSAVerifier`: Ready to use ERC-7913 verifiers that implement key verification for P256 (secp256r1) and RSA keys.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`EnumerableSet`: Add support for `StringSet` and `BytesSet` types.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`GovernorNoncesKeyed`: Extension of `Governor` that adds support for keyed nonces when voting by sig.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`ERC7739Utils`: Add a library that implements a defensive rehashing mechanism to prevent replayability of smart contract signatures based on the ERC-7739.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`MultiSignerERC7913Weighted`: Extension of `MultiSignerERC7913` that supports assigning different weights to each signer, enabling more flexible governance schemes.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`SignerERC7913`: Abstract signer that verifies signatures using the ERC-7913 workflow.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`Arrays`: Add `unsafeAccess`, `unsafeMemoryAccess` and `unsafeSetLength` for `bytes[]` and `string[]`.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`InteroperableAddress`: Add a library for formatting and parsing ERC-7930 interoperable addresses.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`ERC20Bridgeable`: Implementation of ERC-7802 that makes an ERC-20 compatible with crosschain bridges.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`IERC7821`, `ERC7821`: Interface and logic for minimal batch execution. No support for additional `opData` is included.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`MultiSignerERC7913`: Implementation of `AbstractSigner` that supports multiple ERC-7913 signers with a threshold-based signature verification system.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`SignatureChecker`: Add support for ERC-7913 signatures alongside existing ECDSA and ERC-1271 signature verification.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`AccountERC7579Hooked`: Extension of `AccountERC7579` that implements support for ERC-7579 hook modules.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`AbstractSigner`, `SignerECDSA`, `SignerP256`, and `SignerRSA`: Add an abstract contract and various implementations for contracts that deal with signature verification.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`ECDSA`: Add `recoverCalldata` and `tryRecoverCalldata`, variants of `recover` and `tryRecover` that are more efficient when signatures are in calldata.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`Blockhash`: Add a library that provides access to historical block hashes using EIP-2935's history storage, extending the standard 256-block limit to 8191 blocks.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`SignatureChecker`: Add `isValidSignatureNowCalldata(address,bytes32,bytes calldata)` for efficient processing of calldata signatures.

View File

@ -1,5 +0,0 @@
---
'openzeppelin-solidity': minor
---
`IERC7786`: Add the (draft) interface for ERC-7786 "Cross-Chain Messaging Gateway"

82
.circleci/config.yml Normal file
View File

@ -0,0 +1,82 @@
version: 2
# 2.1 does not yet support local run
# unless with workaround. For simplicity just use it.
# https://github.com/CircleCI-Public/circleci-cli/issues/79
aliases:
- &defaults
docker:
- image: circleci/node:8
- &npm_install_if_necessary
run:
name: Install npm dependencies
command: |
if [ ! -d node_modules ]; then
npm ci
fi
- &cache_key_node_modules
key: v1-node_modules-{{ checksum "package-lock.json" }}
jobs:
dependencies:
<<: *defaults
steps:
- checkout
- restore_cache:
<<: *cache_key_node_modules
- *npm_install_if_necessary
- save_cache:
paths:
- node_modules
<<: *cache_key_node_modules
lint:
<<: *defaults
steps:
- checkout
- restore_cache:
<<: *cache_key_node_modules
- *npm_install_if_necessary
- run:
name: Linter
command: npm run lint
test:
<<: *defaults
steps:
- checkout
- restore_cache:
<<: *cache_key_node_modules
- *npm_install_if_necessary
- run:
name: Unit tests
command: npm run test
coverage:
docker:
- image: circleci/node:8
steps:
- checkout
- restore_cache:
<<: *cache_key_node_modules
- *npm_install_if_necessary
- run:
name: Unit tests with coverage report
command: npm run coverage
# TODO(xinbenlv, #1839): run SOLC_NIGHTLY to be run but allow it to fail.
workflows:
version: 2
everything:
jobs:
- dependencies
- lint:
requires:
- dependencies
- test:
requires:
- dependencies
- coverage:
requires:
- dependencies

View File

@ -1,16 +0,0 @@
comment: off
github_checks:
annotations: false
coverage:
status:
patch:
default:
target: 95%
only_pulls: true
project:
default:
threshold: 1%
ignore:
- "test"
- "contracts/mocks"
- "contracts/vendor"

View File

@ -6,16 +6,7 @@ root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = false
max_line_length = 120
[*.sol]
indent_size = 4
[*.js]
indent_size = 2
[*.{adoc,md}]
max_line_length = 0
trim_trailing_whitespace = true

58
.eslintrc Normal file
View File

@ -0,0 +1,58 @@
{
"extends" : [
"standard",
"plugin:promise/recommended",
],
"plugins": [
"mocha-no-only",
"promise",
],
"env": {
"browser" : true,
"node" : true,
"mocha" : true,
"jest" : true,
},
"globals" : {
"artifacts": false,
"contract": false,
"assert": false,
"web3": false,
},
"rules": {
// Strict mode
"strict": ["error", "global"],
// Code style
"camelcase": ["error", {"properties": "always"}],
"comma-dangle": ["error", "always-multiline"],
"comma-spacing": ["error", {"before": false, "after": true}],
"dot-notation": ["error", {"allowKeywords": true, "allowPattern": ""}],
"eol-last": ["error", "always"],
"eqeqeq": ["error", "smart"],
"generator-star-spacing": ["error", "before"],
"indent": ["error", 2],
"linebreak-style": ["error", "unix"],
"max-len": ["error", 120, 2],
"no-debugger": "off",
"no-dupe-args": "error",
"no-dupe-keys": "error",
"no-mixed-spaces-and-tabs": ["error", "smart-tabs"],
"no-redeclare": ["error", {"builtinGlobals": true}],
"no-trailing-spaces": ["error", { "skipBlankLines": false }],
"no-undef": "error",
"no-use-before-define": "off",
"no-var": "error",
"object-curly-spacing": ["error", "always"],
"prefer-const": "error",
"quotes": ["error", "single"],
"semi": ["error", "always"],
"space-before-function-paren": ["error", "always"],
"mocha-no-only/mocha-no-only": ["error"],
"promise/always-return": "off",
"promise/avoid-new": "off",
}
}

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
*.sol linguist-language=Solidity

10
.github/CODEOWNERS vendored
View File

@ -1,10 +0,0 @@
# List of approvers/reviewers for OpenZeppelin Contracts
#
# Get in touch with us via the OpenZeppelin Forum
# https://forum.openzeppelin.com/
#
# Learn about CODEOWNERS file format:
# https://help.github.com/en/articles/about-code-owners
# These owners will be the default owners for everything in the repo.
* @OpenZeppelin/contracts

View File

@ -1,16 +1,16 @@
---
name: Bug report
about: Report a bug in OpenZeppelin Contracts
about: Report a bug in OpenZeppelin
---
<!-- Briefly describe the issue you're experiencing. Tell us what you were trying to do and what happened instead. -->
<!-- Remember, this is not a place to ask for help debugging code. For that, we welcome you in the OpenZeppelin Community Forum: https://forum.openzeppelin.com/. -->
<!-- Remember, this is not a place to ask for help debugging code. For that, we welcome you in the OpenZeppelin Slack channel: https://slack.openzeppelin.org/. -->
**💻 Environment**
<!-- Tell us what version of OpenZeppelin Contracts you're using, and how you're using it: Hardhat, Remix, etc. -->
<!-- Tell us what version of OpenZeppelin you're using, and how you're using it: Truffle, Remix, etc. -->
**📝 Details**

View File

@ -1,4 +0,0 @@
contact_links:
- name: Questions & Support Requests
url: https://forum.openzeppelin.com/c/support/contracts/18
about: Ask in the OpenZeppelin Forum

View File

@ -1,6 +1,6 @@
---
name: Feature request
about: Suggest an idea for OpenZeppelin Contracts
about: Suggest an idea for OpenZeppelin
---
@ -10,5 +10,5 @@ about: Suggest an idea for OpenZeppelin Contracts
**📝 Details**
<!-- Please describe your feature request in detail. -->
<!-- Make sure that you have reviewed the OpenZeppelin Contracts Contributor Guidelines. -->
<!-- https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CONTRIBUTING.md -->
<!-- Make sure that you have reviewed the OpenZeppelin Contributor Guidelines. -->
<!-- https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/CONTRIBUTING.md -->

View File

@ -1,20 +1,22 @@
<!-- Thank you for your interest in contributing to OpenZeppelin! -->
<!-- 0. 🎉 Thank you for submitting a PR! -->
<!-- Consider opening an issue for discussion prior to submitting a PR. -->
<!-- New features will be merged faster if they were first discussed and designed with the team. -->
<!-- 1. Does this close any open issues? Please list them below. -->
Fixes #???? <!-- Fill in with issue number -->
<!-- Keep in mind that new features have a better chance of being merged fast if
they were first discussed and designed with the maintainers. If there is no
corresponding issue, please consider opening one for discussion first! -->
<!-- Describe the changes introduced in this pull request. -->
<!-- Include any context necessary for understanding the PR's purpose. -->
Fixes #
<!-- 2. Describe the changes introduced in this pull request. -->
<!-- Include any context necessary for understanding the PR's purpose. -->
#### PR Checklist
<!-- Before merging the pull request all of the following must be complete. -->
<!-- Feel free to submit a PR or Draft PR even if some items are pending. -->
<!-- Some of the items may not apply. -->
- [ ] Tests
- [ ] Documentation
- [ ] Changeset entry (run `npx changeset add`)
<!-- 3. Before submitting, please make sure that you have:
- reviewed the OpenZeppelin Contributor Guidelines
(https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/CONTRIBUTING.md),
- added tests where applicable to test new functionality,
- made sure that your contracts are well-documented,
- run the Solidity linter (`npm run lint:sol`) and fixed any issues,
- run the JS linter and fixed any issues (`npm run lint:fix`), and
- updated the changelog, if applicable.
-->

View File

@ -1,51 +0,0 @@
name: Compare gas costs
description: Compare gas costs between branches
inputs:
token:
description: GitHub token, required to access GitHub API
required: true
report:
description: Path to the report to compare
required: false
default: gasReporterOutput.json
out_report:
description: Path to save the output report
required: false
default: ${{ github.ref_name }}.gasreport.json
ref_report:
description: Path to the reference report for comparison
required: false
default: ${{ github.base_ref }}.gasreport.json
runs:
using: composite
steps:
- name: Download reference report
if: github.event_name == 'pull_request'
run: |
RUN_ID=`gh run list --repo ${{ github.repository }} --branch ${{ github.base_ref }} --workflow ${{ github.workflow }} --limit 100 --json 'conclusion,databaseId,event' --jq 'map(select(.conclusion=="success" and .event!="pull_request"))[0].databaseId'`
gh run download ${RUN_ID} --repo ${{ github.repository }} -n gasreport
env:
GITHUB_TOKEN: ${{ inputs.token }}
shell: bash
continue-on-error: true
id: reference
- name: Compare reports
if: steps.reference.outcome == 'success' && github.event_name == 'pull_request'
run: |
node scripts/checks/compareGasReports.js ${{ inputs.report }} ${{ inputs.ref_report }} >> $GITHUB_STEP_SUMMARY
env:
STYLE: markdown
shell: bash
- name: Rename report for upload
if: github.event_name != 'pull_request'
run: |
mv ${{ inputs.report }} ${{ inputs.out_report }}
shell: bash
- name: Save report
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@v4
with:
name: gasreport
overwrite: true
path: ${{ inputs.out_report }}

View File

@ -1,22 +0,0 @@
name: Setup
description: Common environment setup
runs:
using: composite
steps:
- uses: actions/setup-node@v4
with:
node-version: 22.x
- uses: actions/cache@v4
id: cache
with:
path: '**/node_modules'
key: npm-v3-${{ hashFiles('**/package-lock.json') }}
- name: Install dependencies
run: npm ci
shell: bash
if: steps.cache.outputs.cache-hit != 'true'
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: stable

View File

@ -1,57 +0,0 @@
name: Compare storage layouts
description: Compare storage layouts between branches
inputs:
token:
description: github token
required: true
buildinfo:
description: compilation artifacts
required: false
default: artifacts/build-info/*.json
layout:
description: extracted storage layout
required: false
default: HEAD.layout.json
out_layout:
description: storage layout to upload
required: false
default: ${{ github.ref_name }}.layout.json
ref_layout:
description: storage layout for the reference branch
required: false
default: ${{ github.base_ref }}.layout.json
runs:
using: composite
steps:
- name: Extract layout
run: |
node scripts/checks/extract-layout.js ${{ inputs.buildinfo }} > ${{ inputs.layout }}
shell: bash
- name: Download reference
if: github.event_name == 'pull_request'
run: |
RUN_ID=`gh run list --repo ${{ github.repository }} --branch ${{ github.base_ref }} --workflow ${{ github.workflow }} --limit 100 --json 'conclusion,databaseId,event' --jq 'map(select(.conclusion=="success" and .event!="pull_request"))[0].databaseId'`
gh run download ${RUN_ID} --repo ${{ github.repository }} -n layout
env:
GITHUB_TOKEN: ${{ inputs.token }}
shell: bash
continue-on-error: true
id: reference
- name: Compare layouts
if: steps.reference.outcome == 'success' && github.event_name == 'pull_request'
run: |
node scripts/checks/compare-layout.js --head ${{ inputs.layout }} --ref ${{ inputs.ref_layout }}
shell: bash
- name: Rename artifacts for upload
if: github.event_name != 'pull_request'
run: |
mv ${{ inputs.layout }} ${{ inputs.out_layout }}
shell: bash
- name: Save artifacts
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@v4
with:
name: layout
overwrite: true
path: ${{ inputs.out_layout }}

View File

@ -1,18 +0,0 @@
name: lint workflows
on:
pull_request:
paths:
- '.github/**/*.ya?ml'
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Add problem matchers
run: |
# https://github.com/rhysd/actionlint/blob/3a2f2c7/docs/usage.md#problem-matchers
curl -LO https://raw.githubusercontent.com/rhysd/actionlint/main/.github/actionlint-matcher.json
echo "::add-matcher::actionlint-matcher.json"
- uses: docker://rhysd/actionlint:latest

View File

@ -1,28 +0,0 @@
name: changeset
on:
pull_request:
branches:
- master
types:
- opened
- synchronize
- labeled
- unlabeled
concurrency:
group: changeset-${{ github.ref }}
cancel-in-progress: true
jobs:
check:
runs-on: ubuntu-latest
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ignore-changeset') }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Include history so Changesets finds merge-base
- name: Set up environment
uses: ./.github/actions/setup
- name: Check changeset
run: npx changeset status --since=origin/${{ github.base_ref }}

View File

@ -1,132 +0,0 @@
name: checks
on:
push:
branches:
- master
- next-v*
- release-v*
pull_request: {}
workflow_dispatch: {}
concurrency:
group: checks-${{ github.ref }}
cancel-in-progress: true
env:
NODE_OPTIONS: --max_old_space_size=8192
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- run: npm run lint
tests:
runs-on: ubuntu-latest
env:
FORCE_COLOR: 1
# Needed for "eth-gas-reporter" to produce a "gasReporterOutput.json" as documented in
# https://github.com/cgewecke/eth-gas-reporter/blob/v0.2.27/docs/gasReporterOutput.md
CI: true
GAS: true
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Run tests and generate gas report
run: npm run test
- name: Check linearisation of the inheritance graph
run: npm run test:inheritance
- name: Check pragma validity
run: npm run test:pragma -- --concurrency 1
- name: Check procedurally generated contracts are up-to-date
run: npm run test:generation
- name: Compare gas costs
uses: ./.github/actions/gas-compare
with:
token: ${{ github.token }}
tests-upgradeable:
runs-on: ubuntu-latest
env:
FORCE_COLOR: 1
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Include history so patch conflicts are resolved automatically
- name: Set up environment
uses: ./.github/actions/setup
- name: Copy non-upgradeable contracts as dependency
run: |
mkdir -p lib/openzeppelin-contracts
cp -rnT contracts lib/openzeppelin-contracts/contracts
- name: Transpile to upgradeable
run: bash scripts/upgradeable/transpile.sh
- name: Run tests
run: npm run test
- name: Check linearisation of the inheritance graph
run: npm run test:inheritance
- name: Check pragma validity
run: npm run test:pragma -- --concurrency 1
- name: Check storage layout
uses: ./.github/actions/storage-layout
continue-on-error: ${{ contains(github.event.pull_request.labels.*.name, 'breaking change') }}
with:
token: ${{ github.token }}
tests-foundry:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Set up environment
uses: ./.github/actions/setup
- name: Run tests
run: forge test -vvv
coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Run coverage
run: npm run coverage
- uses: codecov/codecov-action@v5
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
harnesses:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Compile harnesses
run: |
make -C certora apply
npm run compile:harnesses
slither:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- uses: crytic/slither-action@v0.4.1
codespell:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run CodeSpell
uses: codespell-project/actions-codespell@v2.1
with:
check_hidden: true
check_filenames: true
skip: package-lock.json,*.pdf,vendor

View File

@ -1,19 +0,0 @@
name: Build Docs
on:
push:
branches: [release-v*]
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- run: bash scripts/git-user-config.sh
- run: node scripts/update-docs-branch.js
- run: git push --all origin

View File

@ -1,86 +0,0 @@
name: formal verification
on:
pull_request:
types:
- opened
- reopened
- synchronize
- labeled
workflow_dispatch: {}
env:
PIP_VERSION: '3.11'
JAVA_VERSION: '11'
SOLC_VERSION: '0.8.20'
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
apply-diff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Apply patches
run: make -C certora apply
verify:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'formal-verification')
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up environment
uses: ./.github/actions/setup
- name: identify specs that need to be run
id: arguments
run: |
if [[ ${{ github.event_name }} = 'pull_request' ]];
then
RESULT=$(git diff ${{ github.event.pull_request.head.sha }}..${{ github.event.pull_request.base.sha }} --name-only certora/specs/*.spec | while IFS= read -r file; do [[ -f $file ]] && basename "${file%.spec}"; done | tr "\n" " ")
else
RESULT='--all'
fi
echo "result=$RESULT" >> "$GITHUB_OUTPUT"
- name: Install python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PIP_VERSION }}
cache: 'pip'
cache-dependency-path: 'fv-requirements.txt'
- name: Install python packages
run: pip install -r fv-requirements.txt
- name: Install java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: ${{ env.JAVA_VERSION }}
- name: Install solc
run: |
wget https://github.com/ethereum/solidity/releases/download/v${{ env.SOLC_VERSION }}/solc-static-linux
sudo mv solc-static-linux /usr/local/bin/solc
chmod +x /usr/local/bin/solc
- name: Verify specification
run: |
make -C certora apply
node certora/run.js ${{ steps.arguments.outputs.result }} >> "$GITHUB_STEP_SUMMARY"
env:
CERTORAKEY: ${{ secrets.CERTORAKEY }}
halmos:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Install python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PIP_VERSION }}
cache: 'pip'
cache-dependency-path: 'fv-requirements.txt'
- name: Install python packages
run: pip install -r fv-requirements.txt
- name: Run Halmos
run: halmos --match-test '^symbolic|^testSymbolic' -vv

View File

@ -1,214 +0,0 @@
# D: Manual Dispatch
# M: Merge release PR
# C: Commit
# ┌───────────┐ ┌─────────────┐ ┌────────────────┐
# │Development├──D──►RC-Unreleased│ ┌──►Final-Unreleased│
# └───────────┘ └─┬─────────▲─┘ │ └─┬────────────▲─┘
# │ │ │ │ │
# M C D M C
# │ │ │ │ │
# ┌▼─────────┴┐ │ ┌▼────────────┴┐
# │RC-Released├───┘ │Final-Released│
# └───────────┘ └──────────────┘
name: Release Cycle
on:
push:
branches:
- release-v*
workflow_dispatch: {}
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
state:
name: Check state
permissions:
pull-requests: read
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- id: state
name: Get state
uses: actions/github-script@v7
env:
TRIGGERING_ACTOR: ${{ github.triggering_actor }}
with:
result-encoding: string
script: await require('./scripts/release/workflow/state.js')({ github, context, core })
outputs:
# Job Flags
start: ${{ steps.state.outputs.start }}
changesets: ${{ steps.state.outputs.changesets }}
promote: ${{ steps.state.outputs.promote }}
publish: ${{ steps.state.outputs.publish }}
merge: ${{ steps.state.outputs.merge }}
# Global variables
is_prerelease: ${{ steps.state.outputs.is_prerelease }}
start:
needs: state
name: Start new release candidate
permissions:
contents: write
actions: write
if: needs.state.outputs.start == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- run: bash scripts/git-user-config.sh
- id: start
name: Create branch with release candidate
run: bash scripts/release/workflow/start.sh
- name: Re-run workflow
uses: actions/github-script@v7
env:
REF: ${{ steps.start.outputs.branch }}
with:
script: await require('./scripts/release/workflow/rerun.js')({ github, context })
promote:
needs: state
name: Promote to final release
permissions:
contents: write
actions: write
if: needs.state.outputs.promote == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- run: bash scripts/git-user-config.sh
- name: Exit prerelease state
if: needs.state.outputs.is_prerelease == 'true'
run: bash scripts/release/workflow/exit-prerelease.sh
- name: Re-run workflow
uses: actions/github-script@v7
with:
script: await require('./scripts/release/workflow/rerun.js')({ github, context })
changesets:
needs: state
name: Update PR to release
permissions:
contents: write
pull-requests: write
if: needs.state.outputs.changesets == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # To get all tags
- name: Set up environment
uses: ./.github/actions/setup
- name: Set release title
uses: actions/github-script@v7
with:
result-encoding: string
script: await require('./scripts/release/workflow/set-changesets-pr-title.js')({ core })
- name: Create PR
uses: changesets/action@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
with:
version: npm run version
title: ${{ env.TITLE }}
commit: ${{ env.TITLE }}
body: | # Wait for support on this https://github.com/changesets/action/pull/250
This is an automated PR for releasing ${{ github.repository }}
Check [CHANGELOG.md](${{ github.repository }}/CHANGELOG.md)
publish:
needs: state
name: Publish to npm
environment: npm
permissions:
contents: write
id-token: write
if: needs.state.outputs.publish == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- id: pack
name: Pack
run: bash scripts/release/workflow/pack.sh
env:
PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
- name: Upload tarball artifact
uses: actions/upload-artifact@v4
with:
name: ${{ github.ref_name }}
path: ${{ steps.pack.outputs.tarball }}
- name: Publish
run: bash scripts/release/workflow/publish.sh
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
TARBALL: ${{ steps.pack.outputs.tarball }}
TAG: ${{ steps.pack.outputs.tag }}
NPM_CONFIG_PROVENANCE: true
- name: Create Github Release
uses: actions/github-script@v7
env:
PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
with:
script: await require('./scripts/release/workflow/github-release.js')({ github, context })
outputs:
tarball_name: ${{ steps.pack.outputs.tarball_name }}
integrity_check:
needs: publish
name: Tarball Integrity Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download tarball artifact
id: artifact
uses: actions/download-artifact@v4
with:
name: ${{ github.ref_name }}
- name: Check integrity
run: bash scripts/release/workflow/integrity-check.sh
env:
TARBALL: ${{ steps.artifact.outputs.download-path }}/${{ needs.publish.outputs.tarball_name }}
merge:
needs: state
name: Create PR back to master
permissions:
contents: write
pull-requests: write
if: needs.state.outputs.merge == 'true'
runs-on: ubuntu-latest
env:
MERGE_BRANCH: merge/${{ github.ref_name }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # All branches
- name: Set up environment
uses: ./.github/actions/setup
- run: bash scripts/git-user-config.sh
- name: Create branch to merge
run: |
git checkout -B "$MERGE_BRANCH" "$GITHUB_REF_NAME"
git push -f origin "$MERGE_BRANCH"
- name: Create PR back to master
uses: actions/github-script@v7
with:
script: |
await github.rest.pulls.create({
owner: context.repo.owner,
repo: context.repo.repo,
head: process.env.MERGE_BRANCH,
base: 'master',
title: '${{ format('Merge {0} branch', github.ref_name) }}'
});

View File

@ -1,34 +0,0 @@
name: transpile upgradeable
on:
push:
branches:
- master
- release-v*
jobs:
transpile:
environment: push-upgradeable
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
repository: OpenZeppelin/openzeppelin-contracts-upgradeable
fetch-depth: 0
token: ${{ secrets.GH_TOKEN_UPGRADEABLE }}
- name: Fetch current non-upgradeable branch
run: |
git fetch "$REMOTE" master # Fetch default branch first for patch to apply cleanly
git fetch "$REMOTE" "$REF"
git checkout FETCH_HEAD
env:
REF: ${{ github.ref }}
REMOTE: https://github.com/${{ github.repository }}.git
- name: Set up environment
uses: ./.github/actions/setup
- run: bash scripts/git-user-config.sh
- name: Transpile to upgradeable
run: bash scripts/upgradeable/transpile-onto.sh ${{ github.ref_name }} origin/${{ github.ref_name }}
env:
SUBMODULE_REMOTE: https://github.com/${{ github.repository }}.git
- run: git push origin ${{ github.ref_name }}

39
.gitignore vendored
View File

@ -29,39 +29,16 @@ npm-debug.log
# local env variables
.env
# truffle build directory
build/
# macOS
.DS_Store
# truffle
.node-xmlhttprequest-*
.openzeppelin/.session
# IntelliJ IDE
.idea
# docs artifacts
docs/modules/api
build/site
# only used to package @openzeppelin/contracts
contracts/build/
contracts/README.md
# temporary artifact from solidity-coverage
allFiredEvents
.coverage_artifacts
.coverage_cache
.coverage_contracts
# hardat-exposed
contracts-exposed
# Hardhat
/cache
/artifacts
# Foundry
/out
/cache_forge
# Certora
.certora*
.last_confs
certora_*
.zip-output-url.txt

10
.gitmodules vendored
View File

@ -1,10 +0,0 @@
[submodule "lib/forge-std"]
branch = v1
path = lib/forge-std
url = https://github.com/foundry-rs/forge-std
[submodule "lib/erc4626-tests"]
path = lib/erc4626-tests
url = https://github.com/a16z/erc4626-tests.git
[submodule "lib/halmos-cheatcodes"]
path = lib/halmos-cheatcodes
url = https://github.com/a16z/halmos-cheatcodes

View File

@ -1,2 +0,0 @@
npm run test:generation
npx lint-staged

View File

@ -1,4 +0,0 @@
module.exports = {
require: 'hardhat/register',
timeout: 4000,
};

923
.openzeppelin/kovan.json Normal file
View File

@ -0,0 +1,923 @@
{
"contracts": {
"PaymentSplitter": {
"address": "0x6CE7dEca802e0c5c133f7cbbE719B1da305A6Ae5",
"constructorCode": "608060405234801561001057600080fd5b50610be3806100206000396000f3fe",
"bodyBytecodeHash": "6f1453b45140bc5e426ffccfcae058daa1fc53439580e3c9e6b7f73aac54c5d8",
"localBytecodeHash": "1b0f3688284b1c14c41ce636762c4504188969cb0e5a052159b61b87cbd4e8a8",
"deployedBytecodeHash": "1b0f3688284b1c14c41ce636762c4504188969cb0e5a052159b61b87cbd4e8a8",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_array:dyn<t_address>": {
"id": "t_array:dyn<t_address>",
"valueType": "t_address",
"length": "dyn",
"kind": "array",
"label": "address[]"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_totalShares",
"astId": 9541,
"type": "t_uint256",
"src": "555:28:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_totalReleased",
"astId": 9543,
"type": "t_uint256",
"src": "589:30:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_shares",
"astId": 9547,
"type": "t_mapping<t_uint256>",
"src": "626:43:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_released",
"astId": 9551,
"type": "t_mapping<t_uint256>",
"src": "675:45:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_payees",
"astId": 9554,
"type": "t_array:dyn<t_address>",
"src": "726:25:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "______gap",
"astId": 9800,
"type": "t_array:50<t_uint256>",
"src": "3251:29:120"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [],
"storageDiff": []
}
},
"StandaloneERC20": {
"address": "0x65e22dDa13EFa3A7fadd3EF62afC815110748308",
"constructorCode": "608060405234801561001057600080fd5b5061290d806100206000396000f3fe",
"bodyBytecodeHash": "fffcccf2a7439f83b3eb59e01f5217ea14764c782fde08c6edd511f0c7d1e742",
"localBytecodeHash": "be0848d29ef0345b76e9810a67328a1deb1a7b07dd050c9212d3099430cf4222",
"deployedBytecodeHash": "be0848d29ef0345b76e9810a67328a1deb1a7b07dd050c9212d3099430cf4222",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_string": {
"id": "t_string",
"kind": "elementary",
"label": "string"
},
"t_uint8": {
"id": "t_uint8",
"kind": "elementary",
"label": "uint8"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_struct<Roles.Role>": {
"id": "t_struct<Roles.Role>",
"kind": "struct",
"label": "Roles.Role",
"members": [
{
"label": "bearer",
"astId": 1222,
"type": "t_mapping<t_bool>",
"src": "150:32:8"
}
]
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_name",
"astId": 10735,
"type": "t_string",
"src": "397:20:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_symbol",
"astId": 10737,
"type": "t_string",
"src": "423:22:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_decimals",
"astId": 10739,
"type": "t_uint8",
"src": "451:23:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "______gap",
"astId": 10791,
"type": "t_array:50<t_uint256>",
"src": "1112:29:128"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_balances",
"astId": 10239,
"type": "t_mapping<t_uint256>",
"src": "767:46:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_allowed",
"astId": 10245,
"type": "t_mapping<t_uint256>",
"src": "820:66:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_totalSupply",
"astId": 10247,
"type": "t_uint256",
"src": "893:28:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "______gap",
"astId": 10612,
"type": "t_array:50<t_uint256>",
"src": "7729:29:125"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "______gap",
"astId": 1547,
"type": "t_array:50<t_uint256>",
"src": "1096:29:10"
},
{
"contract": "ERC20Mintable",
"path": "contracts/token/ERC20/ERC20Mintable.sol",
"label": "______gap",
"astId": 10840,
"type": "t_array:50<t_uint256>",
"src": "760:29:129"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "______gap",
"astId": 1666,
"type": "t_array:50<t_uint256>",
"src": "1096:29:11"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "_paused",
"astId": 5401,
"type": "t_bool",
"src": "367:20:42"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "______gap",
"astId": 5482,
"type": "t_array:50<t_uint256>",
"src": "1444:29:42"
},
{
"contract": "ERC20Pausable",
"path": "contracts/token/ERC20/ERC20Pausable.sol",
"label": "______gap",
"astId": 10963,
"type": "t_array:50<t_uint256>",
"src": "1209:29:130"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
}
],
"storageDiff": [
{
"action": "rename",
"updated": {
"index": 8,
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_allowed",
"astId": 10245,
"type": "t_mapping<t_uint256>",
"src": "820:66:125"
},
"original": {
"index": 8,
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_allowances",
"astId": 9135,
"type": "t_mapping<t_uint256>",
"src": "1410:69:115"
}
}
]
}
},
"TokenVesting": {
"address": "0x94CeBcF32a18eA573C85293883f7D3352b360ec1",
"constructorCode": "608060405234801561001057600080fd5b506114d8806100206000396000f3fe",
"bodyBytecodeHash": "7a623cf584a99e031f19436c354675c6b43934b0d3705ffc3353558b1fb39496",
"localBytecodeHash": "e1b9a489ba9fe411cb345548cfbdfb8ef0a9a528c48a9bd07a08f5728a432ea3",
"deployedBytecodeHash": "e1b9a489ba9fe411cb345548cfbdfb8ef0a9a528c48a9bd07a08f5728a432ea3",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "Ownable",
"path": "contracts/ownership/Ownable.sol",
"label": "_owner",
"astId": 9325,
"type": "t_address",
"src": "317:22:118"
},
{
"contract": "Ownable",
"path": "contracts/ownership/Ownable.sol",
"label": "______gap",
"astId": 9436,
"type": "t_array:50<t_uint256>",
"src": "2277:29:118"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_beneficiary",
"astId": 4658,
"type": "t_address",
"src": "1148:28:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_cliff",
"astId": 4660,
"type": "t_uint256",
"src": "1278:22:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_start",
"astId": 4662,
"type": "t_uint256",
"src": "1306:22:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_duration",
"astId": 4664,
"type": "t_uint256",
"src": "1334:25:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_revocable",
"astId": 4666,
"type": "t_bool",
"src": "1366:23:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_released",
"astId": 4670,
"type": "t_mapping<t_uint256>",
"src": "1396:46:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_revoked",
"astId": 4674,
"type": "t_mapping<t_bool>",
"src": "1448:42:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "______gap",
"astId": 5016,
"type": "t_array:50<t_uint256>",
"src": "5852:29:36"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [],
"storageDiff": []
}
},
"StandaloneERC721": {
"address": "0xB1a160cD691cF3754AA4AE91ba6e2E18798CcE36",
"constructorCode": "608060405234801561001057600080fd5b506135c8806100206000396000f3fe",
"bodyBytecodeHash": "b71f19d62583c08240fd85bec42565407f679b1873d7f6e97295a894c7864e2d",
"localBytecodeHash": "2e71874460f43d0696496418b1abf57ed58ce1dc524044860260dda9d7de7fab",
"deployedBytecodeHash": "2e71874460f43d0696496418b1abf57ed58ce1dc524044860260dda9d7de7fab",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_mapping<t_address>": {
"id": "t_mapping<t_address>",
"valueType": "t_address",
"label": "mapping(key => address)",
"kind": "mapping"
},
"t_struct<Counters.Counter>": {
"id": "t_struct<Counters.Counter>",
"kind": "struct",
"label": "Counters.Counter",
"members": [
{
"label": "_value",
"astId": 3632,
"type": "t_uint256",
"src": "1021:14:30"
}
]
},
"t_mapping<t_struct<Counters.Counter>>": {
"id": "t_mapping<t_struct<Counters.Counter>>",
"valueType": "t_struct<Counters.Counter>",
"label": "mapping(key => Counters.Counter)",
"kind": "mapping"
},
"t_array:dyn<t_uint256>": {
"id": "t_array:dyn<t_uint256>",
"valueType": "t_uint256",
"length": "dyn",
"kind": "array",
"label": "uint256[]"
},
"t_mapping<t_array:dyn<t_uint256>>": {
"id": "t_mapping<t_array:dyn<t_uint256>>",
"valueType": "t_array:dyn<t_uint256>",
"label": "mapping(key => uint256[])",
"kind": "mapping"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_string": {
"id": "t_string",
"kind": "elementary",
"label": "string"
},
"t_mapping<t_string>": {
"id": "t_mapping<t_string>",
"valueType": "t_string",
"label": "mapping(key => string)",
"kind": "mapping"
},
"t_struct<Roles.Role>": {
"id": "t_struct<Roles.Role>",
"kind": "struct",
"label": "Roles.Role",
"members": [
{
"label": "bearer",
"astId": 1222,
"type": "t_mapping<t_bool>",
"src": "150:32:8"
}
]
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "ERC165",
"path": "contracts/introspection/ERC165.sol",
"label": "_supportedInterfaces",
"astId": 5191,
"type": "t_mapping<t_bool>",
"src": "511:52:39"
},
{
"contract": "ERC165",
"path": "contracts/introspection/ERC165.sol",
"label": "______gap",
"astId": 5235,
"type": "t_array:50<t_uint256>",
"src": "1244:29:39"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_tokenOwner",
"astId": 11595,
"type": "t_mapping<t_address>",
"src": "844:48:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_tokenApprovals",
"astId": 11599,
"type": "t_mapping<t_address>",
"src": "948:52:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_ownedTokensCount",
"astId": 11603,
"type": "t_mapping<t_struct<Counters.Counter>>",
"src": "1058:63:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_operatorApprovals",
"astId": 11609,
"type": "t_mapping<t_bool>",
"src": "1176:73:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "______gap",
"astId": 12132,
"type": "t_array:50<t_uint256>",
"src": "11673:29:135"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_ownedTokens",
"astId": 12183,
"type": "t_mapping<t_array:dyn<t_uint256>>",
"src": "460:50:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_ownedTokensIndex",
"astId": 12187,
"type": "t_mapping<t_uint256>",
"src": "580:53:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_allTokens",
"astId": 12190,
"type": "t_array:dyn<t_uint256>",
"src": "694:28:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_allTokensIndex",
"astId": 12194,
"type": "t_mapping<t_uint256>",
"src": "793:51:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "______gap",
"astId": 12523,
"type": "t_array:50<t_uint256>",
"src": "8816:29:137"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_name",
"astId": 12590,
"type": "t_string",
"src": "281:20:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_symbol",
"astId": 12592,
"type": "t_string",
"src": "328:22:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_tokenURIs",
"astId": 12596,
"type": "t_mapping<t_string>",
"src": "396:45:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "______gap",
"astId": 12725,
"type": "t_array:50<t_uint256>",
"src": "2849:29:140"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "______gap",
"astId": 1547,
"type": "t_array:50<t_uint256>",
"src": "1096:29:10"
},
{
"contract": "ERC721MetadataMintable",
"path": "contracts/token/ERC721/ERC721MetadataMintable.sol",
"label": "______gap",
"astId": 12795,
"type": "t_array:50<t_uint256>",
"src": "1055:29:141"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "______gap",
"astId": 1666,
"type": "t_array:50<t_uint256>",
"src": "1096:29:11"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "_paused",
"astId": 5401,
"type": "t_bool",
"src": "367:20:42"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "______gap",
"astId": 5482,
"type": "t_array:50<t_uint256>",
"src": "1444:29:42"
},
{
"contract": "ERC721Pausable",
"path": "contracts/token/ERC721/ERC721Pausable.sol",
"label": "______gap",
"astId": 12940,
"type": "t_array:50<t_uint256>",
"src": "865:29:143"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_ownedTokensCount",
"astId": 11603,
"type": "t_mapping<t_struct<Counters.Counter>>",
"src": "1058:63:135"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
}
],
"storageDiff": []
}
}
},
"solidityLibs": {},
"proxies": {},
"manifestVersion": "2.2",
"frozen": true,
"app": {
"address": "0xf5829D56998ccC1405B7eAbCCAC78164AF270D39"
},
"package": {
"address": "0xB6F8F11b166D526932ee04ffe4D25B810f619E34"
},
"provider": {
"address": "0x6290189B262fe198A51e3a3ac06A09c4782D3bD3"
},
"version": "2.2.2"
}

882
.openzeppelin/mainnet.json Normal file
View File

@ -0,0 +1,882 @@
{
"contracts": {
"PaymentSplitter": {
"address": "0xc6FBEe275DC5a4e7c6bc94bEd156fe10ee09eAba",
"constructorCode": "608060405234801561001057600080fd5b50610be3806100206000396000f3fe",
"bodyBytecodeHash": "6f1453b45140bc5e426ffccfcae058daa1fc53439580e3c9e6b7f73aac54c5d8",
"localBytecodeHash": "1b0f3688284b1c14c41ce636762c4504188969cb0e5a052159b61b87cbd4e8a8",
"deployedBytecodeHash": "1b0f3688284b1c14c41ce636762c4504188969cb0e5a052159b61b87cbd4e8a8",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_array:dyn<t_address>": {
"id": "t_array:dyn<t_address>",
"valueType": "t_address",
"length": "dyn",
"kind": "array",
"label": "address[]"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_totalShares",
"astId": 9541,
"type": "t_uint256",
"src": "555:28:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_totalReleased",
"astId": 9543,
"type": "t_uint256",
"src": "589:30:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_shares",
"astId": 9547,
"type": "t_mapping<t_uint256>",
"src": "626:43:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_released",
"astId": 9551,
"type": "t_mapping<t_uint256>",
"src": "675:45:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_payees",
"astId": 9554,
"type": "t_array:dyn<t_address>",
"src": "726:25:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "______gap",
"astId": 9800,
"type": "t_array:50<t_uint256>",
"src": "3251:29:120"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [],
"storageDiff": []
}
},
"TokenVesting": {
"address": "0x0E0C247759F066cCbd299dFADe853EdA8D2F3205",
"constructorCode": "608060405234801561001057600080fd5b506114d8806100206000396000f3fe",
"bodyBytecodeHash": "7a623cf584a99e031f19436c354675c6b43934b0d3705ffc3353558b1fb39496",
"localBytecodeHash": "e1b9a489ba9fe411cb345548cfbdfb8ef0a9a528c48a9bd07a08f5728a432ea3",
"deployedBytecodeHash": "e1b9a489ba9fe411cb345548cfbdfb8ef0a9a528c48a9bd07a08f5728a432ea3",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "Ownable",
"path": "contracts/ownership/Ownable.sol",
"label": "_owner",
"astId": 9325,
"type": "t_address",
"src": "317:22:118"
},
{
"contract": "Ownable",
"path": "contracts/ownership/Ownable.sol",
"label": "______gap",
"astId": 9436,
"type": "t_array:50<t_uint256>",
"src": "2277:29:118"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_beneficiary",
"astId": 4658,
"type": "t_address",
"src": "1148:28:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_cliff",
"astId": 4660,
"type": "t_uint256",
"src": "1278:22:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_start",
"astId": 4662,
"type": "t_uint256",
"src": "1306:22:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_duration",
"astId": 4664,
"type": "t_uint256",
"src": "1334:25:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_revocable",
"astId": 4666,
"type": "t_bool",
"src": "1366:23:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_released",
"astId": 4670,
"type": "t_mapping<t_uint256>",
"src": "1396:46:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_revoked",
"astId": 4674,
"type": "t_mapping<t_bool>",
"src": "1448:42:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "______gap",
"astId": 5016,
"type": "t_array:50<t_uint256>",
"src": "5852:29:36"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [],
"storageDiff": []
}
},
"StandaloneERC721": {
"address": "0xf9D147d5ECfd57EF817EF75B4a329f4fFbb4f100",
"constructorCode": "608060405234801561001057600080fd5b506135c8806100206000396000f3fe",
"bodyBytecodeHash": "b71f19d62583c08240fd85bec42565407f679b1873d7f6e97295a894c7864e2d",
"localBytecodeHash": "2e71874460f43d0696496418b1abf57ed58ce1dc524044860260dda9d7de7fab",
"deployedBytecodeHash": "2e71874460f43d0696496418b1abf57ed58ce1dc524044860260dda9d7de7fab",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_mapping<t_address>": {
"id": "t_mapping<t_address>",
"valueType": "t_address",
"label": "mapping(key => address)",
"kind": "mapping"
},
"t_struct<Counters.Counter>": {
"id": "t_struct<Counters.Counter>",
"kind": "struct",
"label": "Counters.Counter",
"members": [
{
"label": "_value",
"astId": 3632,
"type": "t_uint256",
"src": "1021:14:30"
}
]
},
"t_mapping<t_struct<Counters.Counter>>": {
"id": "t_mapping<t_struct<Counters.Counter>>",
"valueType": "t_struct<Counters.Counter>",
"label": "mapping(key => Counters.Counter)",
"kind": "mapping"
},
"t_array:dyn<t_uint256>": {
"id": "t_array:dyn<t_uint256>",
"valueType": "t_uint256",
"length": "dyn",
"kind": "array",
"label": "uint256[]"
},
"t_mapping<t_array:dyn<t_uint256>>": {
"id": "t_mapping<t_array:dyn<t_uint256>>",
"valueType": "t_array:dyn<t_uint256>",
"label": "mapping(key => uint256[])",
"kind": "mapping"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_string": {
"id": "t_string",
"kind": "elementary",
"label": "string"
},
"t_mapping<t_string>": {
"id": "t_mapping<t_string>",
"valueType": "t_string",
"label": "mapping(key => string)",
"kind": "mapping"
},
"t_struct<Roles.Role>": {
"id": "t_struct<Roles.Role>",
"kind": "struct",
"label": "Roles.Role",
"members": [
{
"label": "bearer",
"astId": 1222,
"type": "t_mapping<t_bool>",
"src": "150:32:8"
}
]
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "ERC165",
"path": "contracts/introspection/ERC165.sol",
"label": "_supportedInterfaces",
"astId": 5191,
"type": "t_mapping<t_bool>",
"src": "511:52:39"
},
{
"contract": "ERC165",
"path": "contracts/introspection/ERC165.sol",
"label": "______gap",
"astId": 5235,
"type": "t_array:50<t_uint256>",
"src": "1244:29:39"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_tokenOwner",
"astId": 11595,
"type": "t_mapping<t_address>",
"src": "844:48:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_tokenApprovals",
"astId": 11599,
"type": "t_mapping<t_address>",
"src": "948:52:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_ownedTokensCount",
"astId": 11603,
"type": "t_mapping<t_struct<Counters.Counter>>",
"src": "1058:63:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_operatorApprovals",
"astId": 11609,
"type": "t_mapping<t_bool>",
"src": "1176:73:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "______gap",
"astId": 12132,
"type": "t_array:50<t_uint256>",
"src": "11673:29:135"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_ownedTokens",
"astId": 12183,
"type": "t_mapping<t_array:dyn<t_uint256>>",
"src": "460:50:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_ownedTokensIndex",
"astId": 12187,
"type": "t_mapping<t_uint256>",
"src": "580:53:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_allTokens",
"astId": 12190,
"type": "t_array:dyn<t_uint256>",
"src": "694:28:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_allTokensIndex",
"astId": 12194,
"type": "t_mapping<t_uint256>",
"src": "793:51:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "______gap",
"astId": 12523,
"type": "t_array:50<t_uint256>",
"src": "8816:29:137"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_name",
"astId": 12590,
"type": "t_string",
"src": "281:20:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_symbol",
"astId": 12592,
"type": "t_string",
"src": "328:22:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_tokenURIs",
"astId": 12596,
"type": "t_mapping<t_string>",
"src": "396:45:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "______gap",
"astId": 12725,
"type": "t_array:50<t_uint256>",
"src": "2849:29:140"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "______gap",
"astId": 1547,
"type": "t_array:50<t_uint256>",
"src": "1096:29:10"
},
{
"contract": "ERC721MetadataMintable",
"path": "contracts/token/ERC721/ERC721MetadataMintable.sol",
"label": "______gap",
"astId": 12795,
"type": "t_array:50<t_uint256>",
"src": "1055:29:141"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "______gap",
"astId": 1666,
"type": "t_array:50<t_uint256>",
"src": "1096:29:11"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "_paused",
"astId": 5401,
"type": "t_bool",
"src": "367:20:42"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "______gap",
"astId": 5482,
"type": "t_array:50<t_uint256>",
"src": "1444:29:42"
},
{
"contract": "ERC721Pausable",
"path": "contracts/token/ERC721/ERC721Pausable.sol",
"label": "______gap",
"astId": 12940,
"type": "t_array:50<t_uint256>",
"src": "865:29:143"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_ownedTokensCount",
"astId": 11603,
"type": "t_mapping<t_struct<Counters.Counter>>",
"src": "1058:63:135"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
}
],
"storageDiff": []
}
},
"StandaloneERC20": {
"address": "0x2dD5AD2ab73E0cD7E7A05c63aD7D40deD284B69A",
"constructorCode": "608060405234801561001057600080fd5b5061290d806100206000396000f3fe",
"bodyBytecodeHash": "fffcccf2a7439f83b3eb59e01f5217ea14764c782fde08c6edd511f0c7d1e742",
"localBytecodeHash": "be0848d29ef0345b76e9810a67328a1deb1a7b07dd050c9212d3099430cf4222",
"deployedBytecodeHash": "be0848d29ef0345b76e9810a67328a1deb1a7b07dd050c9212d3099430cf4222",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_string": {
"id": "t_string",
"kind": "elementary",
"label": "string"
},
"t_uint8": {
"id": "t_uint8",
"kind": "elementary",
"label": "uint8"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_struct<Roles.Role>": {
"id": "t_struct<Roles.Role>",
"kind": "struct",
"label": "Roles.Role",
"members": [
{
"label": "bearer",
"astId": 1222,
"type": "t_mapping<t_bool>",
"src": "150:32:8"
}
]
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_name",
"astId": 10735,
"type": "t_string",
"src": "397:20:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_symbol",
"astId": 10737,
"type": "t_string",
"src": "423:22:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_decimals",
"astId": 10739,
"type": "t_uint8",
"src": "451:23:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "______gap",
"astId": 10791,
"type": "t_array:50<t_uint256>",
"src": "1112:29:128"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_balances",
"astId": 10239,
"type": "t_mapping<t_uint256>",
"src": "767:46:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_allowed",
"astId": 10245,
"type": "t_mapping<t_uint256>",
"src": "820:66:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_totalSupply",
"astId": 10247,
"type": "t_uint256",
"src": "893:28:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "______gap",
"astId": 10612,
"type": "t_array:50<t_uint256>",
"src": "7729:29:125"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "______gap",
"astId": 1547,
"type": "t_array:50<t_uint256>",
"src": "1096:29:10"
},
{
"contract": "ERC20Mintable",
"path": "contracts/token/ERC20/ERC20Mintable.sol",
"label": "______gap",
"astId": 10840,
"type": "t_array:50<t_uint256>",
"src": "760:29:129"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "______gap",
"astId": 1666,
"type": "t_array:50<t_uint256>",
"src": "1096:29:11"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "_paused",
"astId": 5401,
"type": "t_bool",
"src": "367:20:42"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "______gap",
"astId": 5482,
"type": "t_array:50<t_uint256>",
"src": "1444:29:42"
},
{
"contract": "ERC20Pausable",
"path": "contracts/token/ERC20/ERC20Pausable.sol",
"label": "______gap",
"astId": 10963,
"type": "t_array:50<t_uint256>",
"src": "1209:29:130"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": []
}
}
},
"solidityLibs": {},
"proxies": {},
"manifestVersion": "2.2",
"frozen": true,
"app": {
"address": "0x2Ba1a8C7352a5B5Ea3ea3408F89e1bA7920d36CE"
},
"package": {
"address": "0x778dddF23Ec1B5Cb18394c6C110480CaaDB3B0f6"
},
"provider": {
"address": "0xd49C0d11A4a7E49c64d954261570FD2d1589f5d2"
},
"version": "2.2.2"
}

View File

@ -0,0 +1,19 @@
{
"manifestVersion": "2.2",
"name": "@openzeppelin/contracts-ethereum-package",
"publish": true,
"version": "2.2.2",
"contracts": {
"StandaloneERC20": "StandaloneERC20",
"StandaloneERC721": "StandaloneERC721",
"TokenVesting": "TokenVesting",
"PaymentSplitter": "PaymentSplitter"
},
"dependencies": {},
"compiler": {
"manager": "truffle",
"compilerSettings": {
"optimizer": {}
}
}
}

923
.openzeppelin/rinkeby.json Normal file
View File

@ -0,0 +1,923 @@
{
"contracts": {
"PaymentSplitter": {
"address": "0x83aa4099354E7A315939f4c2E06927175e7C649c",
"constructorCode": "608060405234801561001057600080fd5b50610be3806100206000396000f3fe",
"bodyBytecodeHash": "6f1453b45140bc5e426ffccfcae058daa1fc53439580e3c9e6b7f73aac54c5d8",
"localBytecodeHash": "1b0f3688284b1c14c41ce636762c4504188969cb0e5a052159b61b87cbd4e8a8",
"deployedBytecodeHash": "1b0f3688284b1c14c41ce636762c4504188969cb0e5a052159b61b87cbd4e8a8",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_array:dyn<t_address>": {
"id": "t_array:dyn<t_address>",
"valueType": "t_address",
"length": "dyn",
"kind": "array",
"label": "address[]"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_totalShares",
"astId": 9541,
"type": "t_uint256",
"src": "555:28:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_totalReleased",
"astId": 9543,
"type": "t_uint256",
"src": "589:30:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_shares",
"astId": 9547,
"type": "t_mapping<t_uint256>",
"src": "626:43:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_released",
"astId": 9551,
"type": "t_mapping<t_uint256>",
"src": "675:45:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_payees",
"astId": 9554,
"type": "t_array:dyn<t_address>",
"src": "726:25:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "______gap",
"astId": 9800,
"type": "t_array:50<t_uint256>",
"src": "3251:29:120"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [],
"storageDiff": []
}
},
"StandaloneERC20": {
"address": "0x55855896e5c5407562b3FE1c1Bb7Bf332aFfDa94",
"constructorCode": "608060405234801561001057600080fd5b5061290d806100206000396000f3fe",
"bodyBytecodeHash": "fffcccf2a7439f83b3eb59e01f5217ea14764c782fde08c6edd511f0c7d1e742",
"localBytecodeHash": "be0848d29ef0345b76e9810a67328a1deb1a7b07dd050c9212d3099430cf4222",
"deployedBytecodeHash": "be0848d29ef0345b76e9810a67328a1deb1a7b07dd050c9212d3099430cf4222",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_string": {
"id": "t_string",
"kind": "elementary",
"label": "string"
},
"t_uint8": {
"id": "t_uint8",
"kind": "elementary",
"label": "uint8"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_struct<Roles.Role>": {
"id": "t_struct<Roles.Role>",
"kind": "struct",
"label": "Roles.Role",
"members": [
{
"label": "bearer",
"astId": 1222,
"type": "t_mapping<t_bool>",
"src": "150:32:8"
}
]
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_name",
"astId": 10735,
"type": "t_string",
"src": "397:20:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_symbol",
"astId": 10737,
"type": "t_string",
"src": "423:22:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_decimals",
"astId": 10739,
"type": "t_uint8",
"src": "451:23:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "______gap",
"astId": 10791,
"type": "t_array:50<t_uint256>",
"src": "1112:29:128"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_balances",
"astId": 10239,
"type": "t_mapping<t_uint256>",
"src": "767:46:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_allowed",
"astId": 10245,
"type": "t_mapping<t_uint256>",
"src": "820:66:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_totalSupply",
"astId": 10247,
"type": "t_uint256",
"src": "893:28:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "______gap",
"astId": 10612,
"type": "t_array:50<t_uint256>",
"src": "7729:29:125"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "______gap",
"astId": 1547,
"type": "t_array:50<t_uint256>",
"src": "1096:29:10"
},
{
"contract": "ERC20Mintable",
"path": "contracts/token/ERC20/ERC20Mintable.sol",
"label": "______gap",
"astId": 10840,
"type": "t_array:50<t_uint256>",
"src": "760:29:129"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "______gap",
"astId": 1666,
"type": "t_array:50<t_uint256>",
"src": "1096:29:11"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "_paused",
"astId": 5401,
"type": "t_bool",
"src": "367:20:42"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "______gap",
"astId": 5482,
"type": "t_array:50<t_uint256>",
"src": "1444:29:42"
},
{
"contract": "ERC20Pausable",
"path": "contracts/token/ERC20/ERC20Pausable.sol",
"label": "______gap",
"astId": 10963,
"type": "t_array:50<t_uint256>",
"src": "1209:29:130"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
}
],
"storageDiff": [
{
"action": "rename",
"updated": {
"index": 8,
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_allowed",
"astId": 10245,
"type": "t_mapping<t_uint256>",
"src": "820:66:125"
},
"original": {
"index": 8,
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_allowances",
"astId": 9135,
"type": "t_mapping<t_uint256>",
"src": "1410:69:115"
}
}
]
}
},
"TokenVesting": {
"address": "0x5B22A5512831ce01269BAbCA8174318f59408435",
"constructorCode": "608060405234801561001057600080fd5b506114d8806100206000396000f3fe",
"bodyBytecodeHash": "7a623cf584a99e031f19436c354675c6b43934b0d3705ffc3353558b1fb39496",
"localBytecodeHash": "e1b9a489ba9fe411cb345548cfbdfb8ef0a9a528c48a9bd07a08f5728a432ea3",
"deployedBytecodeHash": "e1b9a489ba9fe411cb345548cfbdfb8ef0a9a528c48a9bd07a08f5728a432ea3",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "Ownable",
"path": "contracts/ownership/Ownable.sol",
"label": "_owner",
"astId": 9325,
"type": "t_address",
"src": "317:22:118"
},
{
"contract": "Ownable",
"path": "contracts/ownership/Ownable.sol",
"label": "______gap",
"astId": 9436,
"type": "t_array:50<t_uint256>",
"src": "2277:29:118"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_beneficiary",
"astId": 4658,
"type": "t_address",
"src": "1148:28:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_cliff",
"astId": 4660,
"type": "t_uint256",
"src": "1278:22:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_start",
"astId": 4662,
"type": "t_uint256",
"src": "1306:22:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_duration",
"astId": 4664,
"type": "t_uint256",
"src": "1334:25:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_revocable",
"astId": 4666,
"type": "t_bool",
"src": "1366:23:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_released",
"astId": 4670,
"type": "t_mapping<t_uint256>",
"src": "1396:46:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_revoked",
"astId": 4674,
"type": "t_mapping<t_bool>",
"src": "1448:42:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "______gap",
"astId": 5016,
"type": "t_array:50<t_uint256>",
"src": "5852:29:36"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [],
"storageDiff": []
}
},
"StandaloneERC721": {
"address": "0xfcdA0Ae8c7181521c632550de92B1FB3937D166C",
"constructorCode": "608060405234801561001057600080fd5b506135c8806100206000396000f3fe",
"bodyBytecodeHash": "b71f19d62583c08240fd85bec42565407f679b1873d7f6e97295a894c7864e2d",
"localBytecodeHash": "2e71874460f43d0696496418b1abf57ed58ce1dc524044860260dda9d7de7fab",
"deployedBytecodeHash": "2e71874460f43d0696496418b1abf57ed58ce1dc524044860260dda9d7de7fab",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_mapping<t_address>": {
"id": "t_mapping<t_address>",
"valueType": "t_address",
"label": "mapping(key => address)",
"kind": "mapping"
},
"t_struct<Counters.Counter>": {
"id": "t_struct<Counters.Counter>",
"kind": "struct",
"label": "Counters.Counter",
"members": [
{
"label": "_value",
"astId": 3632,
"type": "t_uint256",
"src": "1021:14:30"
}
]
},
"t_mapping<t_struct<Counters.Counter>>": {
"id": "t_mapping<t_struct<Counters.Counter>>",
"valueType": "t_struct<Counters.Counter>",
"label": "mapping(key => Counters.Counter)",
"kind": "mapping"
},
"t_array:dyn<t_uint256>": {
"id": "t_array:dyn<t_uint256>",
"valueType": "t_uint256",
"length": "dyn",
"kind": "array",
"label": "uint256[]"
},
"t_mapping<t_array:dyn<t_uint256>>": {
"id": "t_mapping<t_array:dyn<t_uint256>>",
"valueType": "t_array:dyn<t_uint256>",
"label": "mapping(key => uint256[])",
"kind": "mapping"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_string": {
"id": "t_string",
"kind": "elementary",
"label": "string"
},
"t_mapping<t_string>": {
"id": "t_mapping<t_string>",
"valueType": "t_string",
"label": "mapping(key => string)",
"kind": "mapping"
},
"t_struct<Roles.Role>": {
"id": "t_struct<Roles.Role>",
"kind": "struct",
"label": "Roles.Role",
"members": [
{
"label": "bearer",
"astId": 1222,
"type": "t_mapping<t_bool>",
"src": "150:32:8"
}
]
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "ERC165",
"path": "contracts/introspection/ERC165.sol",
"label": "_supportedInterfaces",
"astId": 5191,
"type": "t_mapping<t_bool>",
"src": "511:52:39"
},
{
"contract": "ERC165",
"path": "contracts/introspection/ERC165.sol",
"label": "______gap",
"astId": 5235,
"type": "t_array:50<t_uint256>",
"src": "1244:29:39"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_tokenOwner",
"astId": 11595,
"type": "t_mapping<t_address>",
"src": "844:48:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_tokenApprovals",
"astId": 11599,
"type": "t_mapping<t_address>",
"src": "948:52:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_ownedTokensCount",
"astId": 11603,
"type": "t_mapping<t_struct<Counters.Counter>>",
"src": "1058:63:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_operatorApprovals",
"astId": 11609,
"type": "t_mapping<t_bool>",
"src": "1176:73:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "______gap",
"astId": 12132,
"type": "t_array:50<t_uint256>",
"src": "11673:29:135"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_ownedTokens",
"astId": 12183,
"type": "t_mapping<t_array:dyn<t_uint256>>",
"src": "460:50:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_ownedTokensIndex",
"astId": 12187,
"type": "t_mapping<t_uint256>",
"src": "580:53:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_allTokens",
"astId": 12190,
"type": "t_array:dyn<t_uint256>",
"src": "694:28:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_allTokensIndex",
"astId": 12194,
"type": "t_mapping<t_uint256>",
"src": "793:51:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "______gap",
"astId": 12523,
"type": "t_array:50<t_uint256>",
"src": "8816:29:137"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_name",
"astId": 12590,
"type": "t_string",
"src": "281:20:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_symbol",
"astId": 12592,
"type": "t_string",
"src": "328:22:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_tokenURIs",
"astId": 12596,
"type": "t_mapping<t_string>",
"src": "396:45:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "______gap",
"astId": 12725,
"type": "t_array:50<t_uint256>",
"src": "2849:29:140"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "______gap",
"astId": 1547,
"type": "t_array:50<t_uint256>",
"src": "1096:29:10"
},
{
"contract": "ERC721MetadataMintable",
"path": "contracts/token/ERC721/ERC721MetadataMintable.sol",
"label": "______gap",
"astId": 12795,
"type": "t_array:50<t_uint256>",
"src": "1055:29:141"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "______gap",
"astId": 1666,
"type": "t_array:50<t_uint256>",
"src": "1096:29:11"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "_paused",
"astId": 5401,
"type": "t_bool",
"src": "367:20:42"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "______gap",
"astId": 5482,
"type": "t_array:50<t_uint256>",
"src": "1444:29:42"
},
{
"contract": "ERC721Pausable",
"path": "contracts/token/ERC721/ERC721Pausable.sol",
"label": "______gap",
"astId": 12940,
"type": "t_array:50<t_uint256>",
"src": "865:29:143"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_ownedTokensCount",
"astId": 11603,
"type": "t_mapping<t_struct<Counters.Counter>>",
"src": "1058:63:135"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
}
],
"storageDiff": []
}
}
},
"solidityLibs": {},
"proxies": {},
"manifestVersion": "2.2",
"frozen": true,
"app": {
"address": "0x291439E6444dAEc9e47Ae359Aa79FD1811A42679"
},
"package": {
"address": "0xa44bb80b290dE8a465d17B14269dF53CF0B9Bf4f"
},
"provider": {
"address": "0x3629bdF19982A06a7a2Fdfac75aC2dA7F5BC3359"
},
"version": "2.2.2"
}

923
.openzeppelin/ropsten.json Normal file
View File

@ -0,0 +1,923 @@
{
"contracts": {
"StandaloneERC721": {
"address": "0x55C0f7e0B33d414B5541147CFe04E4F6d0dF3616",
"constructorCode": "608060405234801561001057600080fd5b506135c8806100206000396000f3fe",
"bodyBytecodeHash": "b71f19d62583c08240fd85bec42565407f679b1873d7f6e97295a894c7864e2d",
"localBytecodeHash": "2e71874460f43d0696496418b1abf57ed58ce1dc524044860260dda9d7de7fab",
"deployedBytecodeHash": "2e71874460f43d0696496418b1abf57ed58ce1dc524044860260dda9d7de7fab",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_mapping<t_address>": {
"id": "t_mapping<t_address>",
"valueType": "t_address",
"label": "mapping(key => address)",
"kind": "mapping"
},
"t_struct<Counters.Counter>": {
"id": "t_struct<Counters.Counter>",
"kind": "struct",
"label": "Counters.Counter",
"members": [
{
"label": "_value",
"astId": 3632,
"type": "t_uint256",
"src": "1021:14:30"
}
]
},
"t_mapping<t_struct<Counters.Counter>>": {
"id": "t_mapping<t_struct<Counters.Counter>>",
"valueType": "t_struct<Counters.Counter>",
"label": "mapping(key => Counters.Counter)",
"kind": "mapping"
},
"t_array:dyn<t_uint256>": {
"id": "t_array:dyn<t_uint256>",
"valueType": "t_uint256",
"length": "dyn",
"kind": "array",
"label": "uint256[]"
},
"t_mapping<t_array:dyn<t_uint256>>": {
"id": "t_mapping<t_array:dyn<t_uint256>>",
"valueType": "t_array:dyn<t_uint256>",
"label": "mapping(key => uint256[])",
"kind": "mapping"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_string": {
"id": "t_string",
"kind": "elementary",
"label": "string"
},
"t_mapping<t_string>": {
"id": "t_mapping<t_string>",
"valueType": "t_string",
"label": "mapping(key => string)",
"kind": "mapping"
},
"t_struct<Roles.Role>": {
"id": "t_struct<Roles.Role>",
"kind": "struct",
"label": "Roles.Role",
"members": [
{
"label": "bearer",
"astId": 1222,
"type": "t_mapping<t_bool>",
"src": "150:32:8"
}
]
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "ERC165",
"path": "contracts/introspection/ERC165.sol",
"label": "_supportedInterfaces",
"astId": 5191,
"type": "t_mapping<t_bool>",
"src": "511:52:39"
},
{
"contract": "ERC165",
"path": "contracts/introspection/ERC165.sol",
"label": "______gap",
"astId": 5235,
"type": "t_array:50<t_uint256>",
"src": "1244:29:39"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_tokenOwner",
"astId": 11595,
"type": "t_mapping<t_address>",
"src": "844:48:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_tokenApprovals",
"astId": 11599,
"type": "t_mapping<t_address>",
"src": "948:52:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_ownedTokensCount",
"astId": 11603,
"type": "t_mapping<t_struct<Counters.Counter>>",
"src": "1058:63:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_operatorApprovals",
"astId": 11609,
"type": "t_mapping<t_bool>",
"src": "1176:73:135"
},
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "______gap",
"astId": 12132,
"type": "t_array:50<t_uint256>",
"src": "11673:29:135"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_ownedTokens",
"astId": 12183,
"type": "t_mapping<t_array:dyn<t_uint256>>",
"src": "460:50:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_ownedTokensIndex",
"astId": 12187,
"type": "t_mapping<t_uint256>",
"src": "580:53:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_allTokens",
"astId": 12190,
"type": "t_array:dyn<t_uint256>",
"src": "694:28:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "_allTokensIndex",
"astId": 12194,
"type": "t_mapping<t_uint256>",
"src": "793:51:137"
},
{
"contract": "ERC721Enumerable",
"path": "contracts/token/ERC721/ERC721Enumerable.sol",
"label": "______gap",
"astId": 12523,
"type": "t_array:50<t_uint256>",
"src": "8816:29:137"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_name",
"astId": 12590,
"type": "t_string",
"src": "281:20:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_symbol",
"astId": 12592,
"type": "t_string",
"src": "328:22:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "_tokenURIs",
"astId": 12596,
"type": "t_mapping<t_string>",
"src": "396:45:140"
},
{
"contract": "ERC721Metadata",
"path": "contracts/token/ERC721/ERC721Metadata.sol",
"label": "______gap",
"astId": 12725,
"type": "t_array:50<t_uint256>",
"src": "2849:29:140"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "______gap",
"astId": 1547,
"type": "t_array:50<t_uint256>",
"src": "1096:29:10"
},
{
"contract": "ERC721MetadataMintable",
"path": "contracts/token/ERC721/ERC721MetadataMintable.sol",
"label": "______gap",
"astId": 12795,
"type": "t_array:50<t_uint256>",
"src": "1055:29:141"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "______gap",
"astId": 1666,
"type": "t_array:50<t_uint256>",
"src": "1096:29:11"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "_paused",
"astId": 5401,
"type": "t_bool",
"src": "367:20:42"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "______gap",
"astId": 5482,
"type": "t_array:50<t_uint256>",
"src": "1444:29:42"
},
{
"contract": "ERC721Pausable",
"path": "contracts/token/ERC721/ERC721Pausable.sol",
"label": "______gap",
"astId": 12940,
"type": "t_array:50<t_uint256>",
"src": "865:29:143"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [
{
"contract": "ERC721",
"path": "contracts/token/ERC721/ERC721.sol",
"label": "_ownedTokensCount",
"astId": 11603,
"type": "t_mapping<t_struct<Counters.Counter>>",
"src": "1058:63:135"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
}
],
"storageDiff": []
}
},
"StandaloneERC20": {
"address": "0x5224DbE42faAB502612f871FB8f45A26bB0B0C13",
"constructorCode": "608060405234801561001057600080fd5b5061290d806100206000396000f3fe",
"bodyBytecodeHash": "fffcccf2a7439f83b3eb59e01f5217ea14764c782fde08c6edd511f0c7d1e742",
"localBytecodeHash": "be0848d29ef0345b76e9810a67328a1deb1a7b07dd050c9212d3099430cf4222",
"deployedBytecodeHash": "be0848d29ef0345b76e9810a67328a1deb1a7b07dd050c9212d3099430cf4222",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_string": {
"id": "t_string",
"kind": "elementary",
"label": "string"
},
"t_uint8": {
"id": "t_uint8",
"kind": "elementary",
"label": "uint8"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_struct<Roles.Role>": {
"id": "t_struct<Roles.Role>",
"kind": "struct",
"label": "Roles.Role",
"members": [
{
"label": "bearer",
"astId": 1222,
"type": "t_mapping<t_bool>",
"src": "150:32:8"
}
]
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_name",
"astId": 10735,
"type": "t_string",
"src": "397:20:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_symbol",
"astId": 10737,
"type": "t_string",
"src": "423:22:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "_decimals",
"astId": 10739,
"type": "t_uint8",
"src": "451:23:128"
},
{
"contract": "ERC20Detailed",
"path": "contracts/token/ERC20/ERC20Detailed.sol",
"label": "______gap",
"astId": 10791,
"type": "t_array:50<t_uint256>",
"src": "1112:29:128"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_balances",
"astId": 10239,
"type": "t_mapping<t_uint256>",
"src": "767:46:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_allowed",
"astId": 10245,
"type": "t_mapping<t_uint256>",
"src": "820:66:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_totalSupply",
"astId": 10247,
"type": "t_uint256",
"src": "893:28:125"
},
{
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "______gap",
"astId": 10612,
"type": "t_array:50<t_uint256>",
"src": "7729:29:125"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "______gap",
"astId": 1547,
"type": "t_array:50<t_uint256>",
"src": "1096:29:10"
},
{
"contract": "ERC20Mintable",
"path": "contracts/token/ERC20/ERC20Mintable.sol",
"label": "______gap",
"astId": 10840,
"type": "t_array:50<t_uint256>",
"src": "760:29:129"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "______gap",
"astId": 1666,
"type": "t_array:50<t_uint256>",
"src": "1096:29:11"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "_paused",
"astId": 5401,
"type": "t_bool",
"src": "367:20:42"
},
{
"contract": "Pausable",
"path": "contracts/lifecycle/Pausable.sol",
"label": "______gap",
"astId": 5482,
"type": "t_array:50<t_uint256>",
"src": "1444:29:42"
},
{
"contract": "ERC20Pausable",
"path": "contracts/token/ERC20/ERC20Pausable.sol",
"label": "______gap",
"astId": 10963,
"type": "t_array:50<t_uint256>",
"src": "1209:29:130"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [
{
"contract": "MinterRole",
"path": "contracts/access/roles/MinterRole.sol",
"label": "_minters",
"astId": 1448,
"type": "t_struct<Roles.Role>",
"src": "286:27:10"
},
{
"contract": "PauserRole",
"path": "contracts/access/roles/PauserRole.sol",
"label": "_pausers",
"astId": 1567,
"type": "t_struct<Roles.Role>",
"src": "286:27:11"
}
],
"storageDiff": [
{
"action": "rename",
"updated": {
"index": 8,
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_allowed",
"astId": 10245,
"type": "t_mapping<t_uint256>",
"src": "820:66:125"
},
"original": {
"index": 8,
"contract": "ERC20",
"path": "contracts/token/ERC20/ERC20.sol",
"label": "_allowances",
"astId": 9135,
"type": "t_mapping<t_uint256>",
"src": "1410:69:115"
}
}
]
}
},
"TokenVesting": {
"address": "0x2c0Ba048b8dd92c8f8c437F584bA0E8C5745C11e",
"constructorCode": "608060405234801561001057600080fd5b506114d8806100206000396000f3fe",
"bodyBytecodeHash": "7a623cf584a99e031f19436c354675c6b43934b0d3705ffc3353558b1fb39496",
"localBytecodeHash": "e1b9a489ba9fe411cb345548cfbdfb8ef0a9a528c48a9bd07a08f5728a432ea3",
"deployedBytecodeHash": "e1b9a489ba9fe411cb345548cfbdfb8ef0a9a528c48a9bd07a08f5728a432ea3",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_mapping<t_bool>": {
"id": "t_mapping<t_bool>",
"valueType": "t_bool",
"label": "mapping(key => bool)",
"kind": "mapping"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "Ownable",
"path": "contracts/ownership/Ownable.sol",
"label": "_owner",
"astId": 9325,
"type": "t_address",
"src": "317:22:118"
},
{
"contract": "Ownable",
"path": "contracts/ownership/Ownable.sol",
"label": "______gap",
"astId": 9436,
"type": "t_array:50<t_uint256>",
"src": "2277:29:118"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_beneficiary",
"astId": 4658,
"type": "t_address",
"src": "1148:28:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_cliff",
"astId": 4660,
"type": "t_uint256",
"src": "1278:22:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_start",
"astId": 4662,
"type": "t_uint256",
"src": "1306:22:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_duration",
"astId": 4664,
"type": "t_uint256",
"src": "1334:25:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_revocable",
"astId": 4666,
"type": "t_bool",
"src": "1366:23:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_released",
"astId": 4670,
"type": "t_mapping<t_uint256>",
"src": "1396:46:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "_revoked",
"astId": 4674,
"type": "t_mapping<t_bool>",
"src": "1448:42:36"
},
{
"contract": "TokenVesting",
"path": "contracts/drafts/TokenVesting.sol",
"label": "______gap",
"astId": 5016,
"type": "t_array:50<t_uint256>",
"src": "5852:29:36"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [],
"storageDiff": []
}
},
"PaymentSplitter": {
"address": "0xa4988102Dd242B1cF0f50bD6f0D702C08B943Cba",
"constructorCode": "608060405234801561001057600080fd5b50610be3806100206000396000f3fe",
"bodyBytecodeHash": "6f1453b45140bc5e426ffccfcae058daa1fc53439580e3c9e6b7f73aac54c5d8",
"localBytecodeHash": "1b0f3688284b1c14c41ce636762c4504188969cb0e5a052159b61b87cbd4e8a8",
"deployedBytecodeHash": "1b0f3688284b1c14c41ce636762c4504188969cb0e5a052159b61b87cbd4e8a8",
"types": {
"t_bool": {
"id": "t_bool",
"kind": "elementary",
"label": "bool"
},
"t_uint256": {
"id": "t_uint256",
"kind": "elementary",
"label": "uint256"
},
"t_array:50<t_uint256>": {
"id": "t_array:50<t_uint256>",
"valueType": "t_uint256",
"length": "50",
"kind": "array",
"label": "uint256[50]"
},
"t_mapping<t_uint256>": {
"id": "t_mapping<t_uint256>",
"valueType": "t_uint256",
"label": "mapping(key => uint256)",
"kind": "mapping"
},
"t_address": {
"id": "t_address",
"kind": "elementary",
"label": "address"
},
"t_array:dyn<t_address>": {
"id": "t_array:dyn<t_address>",
"valueType": "t_address",
"length": "dyn",
"kind": "array",
"label": "address[]"
}
},
"storage": [
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initialized",
"astId": 13400,
"type": "t_bool",
"src": "757:24:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "initializing",
"astId": 13402,
"type": "t_bool",
"src": "876:25:153"
},
{
"contract": "Initializable",
"path": "@openzeppelin/upgrades/contracts/Initializable.sol",
"label": "______gap",
"astId": 13458,
"type": "t_array:50<t_uint256>",
"src": "1951:29:153"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_totalShares",
"astId": 9541,
"type": "t_uint256",
"src": "555:28:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_totalReleased",
"astId": 9543,
"type": "t_uint256",
"src": "589:30:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_shares",
"astId": 9547,
"type": "t_mapping<t_uint256>",
"src": "626:43:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_released",
"astId": 9551,
"type": "t_mapping<t_uint256>",
"src": "675:45:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "_payees",
"astId": 9554,
"type": "t_array:dyn<t_address>",
"src": "726:25:120"
},
{
"contract": "PaymentSplitter",
"path": "contracts/payment/PaymentSplitter.sol",
"label": "______gap",
"astId": 9800,
"type": "t_array:50<t_uint256>",
"src": "3251:29:120"
}
],
"warnings": {
"hasConstructor": false,
"hasSelfDestruct": false,
"hasDelegateCall": false,
"hasInitialValuesInDeclarations": false,
"uninitializedBaseContracts": [],
"storageUncheckedVars": [],
"storageDiff": []
}
}
},
"solidityLibs": {},
"proxies": {},
"manifestVersion": "2.2",
"frozen": true,
"app": {
"address": "0x27a09abCA2c4d9F914dbC7BeA164b0e6b74Ce7a9"
},
"package": {
"address": "0x2a9e7B63514438906A83a1e320dBBD814D417002"
},
"provider": {
"address": "0xdE16eC017431009ebE329E54D399CB4d5e161B8d"
},
"version": "2.2.2"
}

View File

@ -1,15 +0,0 @@
{
"printWidth": 120,
"singleQuote": true,
"trailingComma": "all",
"arrowParens": "avoid",
"overrides": [
{
"files": "*.sol",
"options": {
"singleQuote": false
}
}
],
"plugins": ["prettier-plugin-solidity"]
}

View File

@ -1,21 +1,9 @@
module.exports = {
norpc: true,
testCommand: 'npm test',
compileCommand: 'npm run compile',
skipFiles: ['mocks'],
providerOptions: {
default_balance_ether: '10000000000000000000000000',
},
mocha: {
fgrep: '[skip-on-coverage]',
invert: true,
},
// Work around stack too deep for coverage
configureYulOptimizer: true,
solcOptimizerDetails: {
yul: true,
yulDetails: {
optimizerSteps: '',
},
},
};
norpc: true,
testCommand: 'node --max-old-space-size=4096 ../node_modules/.bin/truffle test --network coverage',
compileCommand: 'node --max-old-space-size=4096 ../node_modules/.bin/truffle compile --network coverage',
skipFiles: [
'lifecycle/Migrations.sol',
'mocks'
]
}

11
.solhint.json Normal file
View File

@ -0,0 +1,11 @@
{
"extends": "default",
"rules": {
"indent": ["error", 4],
"bracket-align": false,
"compiler-fixed": false,
"no-simple-event-func-name": false,
"two-lines-top-level-separator": false
}
}

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,7 @@ In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socioeconomic status, nationality, personal
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at contact@openzeppelin.com. All
reported by contacting the project team at maintainers@openzeppelin.org. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.

63
CODE_STYLE.md Normal file
View File

@ -0,0 +1,63 @@
# Code Style
We value clean code and consistency, and those are prerequisites for us to
include new code in the repository. Before proposing a change, please read this
document and take some time to familiarize yourself with the style of the
existing codebase.
## Solidity code
In order to be consistent with all the other Solidity projects, we follow the
[official recommendations documented in the Solidity style guide](http://solidity.readthedocs.io/en/latest/style-guide.html).
Any exception or additions specific to our project are documented below.
### Naming
* Try to avoid acronyms and abbreviations.
* All state variables should be private.
* Private state variables should have an underscore prefix.
```
contract TestContract {
uint256 private _privateVar;
uint256 internal _internalVar;
}
```
* Parameters must not be prefixed with an underscore.
```
function test(uint256 testParameter1, uint256 testParameter2) {
...
}
```
* Internal and private functions should have an underscore prefix.
```
function _testInternal() internal {
...
}
```
```
function _testPrivate() private {
...
}
```
* Events should be emitted immediately after the state change that they
represent, and consequently they should be named in past tense.
```
function _burn(address _who, uint256 _value) internal {
super._burn(_who, _value);
emit TokensBurned(_who, _value);
}
```
Some standards (e.g. ERC20) use present tense, and in those cases the
standard specification prevails.

View File

@ -1,36 +1,58 @@
# Contributing Guidelines
Contributing to OpenZeppelin
=======
There are many ways to contribute to OpenZeppelin Contracts.
We really appreciate and value contributions to OpenZeppelin. Please take 5' to review the items listed below to make sure that your contributions are merged as soon as possible.
## Troubleshooting
## Contribution guidelines
You can help other users in the community to solve their smart contract issues in the [OpenZeppelin Forum].
Smart contracts manage value and are highly vulnerable to errors and attacks. We have very strict guidelines, please make sure to review them: ["Contribution guidelines wiki entry"](https://github.com/OpenZeppelin/openzeppelin-solidity/wiki/Contribution-guidelines).
[OpenZeppelin Forum]: https://forum.openzeppelin.com/
## Creating Pull Requests (PRs)
## Opening an issue
As a contributor, you are expected to fork this repository, work on your own fork and then submit pull requests. The pull requests will be reviewed and eventually merged into the main repo. See ["Fork-a-Repo"](https://help.github.com/articles/fork-a-repo/) for how this works.
You can [open an issue] to suggest a feature or report a minor bug. For serious bugs please do not open an issue, instead refer to our [security policy] for appropriate steps.
*IMPORTANT*
* Please see ["Git flow wiki entry"](https://github.com/OpenZeppelin/openzeppelin-solidity/wiki/Git-flow) for understanding how to use branches in this repository.
If you believe your issue may be due to user error and not a problem in the library, consider instead posting a question on the [OpenZeppelin Forum].
## A typical workflow
Before opening an issue, be sure to search through the existing open and closed issues, and consider posting a comment in one of those instead.
1) Make sure your fork is up to date with the main repository:
When requesting a new feature, include as many details as you can, especially around the use cases that motivate it. Features are prioritized according to the impact they may have on the ecosystem, so we appreciate information showing that the impact could be high.
```
cd openzeppelin-solidity
git remote add upstream https://github.com/OpenZeppelin/openzeppelin-solidity.git
git fetch upstream
git pull --rebase upstream master
```
NOTE: The directory `openzeppelin-solidity` represents your fork's local copy.
[security policy]: https://github.com/OpenZeppelin/openzeppelin-contracts/security
[open an issue]: https://github.com/OpenZeppelin/openzeppelin-contracts/issues/new/choose
2) Branch out from `master` into `fix/some-bug-#123`:
(Postfixing #123 will associate your PR with the issue #123 and make everyone's life easier =D)
```
git checkout -b fix/some-bug-#123
```
## Submitting a pull request
3) Make your changes, add your files, commit and push to your fork.
If you would like to contribute code or documentation you may do so by forking the repository and submitting a pull request.
```
git add SomeFile.js
git commit "Fix some bug #123"
git push origin fix/some-bug-#123
```
Any non-trivial code contribution must be first discussed with the maintainers in an issue (see [Opening an issue](#opening-an-issue)). Only very minor changes are accepted without prior discussion.
4) Go to [github.com/OpenZeppelin/openzeppelin-solidity](https://github.com/OpenZeppelin/zeppelin-solidity) in your web browser and issue a new pull request.
Make sure to read and follow the [engineering guidelines](./GUIDELINES.md). Run linter and tests to make sure your pull request is good before submitting it.
*IMPORTANT* Read the PR template very carefully and make sure to follow all the instructions. These instructions
refer to some very important conditions that your PR must meet in order to be accepted, such as making sure that all tests pass, JS linting tests pass, solidity linting tests pass, etc.
Changelog entries should be added to each pull request by using [Changesets](https://github.com/changesets/changesets/).
5) Maintainers will review your code and possibly ask for changes before your code is pulled in to the main repository. We'll check that all tests pass, review the coding style, and check for general code correctness. If everything is OK, we'll merge your pull request and your code will be part of OpenZeppelin.
When opening the pull request you will be presented with a template and a series of instructions. Read through it carefully and follow all the steps. Expect a review and feedback from the maintainers afterwards.
*IMPORTANT* Please pay attention to the maintainer's feedback, since its a necessary step to keep up with the standards OpenZeppelin attains to.
If you're looking for a good place to start, look for issues labelled ["good first issue"](https://github.com/OpenZeppelin/openzeppelin-contracts/labels/good%20first%20issue)!
## All set!
If you have any questions feel free to post them to github.com/OpenZeppelin/openzeppelin-solidity/issues.
Finally, if you're looking to collaborate and want to find easy tasks to start, look at the issues we marked as ["Good first issue"](https://github.com/OpenZeppelin/openzeppelin-solidity/labels/good%20first%20issue).
Thanks for your time and code!

View File

@ -1,10 +0,0 @@
{
"drips": {
"ethereum": {
"ownedBy": "0xAeb37910f93486C85A1F8F994b67E8187554d664"
}
},
"opRetro": {
"projectId": "0x939241afa4c4b9e1dda6b8250baa8f04fa8b0debce738cfd324c0b18f9926d25"
}
}

View File

@ -1,155 +0,0 @@
# Engineering Guidelines
## Testing
Code must be thoroughly tested with quality unit tests.
We defer to the [Moloch Testing Guide](https://github.com/MolochVentures/moloch/tree/master/test#readme) for specific recommendations, though not all of it is relevant here. Note the introduction:
> Tests should be written, not only to verify correctness of the target code, but to be comprehensively reviewed by other programmers. Therefore, for mission critical Solidity code, the quality of the tests is just as important (if not more so) than the code itself, and should be written to the highest standards of clarity and elegance.
Every addition or change to the code must come with relevant and comprehensive tests.
Refactors should avoid simultaneous changes to tests.
Flaky tests are not acceptable.
The test suite should run automatically for every change in the repository, and in pull requests tests must pass before merging.
The test suite coverage must be kept as close to 100% as possible, enforced in pull requests.
In some cases unit tests may be insufficient and complementary techniques should be used:
1. Property-based tests (aka. fuzzing) for math-heavy code.
2. Formal verification for state machines.
## Code style
Solidity code should be written in a consistent format enforced by a linter, following the official [Solidity Style Guide](https://docs.soliditylang.org/en/latest/style-guide.html). See below for further [Solidity Conventions](#solidity-conventions).
The code should be simple and straightforward, prioritizing readability and understandability. Consistency and predictability should be maintained across the codebase. In particular, this applies to naming, which should be systematic, clear, and concise.
Sometimes these guidelines may be broken if doing so brings significant efficiency gains, but explanatory comments should be added.
Modularity should be pursued, but not at the cost of the above priorities.
## Documentation
For contributors, project guidelines and processes must be documented publicly.
For users, features must be abundantly documented. Documentation should include answers to common questions, solutions to common problems, and recommendations for critical decisions that the user may face.
All changes to the core codebase (excluding tests, auxiliary scripts, etc.) must be documented in a changelog, except for purely cosmetic or documentation changes.
## Peer review
All changes must be submitted through pull requests and go through peer code review.
The review must be approached by the reviewer in a similar way as if it was an audit of the code in question (but importantly it is not a substitute for and should not be considered an audit).
Reviewers should enforce code and project guidelines.
External contributions must be reviewed separately by multiple maintainers.
## Automation
Automation should be used as much as possible to reduce the possibility of human error and forgetfulness.
Automations that make use of sensitive credentials must use secure secret management, and must be strengthened against attacks such as [those on GitHub Actions workflows](https://github.com/nikitastupin/pwnhub).
Some other examples of automation are:
- Looking for common security vulnerabilities or errors in our code (eg. reentrancy analysis).
- Keeping dependencies up to date and monitoring for vulnerable dependencies.
## Pull requests
Pull requests are squash-merged to keep the `master` branch history clean. The title of the pull request becomes the commit message, so it should be written in a consistent format:
1) Begin with a capital letter.
2) Do not end with a period.
3) Write in the imperative: "Add feature X" and not "Adds feature X" or "Added feature X".
This repository does not follow conventional commits, so do not prefix the title with "fix:" or "feat:".
Work in progress pull requests should be submitted as Drafts and should not be prefixed with "WIP:".
Branch names don't matter, and commit messages within a pull request mostly don't matter either, although they can help the review process.
# Solidity Conventions
In addition to the official Solidity Style Guide we have a number of other conventions that must be followed.
* All state variables should be private.
Changes to state should be accompanied by events, and in some cases it is not correct to arbitrarily set state. Encapsulating variables as private and only allowing modification via setters enables us to ensure that events and other rules are followed reliably and prevents this kind of user error.
* Internal or private state variables or functions should have an underscore prefix.
```solidity
contract TestContract {
uint256 private _privateVar;
uint256 internal _internalVar;
function _testInternal() internal { ... }
function _testPrivate() private { ... }
}
```
* Functions should be declared virtual, with few exceptions listed below. The
contract logic should be written considering that these functions may be
overridden by developers, e.g. getting a value using an internal getter rather
than reading directly from a state variable.
If function A is an "alias" of function B, i.e. it invokes function B without
significant additional logic, then function A should not be virtual so that
any user overrides are implemented on B, preventing inconsistencies.
* Events should generally be emitted immediately after the state change that they
represent, and should be named in the past tense. Some exceptions may be made for gas
efficiency if the result doesn't affect observable ordering of events.
```solidity
function _burn(address who, uint256 value) internal {
super._burn(who, value);
emit TokensBurned(who, value);
}
```
Some standards (e.g. ERC-20) use present tense, and in those cases the
standard specification is used.
* Interface names should have a capital I prefix.
```solidity
interface IERC777 {
```
* Contracts not intended to be used standalone should be marked abstract
so they are required to be inherited to other contracts.
```solidity
abstract contract AccessControl is ..., {
```
* Return values are generally not named, unless they are not immediately clear or there are multiple return values.
```solidity
function expiration() public view returns (uint256) { // Good
function hasRole() public view returns (bool isMember, uint32 currentDelay) { // Good
```
* Unchecked arithmetic blocks should contain comments explaining why overflow is guaranteed not to happen. If the reason is immediately apparent from the line above the unchecked block, the comment may be omitted.
* Custom errors should be declared following the [EIP-6093](https://eips.ethereum.org/EIPS/eip-6093) rationale whenever reasonable. Also, consider the following:
* The domain prefix should be picked in the following order:
1. Use `ERC<number>` if the error is a violation of an ERC specification.
2. Use the name of the underlying component where it belongs (eg. `Governor`, `ECDSA`, or `Timelock`).
* The location of custom errors should be decided in the following order:
1. Take the errors from their underlying ERCs if they're already defined.
2. Declare the errors in the underlying interface/library if the error makes sense in its context.
3. Declare the error in the implementation if the underlying interface/library is not suitable to do so (eg. interface/library already specified in an ERC).
4. Declare the error in an extension if the error only happens in such extension or child contracts.
* Custom error names should not be declared twice along the library to avoid duplicated identifier declarations when inheriting from multiple contracts.

View File

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2016-2025 Zeppelin Group Ltd
Copyright (c) 2016 Smart Contract Solutions, Inc.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the

142
README.md
View File

@ -1,108 +1,112 @@
# <img src="logo.svg" alt="OpenZeppelin" height="40px">
# <img src="logo.png" alt="OpenZeppelin" height="40px">
[![Github Release](https://img.shields.io/github/v/tag/OpenZeppelin/openzeppelin-contracts.svg?filter=v*&sort=semver&label=github)](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/latest)
[![NPM Package](https://img.shields.io/npm/v/@openzeppelin/contracts.svg)](https://www.npmjs.org/package/@openzeppelin/contracts)
[![Coverage Status](https://codecov.io/gh/OpenZeppelin/openzeppelin-contracts/graph/badge.svg)](https://codecov.io/gh/OpenZeppelin/openzeppelin-contracts)
[![GitPOAPs](https://public-api.gitpoap.io/v1/repo/OpenZeppelin/openzeppelin-contracts/badge)](https://www.gitpoap.io/gh/OpenZeppelin/openzeppelin-contracts)
[![Docs](https://img.shields.io/badge/docs-%F0%9F%93%84-yellow)](https://docs.openzeppelin.com/contracts)
[![Forum](https://img.shields.io/badge/forum-%F0%9F%92%AC-yellow)](https://forum.openzeppelin.com/)
## OpenZeppelin Contracts Ethereum Package
**A library for secure smart contract development.** Build on a solid foundation of community-vetted code.
[![NPM Package](https://img.shields.io/npm/v/@openzeppelin/contracts-ethereum-package.svg)](https://www.npmjs.org/package/@openzeppelin/contracts-ethereum-package)
[![Build Status](https://circleci.com/gh/OpenZeppelin/openzeppelin-contracts-ethereum-package.svg?style=shield)](https://circleci.com/gh/OpenZeppelin/openzeppelin-contracts-ethereum-package)
* Implementations of standards like [ERC20](https://docs.openzeppelin.com/contracts/erc20) and [ERC721](https://docs.openzeppelin.com/contracts/erc721).
* 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.
**OpenZeppelin Contracts is a library for secure smart contract development.** It provides implementations of standards like ERC20 and ERC721 which you can deploy as-is or extend to suit your needs, as well as Solidity components to build custom contracts and more complex decentralized systems.
:mage: **Not sure how to get started?** Check out [Contracts Wizard](https://wizard.openzeppelin.com/) — an interactive smart contract generator.
This fork of OpenZeppelin is set up as a **reusable Ethereum Package**. It is deployed to the kovan, rinkeby, and ropsten test networks, as well as to the main Ethereum network. You can reuse any of the pre-deployed on-chain contracts by simply linking to them using the [OpenZeppelin SDK](https://github.com/openzeppelin/openzeppelin-sdk), or reuse their Solidity source code as with the [vanilla version of OpenZeppelin Contracts](https://github.com/OpenZeppelin/openzeppelin-contracts).
:building_construction: **Want to scale your decentralized application?** Check out [OpenZeppelin Defender](https://openzeppelin.com/defender) — a mission-critical developer security platform to code, audit, deploy, monitor, and operate with confidence.
## Differences with openzeppelin-contracts
> [!IMPORTANT]
> OpenZeppelin Contracts uses semantic versioning to communicate backwards compatibility of its API and storage layout. For upgradeable contracts, the storage layout of different major versions should be assumed incompatible, for example, it is unsafe to upgrade from 4.9.3 to 5.0.0. Learn more at [Backwards Compatibility](https://docs.openzeppelin.com/contracts/backwards-compatibility).
This package contains the same contracts as the vanilla [openzeppelin-contracts](https://github.com/openZeppelin/openzeppelin-contracts). The main difference is that _all contracts in this package are potentially upgradeable_: you will notice that no contracts have constructors defined, but use [initializer functions](https://docs.zeppelinos.org/docs/writing_contracts.html#initializers) instead. Also, this package is set up as an Ethereum package, and provides a small set of pre-deployed logic contracts that can be used directly via the OpenZeppelin SDK, without needing to deploy them again.
## Overview
All in all, **you should use this package instead of openzeppelin-solidity if you are managing your project via the OpenZeppelin CLI**.
### Installation
#### Hardhat (npm)
## Install
```
$ npm install @openzeppelin/contracts
npm install @openzeppelin/contracts-ethereum-package
```
#### Foundry (git)
## Deployed logic contracts
> [!WARNING]
> When installing via git, it is a common error to use the `master` branch. This is a development branch that should be avoided in favor of tagged releases. The release process involves security measures that the `master` branch does not guarantee.
- [StandaloneERC20](contracts/token/ERC20/StandaloneERC20.sol): ERC20 token implementation, optionally mintable and pausable.
- [StandaloneERC721](contracts/token/ERC721/StandaloneERC721.sol): ERC721 non-fungible token implementation with metadata and enumerable extensions, optionally mintable and pausable.
- [TokenVesting](contracts/drafts/TokenVesting.sol): tToken holder contract that can release its token balance gradually like a typical vesting scheme, with a cliff and vesting period, optionally revocable.
- [PaymentSplitter](contracts/payment/PaymentSplitter.sol): Splits payments among a group of addresses proportionately to some number of shares they own.
> [!WARNING]
> Foundry installs the latest version initially, but subsequent `forge update` commands will use the `master` branch.
## Using via the OpenZeppelin CLI
```
$ forge install OpenZeppelin/openzeppelin-contracts
You can easily create upgradeable instances of any of the logic contracts listed above using the OpenZeppelin CLI. This will rely on the pre-deployed instances in mainnet, kovan, ropsten, or rinkeby, greatly reducing your gas deployment costs. To do this, just [create a new OpenZeppelin SDK project](https://docs.zeppelinos.org/docs/deploying.html) and [link to this package](https://docs.zeppelinos.org/docs/linking.html).
```bash
$ npm install -g @openzeppelin/cli
$ openzeppelin init
$ openzeppelin link @openzeppelin/contracts-ethereum-package
> Installing...
$ openzeppelin create @openzeppelin/contracts-ethereum-package/StandaloneERC20
> Creating...
```
Add `@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/` in `remappings.txt.`
To create an instance of a contract, use the `openzeppelin create` command. As an example, you can run the following to create an upgradeable ERC20 named MyToken, with symbol TKN and 8 decimals, and an initial supply of 100 tokens assigned to the address HOLDER, with a MINTER and a PAUSER. Remember to replace $HOLDER, $MINTER, and $PAUSER with actual addresses when you run this command; you can specify more than one (or none at all) minters and pausers.
### Usage
```
$ openzeppelin create
? Pick a contract to instantiate: @openzeppelin/contracts-ethereum-package/StandaloneERC20
? Pick a network: development
✓ Deploying @openzeppelin/contracts-ethereum-package dependency to network
? Do you want to call a function on the instance after creating it?: Yes
? Select which function: * initialize(name: string, symbol: string, decimals: uint8, initialSupply: uint256, initialHolder: address, minters: address[], pausers: address[])
? name (string): MyToken
? symbol (string): MYT
? decimals (uint8): 18
? initialSupply (uint256): 100e18
? initialHolder (address): 0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1
? minters (address[]):
? pausers (address[]):
✓ Setting everything up to create contract instances
✓ Instance created at 0x2612Af3A521c2df9EAF28422Ca335b04AdF3ac66
```
Once installed, you can use the contracts in the library by importing them:
OpenZeppelin will create an upgradeable ERC20 instance and keep track of its address in the `.openzeppelin/rinkeby.json` file. Should you update your version of the openzeppelin contracts ethereum package later down the road, you can simply run `openzeppelin update` to upgrade all your ERC20 instances to the latest version.
You can also deploy a ERC721 token by choosing the `StandaloneERC721` contract when running `openzeppelin create`. Refer to the `initialize` function of each of the predeployed logic contracts to see which parameters are required for initialization.
## Extending contracts
If you prefer to write your custom contracts, import the ones from this package and extend them through inheritance. Note that **you must use this package and not `@openzeppelin/contracts` if you are [writing upgradeable contracts](https://docs.zeppelinos.org/docs/writing_contracts.html)**.
```solidity
pragma solidity ^0.8.20;
pragma solidity ^0.5.0;
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import '@openzeppelin/upgrades/contracts/Initializable.sol';
import '@openzeppelin/contracts-ethereum-package/contracts/token/ERC721/ERC721Full.sol';
import '@openzeppelin/contracts-ethereum-package/contracts/token/ERC721/ERC721Mintable.sol';
contract MyCollectible is ERC721 {
constructor() ERC721("MyCollectible", "MCO") {
}
contract MyNFT is Initializable, ERC721Full, ERC721Mintable {
function initialize() public initializer {
ERC721.initialize();
ERC721Enumerable.initialize();
ERC721Metadata.initialize("MyNFT", "MNFT");
ERC721Mintable.initialize(msg.sender);
}
}
```
_If you're new to smart contract development, head to [Developing Smart Contracts](https://docs.openzeppelin.com/learn/developing-smart-contracts) to learn about creating a new project and compiling your contracts._
To keep your system secure, you should **always** use the installed code as-is, and neither copy-paste it from online sources nor modify it yourself. The library is designed so that only the contracts and functions you use are deployed, so you don't need to worry about it needlessly increasing gas costs.
## Learn More
The guides in the [documentation site](https://docs.openzeppelin.com/contracts) will teach about different concepts, and how to use the related contracts that OpenZeppelin Contracts provides:
* [Access Control](https://docs.openzeppelin.com/contracts/access-control): decide who can perform each of the actions on your system.
* [Tokens](https://docs.openzeppelin.com/contracts/tokens): create tradeable assets or collectives, and distribute them via [Crowdsales](https://docs.openzeppelin.com/contracts/crowdsales).
* [Utilities](https://docs.openzeppelin.com/contracts/utilities): generic useful tools including non-overflowing math, signature verification, and trustless paying systems.
The [full API](https://docs.openzeppelin.com/contracts/api/token/ERC20) is also thoroughly documented, and serves as a great reference when developing your smart contract application. You can also ask for help or follow Contracts' development in the [community forum](https://forum.openzeppelin.com).
Finally, you may want to take a look at the [guides on our blog](https://blog.openzeppelin.com/), which cover several common use cases and good practices. The following articles provide great background reading, though please note that some of the referenced tools have changed, as the tooling in the ecosystem continues to rapidly evolve.
* [The Hitchhikers Guide to Smart Contracts in Ethereum](https://blog.openzeppelin.com/the-hitchhikers-guide-to-smart-contracts-in-ethereum-848f08001f05) will help you get an overview of the various tools available for smart contract development, and help you set up your environment.
* [A Gentle Introduction to Ethereum Programming, Part 1](https://blog.openzeppelin.com/a-gentle-introduction-to-ethereum-programming-part-1-783cc7796094) provides very useful information on an introductory level, including many basic concepts from the Ethereum platform.
* For a more in-depth dive, you may read the guide [Designing the Architecture for Your Ethereum Application](https://blog.openzeppelin.com/designing-the-architecture-for-your-ethereum-application-9cec086f8317), which discusses how to better structure your application and its relationship to the real world.
On our site you will find a few [guides] to learn about the different parts of OpenZeppelin, as well as [documentation for the API][API docs]. Keep in mind that the API docs are work in progress, and dont hesitate to ask questions in [our forum][forum].
## Security
This project is maintained by [OpenZeppelin](https://openzeppelin.com) with the goal of providing a secure and reliable library of smart contract components for the ecosystem. We address security through risk management in various areas such as engineering and open source best practices, scoping and API design, multi-layered review processes, and incident response preparedness.
OpenZeppelin Contracts is maintained by [OpenZeppelin](https://openzeppelin.com) the company, and developed following our high standards for code quality and security. OpenZeppelin Contracts is meant to provide tested and community-audited code, but please use common sense when doing anything that deals with real money! We take no responsibility for your implementation decisions and any security problems you might experience.
The [OpenZeppelin Contracts Security Center](https://contracts.openzeppelin.com/security) contains more details about the secure development process.
The core development principles and strategies that OpenZeppelin Contracts is based on include: security in depth, simple and modular code, clarity-driven naming conventions, comprehensive unit testing, pre-and-post-condition sanity checks, code consistency, and regular audits.
The security policy is detailed in [`SECURITY.md`](./SECURITY.md) as well, and specifies how you can report security vulnerabilities, which versions will receive security patches, and how to stay informed about them. We run a [bug bounty program on Immunefi](https://immunefi.com/bounty/openzeppelin) to reward the responsible disclosure of vulnerabilities.
The latest audit was done on October 2018 on version 2.0.0.
The engineering guidelines we follow to promote project quality can be found in [`GUIDELINES.md`](./GUIDELINES.md).
Past audits can be found in [`audits/`](./audits).
Smart contracts are a nascent technology and carry a high level of technical risk and uncertainty. Although OpenZeppelin is well known for its security audits, using OpenZeppelin Contracts is not a substitute for a security audit.
OpenZeppelin Contracts is made available under the MIT License, which disclaims all warranties in relation to the project and which limits the liability of those that contribute and maintain the project, including OpenZeppelin. As set out further in the Terms, you acknowledge that you are solely responsible for any use of OpenZeppelin Contracts and you assume all risks associated with any such use.
Please report any security issues you find to security@openzeppelin.org.
## Contribute
OpenZeppelin Contracts exists thanks to its contributors. There are many ways you can participate and help build high quality software. Check out the [contribution guide](CONTRIBUTING.md)!
OpenZeppelin exists thanks to its contributors. There are many ways you can participate and help build high quality software. Check out the [contribution guide]!
## License
OpenZeppelin Contracts is released under the [MIT License](LICENSE).
OpenZeppelin is released under the [MIT License](LICENSE).
## Legal
Your use of this Project is governed by the terms found at www.openzeppelin.com/tos (the "Terms").
[API docs]: https://docs.openzeppelin.org/v2.3.0/api/token/erc20
[guides]: https://docs.openzeppelin.org/v2.3.0/get-started
[forum]: https://forum.zeppelin.solutions
[contribution guide]: CONTRIBUTING.md

View File

@ -1,45 +1,99 @@
# Releasing
OpenZeppelin Contracts uses a fully automated release process that takes care of compiling, packaging, and publishing the library, all of which is carried out in a clean CI environment (GitHub Actions), implemented in the [`release-cycle`](.github/workflows/release-cycle.yml) workflow. This helps to reduce the potential for human error and inconsistencies, and ensures that the release process is consistent and reliable.
This document describes our release process, and contains the steps to be followed by an OpenZeppelin maintainer at the several stages of a release.
## Changesets
We release a new version of OpenZeppelin monthly. Release cycles are tracked in the [issue milestones](https://github.com/OpenZeppelin/openzeppelin-solidity/milestones).
[Changesets](https://github.com/changesets/changesets/) are used as part of our release process for `CHANGELOG.md` management. Each change that is relevant for the codebase is expected to include a changeset.
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.
## Branching model
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`.
The release cycle happens on release branches called `release-vX.Y`. Each of these branches starts as a release candidate (rc) and is eventually promoted to final.
A release branch can be updated with cherry-picked patches from `master`, or may sometimes be committed to directly in the case of old releases. These commits will lead to a new release candidate or a patch increment depending on the state of the release branch.
## Creating the release branch
```mermaid
%%{init: {'gitGraph': {'mainBranchName': 'master'}} }%%
gitGraph
commit id: "Feature A"
commit id: "Feature B"
branch release-vX.Y
commit id: "Start release"
commit id: "Release vX.Y.0-rc.0"
We'll refer to a release `vX.Y.Z`.
checkout master
commit id: "Feature C"
commit id: "Fix A"
checkout release-vX.Y
cherry-pick id: "Fix A" tag: ""
commit id: "Release vX.Y.0-rc.1"
commit id: "Release vX.Y.0"
checkout master
merge release-vX.Y
commit id: "Feature D"
commit id: "Patch B"
checkout release-vX.Y
cherry-pick id: "Patch B" tag: ""
commit id: "Release vX.Y.1"
checkout master
merge release-vX.Y
commit id: "Feature E"
```
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-solidity/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 ask our community manager to announce the release candidate on at least Slack and 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-solidity next
```
## Merging the release branch
After the final release, the release branch should be merged back into `master`. This merge must not be squashed because it would lose the tagged release commit. Since the GitHub repo is set up to only allow squashed merges, the merge should be done locally and pushed.
Make sure to have the latest changes from `upstream` in your local release branch.
```
git checkout release-vX.Y.Z
git pull upstream
```
```
git checkout master
git merge --no-ff release-vX.Y.Z
git push upstream master
```
The release branch can then be deleted on GitHub.

View File

@ -1,43 +0,0 @@
# Security Policy
Security vulnerabilities should be disclosed to the project maintainers through [Immunefi], or alternatively by email to security@openzeppelin.com.
[Immunefi]: https://immunefi.com/bounty/openzeppelin
## Bug Bounty
Responsible disclosure of security vulnerabilities is rewarded through a bug bounty program on [Immunefi].
There is a bonus reward for issues introduced in release candidates that are reported before making it into a stable release. Learn more about release candidates at [`RELEASING.md`](./RELEASING.md).
## Security Patches
Security vulnerabilities will be patched as soon as responsibly possible, and published as an advisory on this repository (see [advisories]) and on the affected npm packages.
[advisories]: https://github.com/OpenZeppelin/openzeppelin-contracts/security/advisories
Projects that build on OpenZeppelin Contracts are encouraged to clearly state, in their source code and websites, how to be contacted about security issues in the event that a direct notification is considered necessary. We recommend including it in the NatSpec for the contract as `/// @custom:security-contact security@example.com`.
Additionally, we recommend installing the library through npm and setting up vulnerability alerts such as [Dependabot].
[Dependabot]: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-supply-chain-security#what-is-dependabot
### Supported Versions
Security patches will be released for the latest minor of a given major release. For example, if an issue is found in versions >=4.6.0 and the latest is 4.8.0, the patch will be released only in version 4.8.1.
Only critical severity bug fixes will be backported to past major releases.
| Version | Critical security fixes | Other security fixes |
| ------- | ----------------------- | -------------------- |
| 5.x | :white_check_mark: | :white_check_mark: |
| 4.9 | :white_check_mark: | :x: |
| 3.4 | :white_check_mark: | :x: |
| 2.5 | :x: | :x: |
| < 2.0 | :x: | :x: |
Note as well that the Solidity language itself only guarantees security updates for the latest release.
## Legal
Blockchain is a nascent technology and carries a high level of risk and uncertainty. OpenZeppelin makes certain software available under open source licenses, which disclaim all warranties in relation to the project and which limits the liability of OpenZeppelin. Subject to any particular licensing terms, your use of the project is governed by the terms found at [www.openzeppelin.com/tos](https://www.openzeppelin.com/tos) (the "Terms"). As set out in the Terms, you are solely responsible for any use of the project and you assume all risks associated with any such use. This Security Policy in no way evidences or represents an ongoing duty by any contributor, including OpenZeppelin, to correct any issues or vulnerabilities or alert you to all or any of the risks of utilizing the project.

View File

@ -1,7 +1,5 @@
# OpenZeppelin Audit
NOTE ON 2021-07-19: This report makes reference to Zeppelin, OpenZeppelin, OpenZeppelin Contracts, the OpenZeppelin team, and OpenZeppelin library. Many of these things have since been renamed and know that this audit applies to what is currently called the OpenZeppelin Contracts which are maintained by the OpenZeppelin Contracts Community.
March, 2017
Authored by Dennis Peterson and Peter Vessenes
@ -20,7 +18,7 @@ The git commit hash we evaluated is:
# Disclaimer
The audit makes no statements or warranties about utility of the code, safety of the code, suitability of the business model, regulatory regime for the business model, or any other statements about fitness of the contracts to purpose, or their bug free status. The audit documentation is for discussion purposes only.
The audit makes no statements or warrantees about utility of the code, safety of the code, suitability of the business model, regulatory regime for the business model, or any other statements about fitness of the contracts to purpose, or their bugfree status. The audit documentation is for discussion purposes only.
# Executive Summary
@ -90,7 +88,7 @@ We are still working through the confirmation protocol in `Shareable.sol`, but w
This bug has a number of causes that need to be addressed:
1. `resetSpentToday` and `confirm` together do not limit the days on which the function can be called or (it appears) the number of times it can be called.
1. Once a call has been confirmed and executed it appears that it can be re-executed. This is not good.
1. Once a call has been confirmed and `execute`d it appears that it can be re-executed. This is not good.
3. `confirmandCheck` doesn't seem to have logic about whether or not the function in question has been called.
4. Even if it did, `revoke` would need updates and logic to deal with revocation requests after a function call had been completed.
@ -109,7 +107,7 @@ It would be nice to see how many payments are pending. This would imply a bit of
## Shareable Contract
We do not believe the `Shareable.sol` contract is ready for prime time. It is missing functions, and as written may be vulnerable to a reordering attack -- an attack in which a miner or other party "racing" with a smart contract participant inserts their own information into a list or mapping.
We do not believe the `Shareable.sol` contract is ready for primetime. It is missing functions, and as written may be vulnerable to a reordering attack -- an attack in which a miner or other party "racing" with a smart contract participant inserts their own information into a list or mapping.
The confirmation and revocation code needs to be looked over with a very careful eye imagining extraordinarily bad behavior by shared owners before this contract can be called safe.
@ -133,7 +131,7 @@ I presume that the goal of this contract is to allow and annotate a migration to
We like these pauses! Note that these allow significant griefing potential by owners, and that this might not be obvious to participants in smart contracts using the OpenZeppelin framework. We would recommend that additional sample logic be added to for instance the TokenContract showing safer use of the pause and resume functions. In particular, we would recommend a timelock after which anyone could unpause the contract.
The modifiers use the pattern `if(bool){_;}`. This is fine for functions that return false upon failure, but could be problematic for functions expected to throw upon failure. See our comments above on standardizing on `throw` or `return(false)`.
The modifers use the pattern `if(bool){_;}`. This is fine for functions that return false upon failure, but could be problematic for functions expected to throw upon failure. See our comments above on standardizing on `throw` or `return(false)`.
## Ownership
@ -159,7 +157,7 @@ Allows owner to set a public string of contract information. No issues.
This needs some work. Doesn't check if `_required <= len(_owners)` for instance, that would be a bummer. What if _required were like `MAX - 1`?
I have a general concern about the difference between `owners`, `_owners`, and `owner` in `Ownable.sol`. I recommend "Owners" be renamed. In general we do not recommend single character differences in variable names, although a preceding underscore is not uncommon in Solidity code.
I have a general concern about the difference between `owners`, `_owners`, and `owner` in `Ownable.sol`. I recommend "Owners" be renamed. In general we do not recomment single character differences in variable names, although a preceding underscore is not uncommon in Solidity code.
Line 34: "this contract only has six types of events"...actually only two.
@ -224,7 +222,7 @@ Transfer() and transferFrom() use SafeMath functions, which will cause them to t
### SimpleToken
Sample instantiation of StandardToken. Note that in this sample, decimals is 18 and supply is only 10,000, so the supply is a small fraction of a single nominal token.
Sample instantiation of StandardToken. Note that in this sample, decimals is 18 and supply only 10,000, so the supply is a small fraction of a single nominal token.
### CrowdsaleToken

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,20 +0,0 @@
# Audits
| Date | Version | Commit | Auditor | Scope | Links |
| ------------- | ------- | -------------------------------------------------------------------------------- | ------------ | -------------------- | ----------------------------------------------------------- |
| April 2025 | v5.3.0 | [`d4b2e98`](https://github.com/openzeppelin/openzeppelin-contracts/tree/d4b2e98) | OpenZeppelin | v5.3 Changes | [🔗](./2025-04-v5.3.pdf) |
| December 2024 | v5.2.0 | [`98d28f9`](https://github.com/openzeppelin/openzeppelin-contracts/tree/98d28f9) | OpenZeppelin | v5.2 Changes | [🔗](./2024-12-v5.2.pdf) |
| October 2024 | v5.1.0 | [`aba9ff6`](https://github.com/openzeppelin/openzeppelin-contracts/tree/aba9ff6) | OpenZeppelin | v5.1 Changes | [🔗](./2024-10-v5.1.pdf) |
| October 2023 | v5.0.0 | [`b5a3e69`](https://github.com/openzeppelin/openzeppelin-contracts/tree/b5a3e69) | OpenZeppelin | v5.0 Changes | [🔗](./2023-10-v5.0.pdf) |
| May 2023 | v4.9.0 | [`91df66c`](https://github.com/openzeppelin/openzeppelin-contracts/tree/91df66c) | OpenZeppelin | v4.9 Changes | [🔗](./2023-05-v4.9.pdf) |
| October 2022 | v4.8.0 | [`14f98db`](https://github.com/openzeppelin/openzeppelin-contracts/tree/14f98db) | OpenZeppelin | ERC4626, Checkpoints | [🔗](./2022-10-ERC4626.pdf) [🔗](./2022-10-Checkpoints.pdf) |
| October 2018 | v2.0.0 | [`dac5bcc`](https://github.com/openzeppelin/openzeppelin-contracts/tree/dac5bcc) | LevelK | Everything | [🔗](./2018-10.pdf) |
| March 2017 | v1.0.4 | [`9c5975a`](https://github.com/openzeppelin/openzeppelin-contracts/tree/9c5975a) | New Alchemy | Everything | [🔗](./2017-03.md) |
# Formal Verification
| Date | Version | Commit | Tool | Scope | Links |
| ------------ | ------- | --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
| May 2022 | v4.7.0 | `109778c` | Certora | Initializable, GovernorPreventLateQuorum, ERC1155Burnable, ERC1155Pausable, ERC1155Supply, ERC1155Holder, ERC1155Receiver | [🔗](../certora/reports/2022-05.pdf) |
| March 2022 | v4.4.0 | `4088540` | Certora | ERC20Votes, ERC20FlashMint, ERC20Wrapper, TimelockController, ERC721Votes, Votes, AccessControl, ERC1155 | [🔗](../certora/reports/2022-03.pdf) |
| October 2021 | v4.4.0 | `4088540` | Certora | Governor, GovernorCountingSimple, GovernorProposalThreshold, GovernorTimelockControl, GovernorVotes, GovernorVotesQuorumFraction | [🔗](../certora/reports/2021-10.pdf) |

1
certora/.gitignore vendored
View File

@ -1 +0,0 @@
patched

View File

@ -1,54 +0,0 @@
default: help
SRC := ../contracts
DST := patched
DIFF := diff
SRCS := $(shell find $(SRC) -type f)
DSTS := $(shell find $(DST) -type f)
DIFFS := $(shell find $(DIFF) -type f)
###############################################################################
# Apply all patches in the $DIFF folder to the $DST folder
apply: $(DST) $(patsubst $(DIFF)/%.patch,$(DST)/%,$(subst _,/,$(DIFFS)))
# Reset the $DST folder
$(DST): FORCE
@rm -rf $@
@cp -r $(SRC) $@
# Update a solidity file in the $DST directory using the corresponding patch
$(DST)/%.sol: FORCE | $(DST)
@echo Applying patch to $@
@patch -p0 -d $(DST) < $(patsubst $(DST)_%,$(DIFF)/%.patch,$(subst /,_,$@))
###############################################################################
# Record all difference between $SRC and $DST in patches
record: $(DIFF) $(patsubst %,$(DIFF)/%.patch,$(subst /,_,$(subst $(SRC)/,,$(SRCS)) $(subst $(DST)/,,$(DSTS))))
# Create the $DIFF folder
$(DIFF): FORCE
@rm -rf $@
@mkdir $@
# Create the patch file by comparing the source and the destination
$(DIFF)/%.patch: FORCE | $(DIFF)
@echo Generating patch $@
@diff -ruN \
$(patsubst $(DIFF)/%.patch,$(SRC)/%,$(subst _,/,$@)) \
$(patsubst $(DIFF)/%.patch,$(DST)/%,$(subst _,/,$@)) \
| sed 's+$(SRC)/++g' \
| sed 's+$(DST)/++g' \
> $@
@[ -s $@ ] || rm $@
###############################################################################
help:
@echo "usage:"
@echo " make apply: create $(DST) directory by applying the patches to $(SRC)"
@echo " make record: record the patches capturing the differences between $(SRC) and $(DST)"
@echo " make clean: remove all generated files (those ignored by git)"
clean:
git clean -fdX
FORCE: ;

View File

@ -1,60 +0,0 @@
# Running the certora verification tool
These instructions detail the process for running Certora Verification Tool on OpenZeppelin Contracts.
Documentation for CVT and the specification language is available [here](https://certora.atlassian.net/wiki/spaces/CPD/overview).
## Prerequisites
Follow the [Certora installation guide](https://docs.certora.com/en/latest/docs/user-guide/getting-started/install.html) in order to get the Certora Prover Package and the `solc` executable folder in your path.
> **Note**
> An API Key is required for local testing. Although the prover will run on a GitHub Actions' CI environment on selected Pull Requests.
## Running the verification
The Certora Verification Tool proves specs for contracts, which are defined by the `./specs.json` file along with their pre-configured options.
The verification script `./run.js` is used to submit verification jobs to the Certora Verification service.
You can run it from the root of the repository with the following command:
```bash
node certora/run.js [[CONTRACT_NAME:]SPEC_NAME] [OPTIONS...]
```
Where:
- `CONTRACT_NAME` matches the `contract` key in the `./spec.json` file and may be empty. It will run all matching contracts if not provided.
- `SPEC_NAME` refers to a `spec` key from the `./specs.json` file. It will run every spec if not provided.
- `OPTIONS` extend the [Certora Prover CLI options](https://docs.certora.com/en/latest/docs/prover/cli/options.html#certora-prover-cli-options) and will respect the preconfigured options in the `specs.json` file.
> **Note**
> A single spec may be configured to run for multiple contracts, whereas a single contract may run multiple specs.
Example usage:
```bash
node certora/run.js AccessControl # Run the AccessControl spec against every contract implementing it
```
## Adapting to changes in the contracts
Some of our rules require the code to be simplified in various ways. Our primary tool for performing these simplifications is to run verification on a contract that extends the original contracts and overrides some of the methods. These "harness" contracts can be found in the `certora/harness` directory.
This pattern does require some modifications to the original code: some methods need to be made virtual or public, for example. These changes are handled by applying a patch
to the code before verification by running:
```bash
make -C certora apply
```
Before running the `certora/run.js` script, it's required to apply the corresponding patches to the `contracts` directory, placing the output in the `certora/patched` directory. Then, the contracts are verified by running the verification for the `certora/patched` directory.
If the original contracts change, it is possible to create a conflict with the patch. In this case, the verify scripts will report an error message and output rejected changes in the `patched` directory. After merging the changes, run `make record` in the `certora` directory; this will regenerate the patch file, which can then be checked into git.
For more information about the `make` scripts available, run:
```bash
make -C certora help
```

View File

@ -1,97 +0,0 @@
--- access/manager/AccessManager.sol 2023-10-05 12:17:09.694051809 -0300
+++ access/manager/AccessManager.sol 2023-10-05 12:26:18.498688718 -0300
@@ -6,7 +6,6 @@
import {IAccessManaged} from "./IAccessManaged.sol";
import {Address} from "../../utils/Address.sol";
import {Context} from "../../utils/Context.sol";
-import {Multicall} from "../../utils/Multicall.sol";
import {Math} from "../../utils/math/Math.sol";
import {Time} from "../../utils/types/Time.sol";
@@ -57,7 +56,8 @@
* mindful of the danger associated with functions such as {{Ownable-renounceOwnership}} or
* {{AccessControl-renounceRole}}.
*/
-contract AccessManager is Context, Multicall, IAccessManager {
+// NOTE: The FV version of this contract doesn't include Multicall because CVL HAVOCs on any `delegatecall`.
+contract AccessManager is Context, IAccessManager {
using Time for *;
// Structure that stores the details for a target contract.
@@ -105,7 +105,7 @@
// Used to identify operations that are currently being executed via {execute}.
// This should be transient storage when supported by the EVM.
- bytes32 private _executionId;
+ bytes32 internal _executionId; // private → internal for FV
/**
* @dev Check that the caller is authorized to perform the operation, following the restrictions encoded in
@@ -253,6 +253,11 @@
_setGrantDelay(roleId, newDelay);
}
+ // Exposed for FV
+ function _getTargetAdminDelayFull(address target) internal view virtual returns (uint32, uint32, uint48) {
+ return _targets[target].adminDelay.getFull();
+ }
+
/**
* @dev Internal version of {grantRole} without access control. Returns true if the role was newly granted.
*
@@ -287,6 +292,11 @@
return newMember;
}
+ // Exposed for FV
+ function _getRoleGrantDelayFull(uint64 roleId) internal view virtual returns (uint32, uint32, uint48) {
+ return _roles[roleId].grantDelay.getFull();
+ }
+
/**
* @dev Internal version of {revokeRole} without access control. This logic is also used by {renounceRole}.
* Returns true if the role was previously granted.
@@ -586,7 +596,7 @@
/**
* @dev Check if the current call is authorized according to admin logic.
*/
- function _checkAuthorized() private {
+ function _checkAuthorized() internal virtual { // private → internal virtual for FV
address caller = _msgSender();
(bool immediate, uint32 delay) = _canCallSelf(caller, _msgData());
if (!immediate) {
@@ -609,7 +619,7 @@
*/
function _getAdminRestrictions(
bytes calldata data
- ) private view returns (bool adminRestricted, uint64 roleAdminId, uint32 executionDelay) {
+ ) internal view returns (bool adminRestricted, uint64 roleAdminId, uint32 executionDelay) { // private → internal for FV
if (data.length < 4) {
return (false, 0, 0);
}
@@ -662,7 +672,7 @@
address caller,
address target,
bytes calldata data
- ) private view returns (bool immediate, uint32 delay) {
+ ) internal view returns (bool immediate, uint32 delay) { // private → internal for FV
if (target == address(this)) {
return _canCallSelf(caller, data);
} else {
@@ -716,14 +726,14 @@
/**
* @dev Extracts the selector from calldata. Panics if data is not at least 4 bytes
*/
- function _checkSelector(bytes calldata data) private pure returns (bytes4) {
+ function _checkSelector(bytes calldata data) internal pure returns (bytes4) { // private → internal for FV
return bytes4(data[0:4]);
}
/**
* @dev Hashing function for execute protection
*/
- function _hashExecutionId(address target, bytes4 selector) private pure returns (bytes32) {
+ function _hashExecutionId(address target, bytes4 selector) internal pure returns (bytes32) { // private → internal for FV
return keccak256(abi.encode(target, selector));
}
}

View File

@ -1,46 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {AccessControlDefaultAdminRules} from "../patched/access/extensions/AccessControlDefaultAdminRules.sol";
contract AccessControlDefaultAdminRulesHarness is AccessControlDefaultAdminRules {
uint48 private _delayIncreaseWait;
constructor(
uint48 initialDelay,
address initialDefaultAdmin,
uint48 delayIncreaseWait
) AccessControlDefaultAdminRules(initialDelay, initialDefaultAdmin) {
_delayIncreaseWait = delayIncreaseWait;
}
// FV
function pendingDefaultAdmin_() external view returns (address) {
(address newAdmin, ) = pendingDefaultAdmin();
return newAdmin;
}
function pendingDefaultAdminSchedule_() external view returns (uint48) {
(, uint48 schedule) = pendingDefaultAdmin();
return schedule;
}
function pendingDelay_() external view returns (uint48) {
(uint48 newDelay, ) = pendingDefaultAdminDelay();
return newDelay;
}
function pendingDelaySchedule_() external view returns (uint48) {
(, uint48 schedule) = pendingDefaultAdminDelay();
return schedule;
}
function delayChangeWait_(uint48 newDelay) external view returns (uint48) {
return _delayChangeWait(newDelay);
}
// Overrides
function defaultAdminDelayIncreaseWait() public view override returns (uint48) {
return _delayIncreaseWait;
}
}

View File

@ -1,6 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {AccessControl} from "../patched/access/AccessControl.sol";
contract AccessControlHarness is AccessControl {}

View File

@ -1,36 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "../patched/access/manager/IAccessManager.sol";
import "../patched/access/manager/AccessManaged.sol";
contract AccessManagedHarness is AccessManaged {
bytes internal SOME_FUNCTION_CALLDATA = abi.encodeCall(this.someFunction, ());
constructor(address initialAuthority) AccessManaged(initialAuthority) {}
function someFunction() public restricted() {
// Sanity for FV: the msg.data when calling this function should be the same as the data used when checking
// the schedule. This is a reformulation of `msg.data == SOME_FUNCTION_CALLDATA` that focuses on the operation
// hash for this call.
require(
IAccessManager(authority()).hashOperation(_msgSender(), address(this), msg.data)
==
IAccessManager(authority()).hashOperation(_msgSender(), address(this), SOME_FUNCTION_CALLDATA)
);
}
function authority_canCall_immediate(address caller) public view returns (bool result) {
(result,) = AuthorityUtils.canCallWithDelay(authority(), caller, address(this), this.someFunction.selector);
}
function authority_canCall_delay(address caller) public view returns (uint32 result) {
(,result) = AuthorityUtils.canCallWithDelay(authority(), caller, address(this), this.someFunction.selector);
}
function authority_getSchedule(address caller) public view returns (uint48) {
IAccessManager manager = IAccessManager(authority());
return manager.getSchedule(manager.hashOperation(caller, address(this), SOME_FUNCTION_CALLDATA));
}
}

View File

@ -1,116 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "../patched/access/manager/AccessManager.sol";
contract AccessManagerHarness is AccessManager {
// override with a storage slot that can basically take any value.
uint32 private _minSetback;
constructor(address initialAdmin) AccessManager(initialAdmin) {}
// FV
function minSetback() public view override returns (uint32) {
return _minSetback;
}
function canCall_immediate(address caller, address target, bytes4 selector) external view returns (bool result) {
(result,) = canCall(caller, target, selector);
}
function canCall_delay(address caller, address target, bytes4 selector) external view returns (uint32 result) {
(,result) = canCall(caller, target, selector);
}
function canCallExtended(address caller, address target, bytes calldata data) external view returns (bool, uint32) {
return _canCallExtended(caller, target, data);
}
function canCallExtended_immediate(address caller, address target, bytes calldata data) external view returns (bool result) {
(result,) = _canCallExtended(caller, target, data);
}
function canCallExtended_delay(address caller, address target, bytes calldata data) external view returns (uint32 result) {
(,result) = _canCallExtended(caller, target, data);
}
function getAdminRestrictions_restricted(bytes calldata data) external view returns (bool result) {
(result,,) = _getAdminRestrictions(data);
}
function getAdminRestrictions_roleAdminId(bytes calldata data) external view returns (uint64 result) {
(,result,) = _getAdminRestrictions(data);
}
function getAdminRestrictions_executionDelay(bytes calldata data) external view returns (uint32 result) {
(,,result) = _getAdminRestrictions(data);
}
function hasRole_isMember(uint64 roleId, address account) external view returns (bool result) {
(result,) = hasRole(roleId, account);
}
function hasRole_executionDelay(uint64 roleId, address account) external view returns (uint32 result) {
(,result) = hasRole(roleId, account);
}
function getAccess_since(uint64 roleId, address account) external view returns (uint48 result) {
(result,,,) = getAccess(roleId, account);
}
function getAccess_currentDelay(uint64 roleId, address account) external view returns (uint32 result) {
(,result,,) = getAccess(roleId, account);
}
function getAccess_pendingDelay(uint64 roleId, address account) external view returns (uint32 result) {
(,,result,) = getAccess(roleId, account);
}
function getAccess_effect(uint64 roleId, address account) external view returns (uint48 result) {
(,,,result) = getAccess(roleId, account);
}
function getTargetAdminDelay_after(address target) public view virtual returns (uint32 result) {
(,result,) = _getTargetAdminDelayFull(target);
}
function getTargetAdminDelay_effect(address target) public view virtual returns (uint48 result) {
(,,result) = _getTargetAdminDelayFull(target);
}
function getRoleGrantDelay_after(uint64 roleId) public view virtual returns (uint32 result) {
(,result,) = _getRoleGrantDelayFull(roleId);
}
function getRoleGrantDelay_effect(uint64 roleId) public view virtual returns (uint48 result) {
(,,result) = _getRoleGrantDelayFull(roleId);
}
function hashExecutionId(address target, bytes4 selector) external pure returns (bytes32) {
return _hashExecutionId(target, selector);
}
function executionId() external view returns (bytes32) {
return _executionId;
}
// Pad with zeros (and don't revert) if data is too short.
function getSelector(bytes calldata data) external pure returns (bytes4) {
return bytes4(data);
}
function getFirstArgumentAsAddress(bytes calldata data) external pure returns (address) {
return abi.decode(data[0x04:0x24], (address));
}
function getFirstArgumentAsUint64(bytes calldata data) external pure returns (uint64) {
return abi.decode(data[0x04:0x24], (uint64));
}
function _checkAuthorized() internal override {
// We need this hack otherwise certora will assume _checkSelector(_msgData()) can return anything :/
require(msg.sig == _checkSelector(_msgData()));
super._checkAuthorized();
}
}

View File

@ -1,58 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {DoubleEndedQueue} from "../patched/utils/structs/DoubleEndedQueue.sol";
contract DoubleEndedQueueHarness {
using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;
DoubleEndedQueue.Bytes32Deque private _deque;
function pushFront(bytes32 value) external {
_deque.pushFront(value);
}
function pushBack(bytes32 value) external {
_deque.pushBack(value);
}
function popFront() external returns (bytes32 value) {
return _deque.popFront();
}
function popBack() external returns (bytes32 value) {
return _deque.popBack();
}
function clear() external {
_deque.clear();
}
function begin() external view returns (uint128) {
return _deque._begin;
}
function end() external view returns (uint128) {
return _deque._end;
}
function length() external view returns (uint256) {
return _deque.length();
}
function empty() external view returns (bool) {
return _deque.empty();
}
function front() external view returns (bytes32 value) {
return _deque.front();
}
function back() external view returns (bytes32 value) {
return _deque.back();
}
function at_(uint256 index) external view returns (bytes32 value) {
return _deque.at(index);
}
}

View File

@ -1,36 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "../patched/token/ERC20/ERC20.sol";
import "../patched/token/ERC20/extensions/ERC20Permit.sol";
import "../patched/token/ERC20/extensions/ERC20FlashMint.sol";
contract ERC20FlashMintHarness is ERC20, ERC20Permit, ERC20FlashMint {
uint256 someFee;
address someFeeReceiver;
constructor(string memory name, string memory symbol) ERC20(name, symbol) ERC20Permit(name) {}
function mint(address account, uint256 amount) external {
_mint(account, amount);
}
function burn(address account, uint256 amount) external {
_burn(account, amount);
}
// public accessor
function flashFeeReceiver() public view returns (address) {
return someFeeReceiver;
}
// internal hook
function _flashFee(address, uint256) internal view override returns (uint256) {
return someFee;
}
function _flashFeeReceiver() internal view override returns (address) {
return someFeeReceiver;
}
}

View File

@ -1,16 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {ERC20Permit, ERC20} from "../patched/token/ERC20/extensions/ERC20Permit.sol";
contract ERC20PermitHarness is ERC20Permit {
constructor(string memory name, string memory symbol) ERC20(name, symbol) ERC20Permit(name) {}
function mint(address account, uint256 amount) external {
_mint(account, amount);
}
function burn(address account, uint256 amount) external {
_burn(account, amount);
}
}

View File

@ -1,34 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {ERC20Permit} from "../patched/token/ERC20/extensions/ERC20Permit.sol";
import {ERC20Wrapper, IERC20, ERC20} from "../patched/token/ERC20/extensions/ERC20Wrapper.sol";
contract ERC20WrapperHarness is ERC20Permit, ERC20Wrapper {
constructor(
IERC20 _underlying,
string memory _name,
string memory _symbol
) ERC20(_name, _symbol) ERC20Permit(_name) ERC20Wrapper(_underlying) {}
function underlyingTotalSupply() public view returns (uint256) {
return underlying().totalSupply();
}
function underlyingBalanceOf(address account) public view returns (uint256) {
return underlying().balanceOf(account);
}
function underlyingAllowanceToThis(address account) public view returns (uint256) {
return underlying().allowance(account, address(this));
}
function recover(address account) public returns (uint256) {
return _recover(account);
}
function decimals() public view override(ERC20Wrapper, ERC20) returns (uint8) {
return super.decimals();
}
}

View File

@ -1,13 +0,0 @@
// SPDX-License-Identifier: MIT
import {IERC3156FlashBorrower} from "../patched/interfaces/IERC3156FlashBorrower.sol";
pragma solidity ^0.8.20;
contract ERC3156FlashBorrowerHarness is IERC3156FlashBorrower {
bytes32 somethingToReturn;
function onFlashLoan(address, address, uint256, uint256, bytes calldata) external view override returns (bytes32) {
return somethingToReturn;
}
}

View File

@ -1,33 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {ERC721} from "../patched/token/ERC721/ERC721.sol";
contract ERC721Harness is ERC721 {
constructor(string memory name, string memory symbol) ERC721(name, symbol) {}
function mint(address account, uint256 tokenId) external {
_mint(account, tokenId);
}
function safeMint(address to, uint256 tokenId) external {
_safeMint(to, tokenId);
}
function safeMint(address to, uint256 tokenId, bytes memory data) external {
_safeMint(to, tokenId, data);
}
function burn(uint256 tokenId) external {
_burn(tokenId);
}
function unsafeOwnerOf(uint256 tokenId) external view returns (address) {
return _ownerOf(tokenId);
}
function unsafeGetApproved(uint256 tokenId) external view returns (address) {
return _getApproved(tokenId);
}
}

View File

@ -1,11 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "../patched/interfaces/IERC721Receiver.sol";
contract ERC721ReceiverHarness is IERC721Receiver {
function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {
return this.onERC721Received.selector;
}
}

View File

@ -1,55 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {EnumerableMap} from "../patched/utils/structs/EnumerableMap.sol";
contract EnumerableMapHarness {
using EnumerableMap for EnumerableMap.Bytes32ToBytes32Map;
EnumerableMap.Bytes32ToBytes32Map private _map;
function set(bytes32 key, bytes32 value) public returns (bool) {
return _map.set(key, value);
}
function remove(bytes32 key) public returns (bool) {
return _map.remove(key);
}
function contains(bytes32 key) public view returns (bool) {
return _map.contains(key);
}
function length() public view returns (uint256) {
return _map.length();
}
function key_at(uint256 index) public view returns (bytes32) {
(bytes32 key,) = _map.at(index);
return key;
}
function value_at(uint256 index) public view returns (bytes32) {
(,bytes32 value) = _map.at(index);
return value;
}
function tryGet_contains(bytes32 key) public view returns (bool) {
(bool contained,) = _map.tryGet(key);
return contained;
}
function tryGet_value(bytes32 key) public view returns (bytes32) {
(,bytes32 value) = _map.tryGet(key);
return value;
}
function get(bytes32 key) public view returns (bytes32) {
return _map.get(key);
}
function _positionOf(bytes32 key) public view returns (uint256) {
return _map._keys._inner._positions[key];
}
}

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