Compare commits

...

663 Commits

Author SHA1 Message Date
6e070c91e8 1.9.1 2018-05-22 21:01:40 -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
4a10f727c4 1.9.0 2018-04-26 16:36:06 -03:00
e79dc645e4 Merge branch 'rename-openzeppelin-solidity' 2018-04-26 16:35:19 -03:00
0e5799c93b Clean up npm package (#904)
* ignore everything but official contracts for npm

* add tests to npm package

* remove truffle migrations stuff

* remove seemingly unused npm dependency

* clean up dependencies
2018-04-26 12:36:41 -03:00
90413e75f1 add version script to update ethpm.json (#906) 2018-04-25 20:32:09 -03:00
9c262571ae rename to openzeppelin-solidity 2018-04-25 19:19:15 -03:00
76fe1548ae Fix ERC721 test is not checking name and symbol properly #910 (#911) 2018-04-23 20:36:47 -03:00
8f2a4785cb Make ERC827 methods payable (#838)
* Make ERC827 methods payable

* Suppress linter errors

* Add some ERC827 payable tests

* Remove failOnBuy method from MessageHelper

* Fix linter warning

* Fix tests
2018-04-23 15:16:55 +02:00
16535fbb87 Update ERC827.sol to not use function overloading (#871)
* Update ERC827.sol to not use function overloading

* updated tests for erc827 function name changes

* fixed broken test

* removed findMethod from erc827 tests that is no longer necessary
2018-04-23 13:39:34 +02: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
77cc33fc5c cleaned up unsued variable definition (#753) 2018-04-20 16:01:05 -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
0b33d29e41 Add travis job to run test suite with solc nightly (#902)
Job is allowed to fail, and is run just for information purposes
2018-04-19 12:12:36 -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
61dfdde6c4 Updated send to sent. Matching indentation of closing comment. (#897) 2018-04-18 14:48:16 -03:00
e8be9a7bd0 Remove suggestion to rebase (#899) 2018-04-18 14:47:22 -03:00
dd8758fedf move misplaced MathMock (#900) 2018-04-18 14:47:00 -03:00
c63b203c1d Small SafeMath.sol gas improvements (add & mul). (#894) 2018-04-17 19:16:30 -03:00
c191757c6e rename truffle.js to truffle-config.js (#886) 2018-04-17 17:14:38 -03:00
f4bdaf49a1 Increase test coverage to 93% #549 (#768)
* Increase test coverage to 93% #549

* cover missing AllowanceCrowdsale branch

* improve Heritable coverage

* fix lint errors

* proper equal assert

* address review comments

* remove unneeded const definitions and imports

* use assertRevert

* reword scenario description

* Increase test coverage to 93% #549

* cover missing AllowanceCrowdsale branch

* improve Heritable coverage

* fix lint errors

* proper equal assert

* address review comments

* remove unneeded const definitions and imports

* use assertRevert

* reword scenario description

* move HIGH_GOAL constant to the scope where it's used

* remove const at top level

* address review comments
2018-04-17 15:05:34 -03:00
6a7114fdb4 Bouncer contract implementation (#883)
* feat: implement bouncer contracts

* fix: rename Bouncer to SignatureBouncer
2018-04-17 11:36:24 -03:00
0926729c8f Add StandardBurnableToken implementation (#870)
* Add StandardBurnableToken implementation

BurnableToken that extends from StandardToken and adds a
burnFrom method that decrements allowance. Equivalent to
a transferFrom plus burn in a single operation.

* Return event object from expectEvent helper

* Add comment on Approval event in burnFrom function

* Improvements on burnable token tests

- Inject initial balance as a parameter to the behaviour
- Use expectEvent helper for assertions on events
- Use chai bignumber for numbers
- Change to bdd-style assertions
2018-04-11 16:15:33 -03:00
9e1c934ffd Various fixes and formatting chores (#885)
* fix: clean up solium linting errors

* fix: make various contracts natspec compliant

* fix: this.balance deprecated; convert to address(this).balance

* fix: contract.call deprecated and switch to gasleft()

* fix: ignore empty block rule project-wide

* fix: add ignore cases for the rest of the linting warnings
2018-04-10 20:31:29 -03:00
a7e91856f3 Update to Truffle 4.1.5 and Ganache 6.1.0 (#876)
* Update to ganache-cli v6.1.0 and truffle v4.1.0

* Update to stable version of ganache-cli

* fix: update event emission warning

- Fix event emission warnings for solidity 4.21 after truffle has been
updated to use this version

* fix pr review comments

* update to truffle v4.1.5

* update package-lock

* add additional emit keywords

* update solidity-coverage to 0.4.15

* update to solium 1.1.6

* fix MerkleProof coverage analysis by testing through wrapper

* change version pragma to ^0.4.21

* fix solium linting errors
2018-04-09 20:48:32 -03:00
06666be93a change MerkleProof interface to take array of bytes32 (#879) 2018-04-08 12:36:16 -03:00
915f74c5f6 remove collaborators and audits from README (#866) 2018-04-04 21:17:27 -03:00
3d3f20f7e3 Removing obsolete comment - explicit check in place (#851) 2018-04-04 09:53:55 -03:00
03a3302abd add missing await in IndividuallyCappedCrowdsale (#867) 2018-04-03 18:50:24 -03:00
bd5f7f5774 Fix SafeMath test file (#865) 2018-04-03 17:54:48 -03:00
a6bef44790 fix: remove admin functionality from RBAC.sol fixes #802 (#836)
- splits the admin part of RBAC.sol into RBACWithAdmin.sol
2018-04-03 16:56:31 -03:00
a9c777faa6 docs: fix contributing link (#848)
* docs: fix contributing link
2018-04-03 15:56:01 -03:00
44a404aae5 Remove unnecessary import from ERC721Token.sol (#855)
The DeprecatedERC721.sol isn't implemented or necessary.
2018-04-03 11:32:52 -03:00
1d2d18f9da Small gas improvement in SafeMath.sol (#811) 2018-03-28 15:00:10 -03:00
82ce197e44 tests: fix most of the static warnings (#844) 2018-03-28 13:33:58 -03:00
42787e2a75 added awaits (#845) 2018-03-26 21:55:52 -03:00
9bc43c8d0f make ethjs-abi a devDependency (#843) 2018-03-26 16:24:12 -03:00
cacf03641c v1.8.0 2018-03-23 15:14:10 -03:00
e96164feea ERC721 full implementation (#803)
* Rename current ERC721 implementation to BaseERC721

* Implement ERC721 optional & approveAll functionality

* Support for new ERC721 interface

- Tests for new features are pending
- ERC721 is abstract, since it requires metadata implementation
- Move some methods into DeprecatedERC721 contract
- Reorganise base vs full implementation
- Pending tokenByIndex

* Add more tests for ERC721

* Implement suggestions by @dekz

* Update comments in ERC721 contracts

* Implement tokensByIndex extension

- Remove restrictions from mock mint and burn calls

* Add default implementation for metadata URI

This allows token implementation to be non-abstract

* Allow operators to call approve on a token

* Remove gas stipend restriction in call to 721 receiver

* Remove deprecated implementation

We only want to keep the interface, for interacting with already deployed contracts

* Add notice to isContract helper on constract constructors

* Change natspec delimiters for consistency

* Minor linting fixes

* Add constant modifier to ERC721_RECEIVED magic value

* Use 4-params safeTransferFrom for implementing the 3-params overload

* Minor text changes in natspec comments

* Use address(0) instead of 0 or 0x0

* Use if-statements instead of boolean one-liners for clarity

:-(

* Keep ownedTokensCount state var in sync in full ERC721 implementation

* Fix incorrect comparison when burning ERC721 tokens with metadata

* Use address(0) instead of 0 in one more place in ERC721

* Throw when querying balance for the zero address

Required by the spec

* Update links to approved version of EIP721

* Use explicit size for uint

* Remove unneeded internal function in ERC721

Also rename addToken and removeToken for added clarity

* Use underscore instead of 'do' prefix for internal methods in ERC721

* Fix failing test due to events reordering in ERC721 safe transfer

* Fix bug introduced in 74db03ba06

* Remove do prefix for internal setTokenUri method

* Allow transfers to self in ERC721
2018-03-23 15:11:59 -03:00
9f52e94339 Move ERC20 tests to ERC20 custom folder (#772) 2018-03-22 17:37:05 -03:00
c9936e231d Changed test assertion description for clarity (#831) 2018-03-22 16:36:28 -03:00
e299a7950e Change ECRecovery recover method's visibility to internal (#818)
* Change ECRecovery recover method's visibility to internal

* Adopt the test

* Remove unused imports
2018-03-21 21:38:31 -03:00
b33260ac44 Remove assert and send in favor of transfer for PullPayment.sol (#823)
* Removed assert from send() and changed to transfer()

* Slightly adapted docs
2018-03-21 18:30:58 -03:00
3fb8ecad76 Gender of signer is irrelevant and distracting (#822) 2018-03-19 11:50:07 -03:00
c3cbdb4599 Fix version error for truffle-flattener. (#794) 2018-03-16 13:16:41 -05:00
7586e383c2 Fixes typo in SafeMath subtraction docs (#806) 2018-03-12 12:27:17 -05:00
d1146e8c8b Add Whitelist contract (#746)
* Add Whitelist contract
2018-03-08 10:49:38 -08:00
8d4eee412d Bugfix/fix individuallycapped flaky test (#789)
* Fix InvididuallyCappedCrowdsale flaky test

* Fix IndividuallyCappedCrowdsale flaky test
2018-03-05 18:23:01 -08:00
903751ce0d Tiny indentation fix in MintedCrowdsale (#792)
Tiny indentation fix in MintedCrowdsale
2018-03-05 17:46:00 -08:00
9fd61177c3 Fixed typo in Crowdsale contract comment (#793) 2018-03-05 16:06:58 -03:00
3c48912730 Fix capped crowdsale flaky test (#773) 2018-03-02 15:20:00 -03:00
b3a8602928 Use constructor arguments (#731) 2018-02-26 18:24:19 -03:00
5ef8554727 Add Transfer event to Burnable Token. (#735)
Fixes #732
2018-02-20 15:44:50 -07:00
9ea4bae313 v1.7.0 2018-02-20 18:11:33 -03:00
c05918c3cc Crowdsale refactor and add new models (#744)
* Basic idea

* Fine tuning idea

* Add comments / tidy up Crowdsale base class

* fixed TimedCrowdsale constructor

* added simple crowdsale test

* added HODL directory under home to store unused contracts. ugly hack to solve Crowdsale selection in tests, better way?

* Capped no longer inherits from Timed, added capReached() method (replacing hasEnded())

* added SafeMath in TimedCrowdsale for safety, CHECK whether it is inherited from Crowdsale

* several fixes related to separating Capped from Timed. functions renamed, mocks changed. Capped tests passing

* added TimedCrowdsaleImpl.sol, TimedCrowdsale tests, passed

* added Whitelisted implementation and test, passed.

* removed unnecessary super constructor call in WhitelistedCrowdsale, removed unused dependencies in tests

* renamed UserCappedCrowdsale to IndividuallyCappedCrowdsale, implemented IndividuallyCappedCrowdsaleImpl.sol and corresponding tests, passed.

* homogeneized use of using SafeMath for uint256 across validation crowdsales. checked that it IS indeed inherited, but leaving it there as per Frans suggestion.

* adding questions.md where I track questions, bugs and progress

* modified VariablePriceCrowdsale, added Impl.

* finished VariablePrice, fixed sign, added test, passing.

* changed VariablePrice to IncreasingPrice, added corresponding require()

* MintedCrowdsale done, mock implemented, test passing

* PremintedCrowdsale done, mocks, tests passing

* checked FinalizableCrowdsale

* PostDeliveryCrowdsale done, mock, tests passing.

* RefundableCrowdsale done. Detached Vault. modified mock and test, passing

* renamed crowdsale-refactor to crowdsale in contracts and test

* deleted HODL old contracts

* polished variable names in tests

* fixed typos and removed comments in tests

* Renamed 'crowdsale-refactor' to 'crowdsale' in all imports

* Fix minor param naming issues in Crowdsale functions and added documentation to Crowdsale.sol

* Added documentation to Crowdsale extensions

* removed residual comments and progress tracking files

* added docs for validation crowdsales

* Made user promises in PostDeliveryCrowdsale public so that users can query their promised token balance.

* added docs for distribution crowdsales

* renamed PremintedCrowdsale to AllowanceCrowdsale

* added allowance check function and corresponding test. fixed filename in AllowanceCrowdsale mock.

* spilt Crowdsale _postValidatePurchase in _postValidatePurchase and _updatePurchasingState. changed IndividuallyCappedCrowdsale accordingly.

* polished tests for linter, salve Travis

* polished IncreasingPriceCrowdsale.sol for linter.

* renamed and polished for linter WhitelistedCrowdsale test.

* fixed indentation in IncreasingPriceCrowdsaleImpl.sol for linter

* fixed ignoring token.mint return value in MintedCrowdsale.sol

* expanded docs throughout, fixed minor issues

* extended test coverage for IndividuallyCappedCrowdsale

* Extended WhitelistedCrwodsale test coverage

* roll back decoupling of RefundVault in RefundableCrowdsale

* moved cap exceedance checks in Capped and IndividuallyCapped crowdsales to _preValidatePurchase to save gas

* revert name change, IndividuallyCapped to UserCapped

* extended docs.

* added crowd whitelisting with tests

* added group capping, plus tests

* added modifiers in TimedCrowdsale and WhitelistedCrowdsale

* polished tests for linter

* moved check of whitelisted to modifier, mainly for testing coverage

* fixed minor ordering/polishingafter review

* modified TimedCrowdsale modifier/constructor ordering

* unchanged truffle-config.js

* changed indentation of visibility modifier in mocks

* changed naming of modifier and function to use Open/Closed for TimedCrowdsale

* changed ordering of constructor calls in SampleCrowdsale

* changed startTime and endTime to openingTime and closingTime throughout

* fixed exceeding line lenght for linter

* renamed _emitTokens to _deliverTokens

* renamed addCrowdToWhitelist to addManyToWhitelist

* renamed UserCappedCrowdsale to IndividuallyCappedCrowdsale
2018-02-20 14:05:53 -07:00
108d5f3b4a Remove deprecated docs directory and link to new documentation in readme. (#750)
* Remove deprecated docs directory.

* Update link to docs in readme.
2018-02-16 15:21:13 -03:00
61b6a733c8 Fixed Contribution Guidelines link (#738) 2018-02-15 10:20:32 -03:00
6ad275befb Improve ERC20s tests coverage (#712)
* Improve StandardToken tests coverage
* Improve BasicToken test coverage
* Improve MintableToken test coverage
* Improve BurnableToken test coverage
* Improve PausableToken tests coverage
2018-02-08 14:34:31 -03:00
7a0bfdfbb4 Enhancement/heritable encapsulation #692 (#702)
* Modified Gitignore for Sublime

* Added getter functions for public variables

* Added encapsulation to Heritable public variables.

* Added encapsulation to Heritable public variables.

* Added encapsulation to Heritable public variables.

* Updated tests to use getter methods instead of, now, private variables.

* Conformed variable names to current conventions.

* Requested changes

* revert package-lock.json changes
2018-01-26 18:20:35 -03:00
f4228f1b49 fix: reference contract name rather than filepath (#698) 2018-01-25 11:52:51 -03:00
a5d5867092 feat: update pr templates, closes #696 (#699)
* feat: update pr templates, closes #696

* fix: move lint command to end of bullet
2018-01-25 11:26:29 -03:00
4d7c3cca75 Move token creation outside of crowdsale contract (#690)
Fixes #358
2018-01-24 11:44:35 -03:00
0541347034 v1.6.0 2018-01-23 17:48:04 -03:00
c5d66183ab Move ERC20 contracts to ERC20 custom folder (#701)
* Move ERC20 contracts to ERC20 custom folder

* Fix linter warnings for ERC20 contracts
2018-01-23 17:46:41 -03:00
1eea95f9ac Move ERC721 files to custom folder (#700) 2018-01-23 17:03:05 -03:00
e16c4042c1 Merge pull request #627 from facuspagnuolo/feature/implement_erc721_standard
Implement ERC721 standard
2018-01-23 10:47:28 -03:00
e1d32acae8 Merge branch 'master' into feature/implement_erc721_standard 2018-01-23 10:29:55 -03:00
3b499a9cc3 Merge pull request #687 from sot528/fix/reference-of-rbac-usage
fix reference of RBAC usage.
2018-01-22 19:05:01 -08:00
4e77aaa0c3 Merge branch 'master' into fix/reference-of-rbac-usage 2018-01-22 17:46:47 -08:00
4be30dc3ae Merge branch 'master' into feature/implement_erc721_standard 2018-01-19 17:43:03 -03:00
370e6a882a ERC20 totalSupply changed from public property to a function (#666)
Fixes OpenZeppelin/zeppelin-solidity#434
2018-01-19 17:15:27 -03:00
9cc55ef2a5 use short circuit (#654) 2018-01-19 15:45:48 -03:00
48594890cf Merge branch 'master' into feature/implement_erc721_standard 2018-01-19 15:36:52 -03:00
6979e3c83a Merge pull request #693 from fulldecent/patch-1
Fix test name
2018-01-19 15:28:27 -03:00
96e0d35f11 Merge branch 'master' into fix/reference-of-rbac-usage 2018-01-19 15:17:23 -03:00
66402e9fec Merge branch 'master' into patch-1 2018-01-19 15:15:29 -03:00
5b40202dd3 Merge pull request #691 from frangio/fix-643
Add note about not following semver
2018-01-19 12:53:54 -03:00
da95df6be5 Fix test name 2018-01-18 23:47:02 -05:00
250572f48d add note about not following semver 2018-01-18 18:18:10 -03:00
ff9e9c4d85 Merge pull request #680 from ajsantander/azavalla-feature/inheritable-contract
Azavalla feature/inheritable contract
2018-01-18 17:41:44 -03:00
c8c0f21a3f Merge branch 'master' into azavalla-feature/inheritable-contract 2018-01-18 17:29:48 -03:00
3a9a2c8888 Merge pull request #684 from ajsantander/refactor/info-md-updates
Updates to markdown documentation
2018-01-18 17:27:37 -03:00
a5ea0af65c Merge branch 'master' into azavalla-feature/inheritable-contract 2018-01-18 17:20:07 -03:00
42553ec0c0 Merge branch 'master' into refactor/info-md-updates 2018-01-18 17:14:14 -03:00
c01203b0b7 Index addreses in events and explicit uint size 2018-01-18 16:58:45 -03:00
9d005b492d Explicit uint size 2018-01-18 16:42:19 -03:00
22c1403e5b Fix solidity style issue 2018-01-18 16:42:19 -03:00
3009553925 Update test names and js style 2018-01-18 16:42:19 -03:00
5ea9bd44a1 [Heritable] added HeirOwnershipClaimed event 2018-01-18 16:42:19 -03:00
51c2c50437 [Heritable] ownerLives(): constant --> view 2018-01-18 16:42:19 -03:00
52b6181d78 renamed Inheritable --> Heritable 2018-01-18 16:42:19 -03:00
fe712c678a [SimpleSavingsWallet.js] replace assertJump for expectThrow 2018-01-18 16:42:19 -03:00
c70ee937e6 [Inheritable.js] replace assertJump for expectThrow 2018-01-18 16:42:19 -03:00
46736da489 added test for SimpleSavingsWallet 2018-01-18 16:42:19 -03:00
82c85121bb changed Inherited event for OwnershipTransfered 2018-01-18 16:42:19 -03:00
e5960465a7 owner can't be set as heir 2018-01-18 16:42:19 -03:00
5716492ebd setHeartbeatTimeout: public --> internal 2018-01-18 16:42:19 -03:00
c7807c5b58 changed view for constant 2018-01-18 16:42:19 -03:00
433213537f changed events names on inheritable test 2018-01-18 16:42:19 -03:00
560a855dc7 further example documentation 2018-01-18 16:42:19 -03:00
80ae074c57 marked ownerLives as view 2018-01-18 16:42:19 -03:00
d808e49b51 changed 'pronounce' for 'proclaim' 2018-01-18 16:42:19 -03:00
a8afb20c20 Use Inherited event instead of OwnershipTransfered 2018-01-18 16:42:19 -03:00
a613cd03c9 added example use-case for Inheritable.sol 2018-01-18 16:42:19 -03:00
b709206f9f fixes 2018-01-18 16:42:19 -03:00
2a560ad82f name fix 2018-01-18 16:42:19 -03:00
4fe2157e36 Inheritable contract 2018-01-18 16:42:19 -03:00
5a42a450ac Merge pull request #678 from ernestas2k/fix/rename-erc23-occurrences-to-erc223Mock#675
Rename ERC23 occurrences to ERC223
2018-01-18 11:31:18 -08:00
49adfea68b Merge branch 'master' into fix/rename-erc23-occurrences-to-erc223Mock#675 2018-01-18 11:12:07 -08:00
a29fce9cbd Merge pull request #689 from joejordan/patch-1
Update README.md
2018-01-18 12:48:37 -03:00
7f591a9181 Update README.md
I clarified where the "npm install zeppelin-solidity" command should happen. I got hung up on it initially and I know others have as well.
2018-01-18 10:41:28 -05:00
23afc74b59 Address feedback comments for ERC721 2018-01-18 10:15:59 -03:00
dcf1f8d22d Rename ERC23 occurrences to ERC223 2018-01-18 11:03:43 +02:00
c7f2138da1 Merge pull request #688 from AugustoL/refactor/reorganize-tests
Reorganize tests and add library folder
2018-01-17 18:31:13 -03:00
b67856c69d Separate ERC20 and ERC827 form tokens implementations in contracts and test folders 2018-01-17 16:24:29 -03:00
4fbd44fd40 Reorganize tests and add library folder 2018-01-17 15:59:15 -03:00
2887393712 Merge branch 'master' into fix/reference-of-rbac-usage 2018-01-17 15:31:50 -03:00
af337047a4 Fix solint errors 2018-01-17 12:00:15 -03:00
b0522b9c58 Merge pull request #518 from AugustoL/add-smart-token
Add ERC827 Token
2018-01-17 11:58:57 -03:00
969466b8fd Add ethjs-abi dependency needed in ERC827 tests 2018-01-17 11:22:09 -03:00
2b008f4cb6 Fix solidity linter errors 2018-01-17 11:21:25 -03:00
d060d29912 Merge remote-tracking branch 'upstream/master' into add-smart-token 2018-01-17 11:01:05 -03:00
75439c1dd3 fix reference of RBAC usage. 2018-01-17 21:45:30 +09:00
c8878adcbd Merge branch 'master' into refactor/info-md-updates 2018-01-16 21:57:35 -03:00
d95c3ade8f Minor changes as per feedback from @frangio 2018-01-16 19:52:38 -03:00
7811370000 Remove branching section and remove negative comment 2018-01-16 19:26:10 -03:00
b1e1aadba1 Simplified and updated CONTRIBUTING.md, small update to README.md 2018-01-16 19:11:30 -03:00
7ddd66fb74 fix increaseApproval in ERC827Token with tests 2018-01-16 18:43:50 -03:00
0cdc5e13ce Update ISSUE_TEMPLATE.md 2018-01-16 17:07:39 -03:00
5b50e99a0d ERC721 required functionality tests 2018-01-16 16:05:01 -03:00
b09d7aada4 Implement ERC721 required functionality 2018-01-16 16:04:26 -03:00
5fc5ded661 Provide ERC721 required functionality interface 2018-01-16 16:04:26 -03:00
146a22cd96 Merge pull request #661 from facuspagnuolo/enhancement/organize_test_files
Organize test files following contracts folders structure
2018-01-16 14:52:46 -03:00
b925b2dae6 Organize test files following contracts folders structure 2018-01-16 13:03:35 -03:00
87f5916341 Separate ERC827 interface in another contract 2018-01-15 21:17:32 -03:00
8854966847 change throw for require in MessageHelper contract@ 2018-01-15 21:15:21 -03:00
685d2087ca Add increase and decrease approval functions to ERC827 with tests 2018-01-15 20:56:25 -03:00
7532dab17d Merge pull request #677 from ernestas2k/fix/error-testing-in-delayed-claimable#672
Fix error testing in DelayClaimable tests
2018-01-15 18:48:43 -03:00
73a8be1449 Merge pull request #676 from Shrugs/feat/solidity-highlighting-#671
feat: add solidity syntax highlighting directive, fixes #671
2018-01-15 18:42:00 -03:00
c9fff647f4 Merge branch 'master' into fix/error-testing-in-delayed-claimable#672 2018-01-15 23:35:26 +02:00
ec2f7ba8d1 Merge pull request #673 from Shrugs/feat/solium
Solium Integration, Linting Refactor
2018-01-15 18:34:55 -03:00
a4029e7472 Fix error testing in DelayClaimable tests 2018-01-15 23:28:31 +02:00
ad5edd329f feat: add solidity syntax highlighting directive, fixes #671 2018-01-15 16:24:18 -05:00
955517dc2e fix: add ignore directives to SampleCrowdsale and SimpleToken 2018-01-15 16:11:45 -05:00
3b48a671fd fix: solium errors - whitespace related 2018-01-15 16:11:45 -05:00
bd2f1773cd fix: solium errors - function-order only 2018-01-15 16:11:45 -05:00
e60aee61f2 fix: solium errors - blank-line only 2018-01-15 16:11:45 -05:00
b2e2d9ab1c fix: solium errors - indentation only 2018-01-15 16:11:45 -05:00
4d263b7fc3 fix: the result of 'npm run lint:sol:fix' 2018-01-15 16:11:45 -05:00
e0f3fea97f feat: add solium linting to travis, npm script 2018-01-15 16:07:34 -05:00
d4dc4b25c8 fix: remove warning on timestamp usage 2018-01-15 16:07:34 -05:00
c1244d6297 updated soliumrc - Solium v1 compatible 2018-01-15 16:07:34 -05:00
462c52bcbf Merge pull request #601 from elopio/test/math
test: add tests for max64 and min64 from Math
2018-01-15 18:05:19 -03:00
9f68c00855 Merge pull request #667 from spalladino/feature/655-safemath_docs
Add documentation to safemath functions
2018-01-15 18:03:09 -03:00
4dcf8f5bd0 Merge pull request #674 from frangio/add-missing-awaits
Add missing awaits in tests
2018-01-15 17:38:05 -03:00
ea1cb5c54e add missing awaits in tests 2018-01-15 17:27:45 -03:00
49b42e8696 Minor change in SafeMath sub documentation 2018-01-15 15:44:06 -03:00
beea818f4e Merge pull request #638 from LimelabsTech/master
BuyTokens getting the token amount from a function instead of just multiplication. Useful for making Crowdsales with bonus periods
2018-01-15 15:42:49 -03:00
13b75bd5af Merge branch 'master' into master 2018-01-15 15:32:39 -03:00
e911b4d556 Add findMethod function in ERC827Token test 2018-01-12 13:08:55 -03:00
7bd95b1e31 Overload ERC20 funcitons with new _data argument 2018-01-11 16:35:21 -03:00
4ecdf312df Change order of ERC20 methods and call in transferData and transferDataFrom 2018-01-11 13:56:52 -03:00
f36f8e96dc Delete SmartToken old docs 2018-01-11 13:53:21 -03:00
e57f4be1fb Rename SmartToken to ERC827 2018-01-11 13:52:36 -03:00
a806520d6f change SmartToken test to work with new linter rules 2018-01-11 12:57:30 -03:00
a4b1cd6e31 Add SmartToken contract with tests and documentation
add missing public identifier in approveData in SmartToken contract

remove constact from showMessage function in message helper contract

move Message helper contract to mocks folder

move SmartTokenMock contract to mocks folder
2018-01-11 12:57:30 -03:00
21297e2b2c Add documentation to safemath functions
Fixes #655
2018-01-11 11:12:13 -03:00
94697726f5 Merge pull request #664 from Shrugs/fix/pr-template-syntax
fixup: issue template mdown syntax
2018-01-11 00:57:22 -05:00
a58e3e151a fixup: pr template mdown syntax 2018-01-10 15:08:23 -05:00
790b3b20c2 Merge pull request #646 from Shrugs/feat/npm-lint-fix-#642
feat: add 'npm run lint:fix' script
2018-01-09 18:52:55 -03:00
ed6e51494e Merge pull request #660 from facuspagnuolo/bugfix/659_add_transfer_event_to_simple_token
Emit Transfer event on SimpleToken creation
2018-01-09 15:53:10 -03:00
17884e91a1 Emit Trasnfer event on SimpleToken creation 2018-01-09 15:34:05 -03:00
59cd714b84 Merge pull request #641 from Shrugs/feat/issue-templates-#639
feat: implement issue and pr templates
2018-01-08 15:17:25 -03:00
a24031854b Merge branch 'master' into master 2018-01-07 22:27:03 +02:00
6cd84ffceb feat: add 'npm run lint:fix' script 2018-01-05 11:01:18 -06:00
29edd4e15e feat: implement issue and pr templates 2018-01-05 11:00:37 -06:00
6af6efc198 Merge pull request #635 from AugustoL/test/ECRecoveryMock
Add ECRecoveryMock contract
2018-01-05 13:55:55 -03:00
586c88802d Changed constant to view and more expressive comment 2018-01-05 17:30:10 +02:00
edbc64f337 Add missing semicolon in ECRecovery test 2018-01-04 16:39:41 -03:00
c73861d8b3 Use test message in ECRecovery tests and fix typos 2018-01-04 15:51:55 -03:00
d78bcbbae5 change web3.eth.accounts for accounts in ECRecovery test 2018-01-04 15:51:55 -03:00
326df13bf3 Add ECRecoveryMock contract 2018-01-04 15:51:55 -03:00
7852583fde reverted package.json file 2018-01-04 15:49:59 +02:00
5993f5b371 reverted back the version 2018-01-04 11:44:07 +02:00
04946211a5 Using the new overridable function 2018-01-03 11:14:02 +02:00
2f2ef68652 Increased Minor Version 2018-01-03 10:59:53 +02:00
ebdba08218 Added overridable getTokenAmount function 2018-01-03 10:54:30 +02:00
a74b7bd4b1 Merge pull request #613 from federicobond/remove-duplicate-constructor
Remove duplicated constructor call in FinalizableCrowdsaleImpl
2018-01-02 16:48:06 -03:00
090e2fca16 Remove duplicated constructor call in FinalizableCrowdsaleImpl 2018-01-02 16:26:02 -03:00
dbe8898d00 Merge pull request #636 from OpenZeppelin/release/v1.5.0
v1.5.0
2018-01-02 15:25:34 -03:00
52b2a619c7 Merge pull request #603 from elopio/patch-1
fix typo: that -> than
2018-01-02 13:14:04 -03:00
58ecbd6104 fix typo: that -> than 2018-01-02 15:58:35 +00:00
9aa61ad273 Merge pull request #634 from Shrugs/fix/destructible-typo
fix: TokenDestructible typo fron->from
2018-01-02 11:07:09 -03:00
7aa6f21147 fix: TokenDestructible typo fron->from 2017-12-31 19:06:38 +04:00
323d1fa941 Refactor assert revert helper to encapsulate promises (#628) 2017-12-28 00:39:55 -03:00
4073cf6585 v1.5.0 2017-12-22 19:50:42 -03:00
4ce0e211c5 Merge pull request #604 from elopio/tests/fix-ReentrancyGuard
test: fix the mocks path in ReentrancyGuard test
2017-12-22 18:41:58 -03:00
9af6ad5ddf Merge pull request #610 from TalAter/master
Documented increaseApproval() and decreaseApproval()
2017-12-22 18:32:38 -03:00
2f336f7aaf Merge pull request #614 from him2him2/master
Update HTTP -> HTTPS
2017-12-22 18:02:15 -03:00
5751eac444 Merge pull request #617 from spalladino/feature/reenable-coverage
Re-enable solidity coverage
2017-12-22 17:27:19 -03:00
cda518d353 Merge pull request #624 from AugustoL/change-uint-tokentimelock
Use uint256 in TokenTimeLock contract
2017-12-22 12:32:19 -03:00
f446f5c5cd Use uint256 in TokenTimeLock contract 2017-12-22 10:34:29 -03:00
1455a5a942 Re-enable solidity coverage
- Upgrade version
- Re-enable in travis.yml
- Move mocks to contracts folder for instrumentation
2017-12-20 18:28:22 -03:00
207b92f63c Merge pull request #602 from nemild/patch-1
Consistent spellings of reentrant
2017-12-20 15:40:27 -03:00
b217ef6314 Update HTTP -> HTTPS
URLs were updated to use HTTPS protocol
2017-12-19 15:32:38 -08:00
687dc19a4a Documented increaseApproval() and decreaseApproval() 2017-12-14 20:14:58 +02:00
161f25fc12 Made spelling for 'reentrant' consistent in comment 2017-12-07 22:48:55 -08:00
4bb26c32b6 test: fix the mocks path in ReentrancyGuard test 2017-12-08 02:57:29 +00:00
d91f4d4bc1 Consistent spellings of reentrant
Changed `rentrancy_lock` variable to `reentrancy_lock`
2017-12-06 16:03:55 -08:00
ddcae6254e Merge pull request #600 from izetex/fix/burnable-token-inheritance
Burnable Token should be inherited from Basic Token issue#596
2017-12-06 12:25:35 -03:00
fdfd90e6a4 fix the eslint static check 2017-12-06 14:57:41 +00:00
f162638cde test: add tests for max64 and min64 from Math 2017-12-06 06:37:45 +00:00
8375b6085f Burnable Token should be inherited from Basic Token issue#596 2017-12-06 08:08:42 +03:00
83b941c76c Merge pull request #580 from Shrugs/feat/rbac
feat: RBAC authentication contract and role library
2017-12-04 12:30:38 -03:00
63c8751e06 fix: linter errors 2017-12-04 17:08:28 +02:00
306132f823 Merge pull request #597 from JesseBusman/master
There's no need to throw when burning 0 tokens
2017-12-04 11:15:30 -03:00
677d05743c feat: update event names for OZ standards and test them 2017-12-04 13:42:55 +02:00
aef0f63aee There's no need to throw when burning 0 tokens
Throwing when trying to burn 0 tokens is an unnecessary special case.
If another contract wants to burn() a variable amount, it should not be forced to deal with this special case of burning 0.
2017-12-03 12:08:53 +01:00
5e55569db6 fix: make roles private 2017-12-01 18:15:44 +02:00
9bb2c958ec feat: add adminAddRole, adminRemoveRole, and make hasRole/checkRole public 2017-12-01 18:15:44 +02:00
e931c1cbfc feat: RBAC authentication contract and role library 2017-12-01 18:15:44 +02:00
dd1fd0002a Merge pull request #581 from Shrugs/feat/minor-additions
Minor standards and cleanup additions.
2017-12-01 12:22:01 -03:00
ac3808885a fix: default to empty string for mnemonic 2017-12-01 13:43:25 +02:00
258c001f7f feat: add linting to travis script 2017-12-01 13:40:11 +02:00
d07bdccc0c feat: manually fix linting errors across tests 2017-12-01 13:40:09 +02:00
227a335399 feat: move mock solidity contracts to mocks/ folder 2017-12-01 13:39:13 +02:00
58abd66969 feat: rename all test files to include .test.js postfix 2017-12-01 13:37:12 +02:00
8662846838 feat: apply eslint --fix across project 2017-12-01 13:37:09 +02:00
6ea0577bfe feat: enable eslint 2017-12-01 11:44:41 +02:00
b9b26e1d8a feat: allow configuration of ropsten and ganache with env variables 2017-12-01 11:43:49 +02:00
887c1bb925 feat: more comprehensive gitignore 2017-12-01 11:43:49 +02:00
cc5e898250 Merge pull request #588 from BrandonGilchrist/feature/delayed-crowdsale-docs
Add docs for DelayedClaimable
2017-11-29 18:36:33 -03:00
1cef36b5c0 Merge pull request #585 from Shrugs/feat/only-npm
feat: remove yarn in favor of npm
2017-11-29 11:59:28 -03:00
c95be493c3 fix: remove engines 2017-11-29 14:11:04 +02:00
bddc8755c1 Add docs for DelayedClaimable 2017-11-28 15:04:42 -08:00
3ad555bb01 fix: remove duplicate npm ls 2017-11-28 13:21:22 +02:00
846b0714ad feat: remove yarn in favor of npm 2017-11-27 20:44:59 +02:00
f79f7b00e3 Merge pull request #582 from Shrugs/fix/split-payment-payable
fix: make SplitPayment payable by default
2017-11-27 12:54:12 -03:00
47585b1117 fix: make SplitPayment payable by default 2017-11-24 17:02:53 +02:00
b7e7c765e0 v1.4.0 2017-11-23 13:30:54 -03:00
9e1da49f23 sync yarn.lock with package-lock.json 2017-11-23 13:21:05 -03:00
c29dd086d3 Update to testrpc 6.0.1 and test fixes for revert opcode. 2017-11-23 13:06:05 -03:00
b9cbea1c9c Merge pull request #576 from ajsantander/master
Address new compiler warnings
2017-11-23 12:54:44 -03:00
b254b74b87 Merge pull request #577 from redsquirrel/patch-1
Minor formatting change
2017-11-23 12:47:51 -03:00
bb1736e376 Change visibility of fallbacks to external 2017-11-23 12:28:46 -03:00
11349835e9 Minor formatting change 2017-11-23 08:22:59 -06:00
c6e0edb268 Remove solidity warnings in tests 2017-11-23 10:57:36 -03:00
b50391862c Changes to remove warnings 2017-11-23 10:41:18 -03:00
0bcf0a2001 Merge pull request #573 from ajsantander/master
Update to truffle 4.0.0 and solc 0.4.18
2017-11-22 19:26:38 -03:00
0eaa5f50ac Disable solidity-coverage
This is required to update to truffle 4 and solc 0.4.18, see PR #573
2017-11-22 19:08:31 -03:00
ce86029f6a Update solidity version on test helpers 2017-11-22 19:00:13 -03:00
815d9e1f45 Replace constant with view/pure 2017-11-22 18:59:54 -03:00
e6213767fa Update all solidity versions to 0.4.18 2017-11-22 18:52:52 -03:00
f28c245a3c Update to truffle 4.0.0
had to up the gasLimit in test.sh to avoid an out of gas error when deploying the scripts
2017-11-22 18:52:52 -03:00
12303ceaf5 fix treatment of bignumber in CappedToken test 2017-11-22 15:27:52 -03:00
9001ce9d3a Merge pull request #515 from cwhinfrey/master
Create CappedToken, a capped MintableToken
2017-11-22 15:25:12 -03:00
492ef4a419 Merge pull request #571 from quantum13/patch-1
Small code style change
2017-11-22 14:33:01 -03:00
5f67dd7868 Merge pull request #574 from gakonst/master
Fix unused variable warning in `Standard Token.sol`
2017-11-22 14:32:19 -03:00
3c5a268da4 fixes #572 2017-11-22 12:55:11 +00:00
db5a12cfdd Merge pull request #506 from TalAter/fix/deprecated-throw-in-tests
Replace deprecated throw with assert in Solidity tests
2017-11-21 14:41:31 -03:00
03ad0efd29 Small code style change
http://solidity.readthedocs.io/en/develop/style-guide.html#other-recommendations
The visibility modifiers for a function should come before any custom modifiers.
2017-11-20 23:13:32 +03:00
5fc53b6f2f Replaced assert with require 2017-11-19 01:34:24 +02:00
99f3e26f83 Merge pull request #568 from frangio/readme-npm-init
Add npm init in README
2017-11-17 17:50:55 -03:00
151371cc86 add npm init in README 2017-11-17 17:34:36 -03:00
376208bd96 Merge pull request #566 from onbjerg/patch-1
Make coverage badge flat
2017-11-17 16:59:15 -03:00
11b63d4fc1 Revert alt text for coverage badge 2017-11-17 20:49:41 +01:00
39ae5b4cca Make coverage badge flat 2017-11-17 13:16:00 +01:00
670b843b63 Merge pull request #553 from limexp/fix/534-ci-versions-info
added versions output to Travis CI log #534
2017-11-16 15:16:09 -03:00
070d25dc9e Merge pull request #564 from spalladino/fix/travis-no-prs-notifications
Do not notify via Slack about PR build failures
2017-11-16 12:29:38 -03:00
9684ce76c5 Do not notify via Slack on PRs 2017-11-16 10:20:34 -03:00
d919f0dde2 Merge pull request #487 from limexp/fix/docs
fix docs issue #459 and align with README.md
2017-11-15 18:27:10 -03:00
689e18aab5 Merge branch 'master' into fix/docs 2017-11-15 18:19:12 -03:00
8765e2a53f Use instead of directly calling on 2017-11-15 16:14:28 -05:00
7a19bcf6d9 Merge pull request #505 from ZumZoom/patch-1
Finish minting should be called only once
2017-11-15 11:59:05 -03:00
088897150e Merge pull request #526 from amazingandyyy/patch-1
Update RefundVault.sol
2017-11-15 11:56:03 -03:00
34be16d939 Merge pull request #522 from emn178/feature/improve_mul
improve mul performance and reduce gas cost
2017-11-14 17:49:09 -03:00
14ae881e26 Merge pull request #544 from maraoz/timer-improvement
remove timer test helper
2017-11-14 17:24:42 -03:00
666a3a73e0 remove unused 'day' test variable 2017-11-14 12:50:43 -05:00
84bffb854a Merge pull request #477 from facuspagnuolo/feaure/create_detailed_erc20_interface
Create detailed ERC20 interface
2017-11-13 15:42:09 -03:00
365c875ced Create detailed ERC20 interface 2017-11-13 15:36:02 -03:00
7dd0ee6212 remove timer 2017-11-12 15:10:46 -05:00
7123faff9f added versions output to Travis CI log #534 2017-11-11 16:32:38 +03:00
61b5921ab2 Fix typo 2017-11-10 20:20:44 -05:00
e72c7ce91b Merge pull request #417 from abarmat/feature-splitpayment-contract
Feature SplitPayment contract
2017-11-10 18:45:56 -03:00
c4ca7f03e3 improve timer test helper 2017-11-10 13:29:58 -08:00
9be77ddd54 Merge pull request #469 from nedodn/patch-2
Update TokenTimelock.sol: Issue #464
2017-11-10 17:44:20 -03:00
70a17d0b96 Merge pull request #475 from et/patch-2
Add `npm init`
2017-11-10 17:31:58 -03:00
ad2282456e Merge pull request #478 from rudygodoy/patch-2
Fixes typos in documentation
2017-11-10 17:26:00 -03:00
fe3e360483 Merge pull request #482 from sohkai/patch-1
Small typo fixes for bounty docs
2017-11-10 17:24:26 -03:00
5a857fc1a7 Merge pull request #490 from Nedudi/master
Update SimpleToken.sol
2017-11-10 17:15:52 -03:00
c5cd35b2ea Merge pull request #504 from FloorLamp/patch-1
Update ecrecovery.rst
2017-11-10 17:07:16 -03:00
a808b0b03f Merge pull request #523 from thesved/patch-1
Math.sol is not used, not needed
2017-11-10 16:19:01 -03:00
4e8f422a81 Merge pull request #542 from spalladino/feature/travis-notifications
Add Slack notifications
2017-11-10 15:27:03 -03:00
070226d624 Add Slack notifications 2017-11-10 13:18:20 -03:00
2413f83504 Include 'revert' in expectThrow() helper 2017-11-10 11:41:17 -03:00
be692e59eb Update RefundVault.sol 2017-10-31 00:13:27 -07:00
e74652415f Math.sol is not used, not needed
Small thing, but the Math.sol is not really needed, since it is not used.
2017-10-30 11:07:26 +01:00
5ad07e1892 improve mum performance and reduce gas cost 2017-10-30 09:58:52 +08:00
575372f660 Add Capped Token tests 2017-10-25 23:58:36 -04:00
7a26a0ecf1 Add capped token contract 2017-10-25 23:57:21 -04:00
8e01dd14f9 Merge pull request #510 from doraemondrian/master
Use address(0) instead of 0x0
2017-10-24 16:46:05 -03:00
5088c64140 Merge pull request #503 from martriay/fix-missing-safemath
[TokenVesting] Add missing safemath ops
2017-10-23 12:53:25 -03:00
ac4a19dd7d Use address type 2017-10-23 03:11:14 -07:00
09b1926c41 Use address type 2017-10-23 03:10:40 -07:00
d7b67eca52 Use address type 2017-10-23 03:10:00 -07:00
e4427befbb Use address type 2017-10-23 03:08:30 -07:00
ca1babe1f7 Use address type 2017-10-23 03:06:51 -07:00
1d54b86a7c Replace deprecated throw with assert in Solidity tests 2017-10-17 21:02:47 +03:00
2d83c557b1 Finish minting should me called only once
Multiple calls to `finishMinting` will emit multiple `MintFinished` events which may be surprising if one rely on `MintFinished` event.
2017-10-17 16:24:16 +03:00
dfb9ebd647 Update ecrecovery.rst
Fix typo
2017-10-16 17:50:25 -04:00
b60e434e0b [TokenVesting] Add missing safemath ops 2017-10-16 03:48:32 -03:00
39d6c92069 Merge pull request #497 from martriay/token-vesting-fix
[TokenVesting] vestedAmount should return the historical vested amount
2017-10-13 16:46:37 -03:00
eb9f88bafc [TokenVesting] Remove unused variable 2017-10-13 16:20:24 -03:00
aa431dfb20 [TokenVesting] Increase released amount before transfer 2017-10-13 16:13:54 -03:00
fff8e040b7 [TokenVesting] vestedAmount returns the historical vested amount 2017-10-13 15:32:44 -03:00
74636b7333 [TokenVesting] Use SafeMath 2017-10-12 00:34:03 -03:00
647fc13963 Merge pull request #492 from frangio/fix-vesting-revoke
TokenVesting bugfix
2017-10-11 16:58:21 -03:00
d5e0714faf use safeTransfer 2017-10-11 16:31:31 -03:00
a184013d1e explicitly mark functions public 2017-10-09 19:08:32 -03:00
7d08c4da7f make TokenVesting variables public 2017-10-09 19:02:57 -03:00
01b92d1d56 fix a problem when revoke is called twice 2017-10-09 19:01:04 -03:00
790833e5d4 Update SimpleToken.sol 2017-10-08 04:26:21 +03:00
2cb2799a51 align docs developer-resources.rst with README.md 2017-10-07 23:44:43 +03:00
9dcf37dd19 align docs getting-started.rst with README.md 2017-10-07 23:37:37 +03:00
0d89e99ceb Fix contracts path issue 2017-10-07 23:24:23 +03:00
a5a1be7219 Fixing docs issue #459 2017-10-07 23:21:58 +03:00
5aba967db9 Merge pull request #476 from martriay/add-token-vesting
Add token vesting
2017-10-05 18:44:39 -03:00
ffd1090718 [TokenVesting] Remove VestedTokenMock 2017-10-04 18:08:36 -03:00
22b9263674 [TokenVesting] Remove VestedToken and LimitedTranferToken 2017-10-04 14:52:55 -03:00
d21d35ca6f [TokenVesting] Fix test. 2017-10-04 14:52:31 -03:00
4e39f50aec [TokenVesting] Remove unnecessary instatiation on test. 2017-10-04 14:52:31 -03:00
9e0e80e820 [TokenVesting] Allow instantiation of already started vesting contracts. Improve comments' wording. 2017-10-04 14:52:31 -03:00
562fb6945f [TokenVesting] Rename events according to convention 2017-10-04 14:52:31 -03:00
822de45bfc [TokenVesting] Add a start parameter to constructor to defer vesting 2017-10-04 14:52:30 -03:00
bd56163900 [TokenVesting] Fix vestedAmount calculation. Linearity test watches beneficiary balance over vestedAmount 2017-10-04 14:52:30 -03:00
696615d392 [TokenVesting] Add linear release test 2017-10-04 14:52:30 -03:00
645edfc936 [TokenVesting] Fix should-revoke test 2017-10-04 14:52:30 -03:00
a227b212f5 [TokenVesting] Add tests 2017-10-04 14:52:30 -03:00
c11265e694 [TokenVesting] Add events 2017-10-04 14:52:30 -03:00
6344a76f83 add pending tests 2017-10-04 14:52:30 -03:00
3da7c31484 add revocable flag 2017-10-04 14:52:30 -03:00
998c72ab5b add preconditions to constructor 2017-10-04 14:52:30 -03:00
00f323d132 add shortcut for vestedAmount after vesting end 2017-10-04 14:52:30 -03:00
80e591f487 add TokenVesting contract 2017-10-04 14:52:30 -03:00
1333f45cdc Add missing code blocks to bounty docs 2017-10-01 22:34:58 -04:00
2ad88b59f6 Small indenting fix for bounty docs 2017-10-01 22:27:42 -04:00
a9055f5ce2 Fixes typos 2017-09-29 14:55:18 -05:00
9b0e89c4bf Add npm init
If you don't do this, you'll receive this error:

```
❯ zeppelin npm install zeppelin-solidity
npm WARN saveError ENOENT: no such file or directory, open '/Users/et/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/Users/et/package.json'
npm WARN et No description
npm WARN et No repository field.
npm WARN et No README data
npm WARN et No license field.

+ zeppelin-solidity@1.3.0
updated 1 package in 0.677s
```
2017-09-28 17:18:47 -06:00
27f8609ac9 Update TokenTimelock.sol: Issue #464
Removed deprecated function claim() as per Issue #464.
2017-09-27 14:07:08 -05:00
5cf503673f Merge pull request #466 from phiferd/master
Using require for Token preconditions
2017-09-25 11:53:50 -03:00
3837319141 Adding some additional tests 2017-09-23 17:06:14 +08:00
e70dd18734 Moving business logic preconditions to the beginning of the function. 2017-09-23 11:57:29 +08:00
158a7a881d Merge pull request #460 from dmx374/patch-3
Add explicit visibility
2017-09-22 17:32:39 +02:00
725ed40a57 v1.3.0 2017-09-21 14:18:08 -03:00
3733c069c9 Add explicit visibility 2017-09-19 08:29:03 +02:00
1df75a951f Merge pull request #446 from jakub-wojciechowski/master
Make approve method compliant with ERC20
2017-09-18 18:38:37 -03:00
adfd8fb6a9 Warning in approve method documentation. 2017-09-18 18:38:05 -03:00
98f672b534 Make approve method compliant with ERC20 2017-09-18 18:38:05 -03:00
e9068859b6 Merge pull request #448 from SylTi/fix/small-fixes
A bunch of small fixes
2017-09-18 18:18:55 -03:00
1203a2473d add whenNotPaused modifier to all of PausableToken functions that modify it's state. Fix #401 2017-09-18 22:49:22 +02:00
4a1ff913ab replace var by uint256 in StandardToken. Fix #432 2017-09-18 22:46:52 +02:00
83918cad4b change approve() to conform to ERC20. Fix #438 2017-09-18 22:46:52 +02:00
d3c5ce268f Merge pull request #260 from yondonfu/feature/merkleproof
Merkle proof library with tests and docs
2017-09-18 16:47:17 -03:00
f60c5ad88a Merge pull request #445 from frangio/fix-leftover-testrpc
Properly kill background testrpc instance
2017-09-18 15:54:42 -03:00
bcda5bfe9b Merge branch 'master' into feature/merkleproof 2017-09-18 14:01:10 -04:00
33eb8b1da5 Merge pull request #457 from sot528/fix-typo
Just fix typo.
2017-09-18 14:26:21 -03:00
b069827bad fix typo. 2017-09-19 01:57:50 +09:00
74e416f04f Merge pull request #450 from dmx374/master
Explicit public visibility on methods
2017-09-18 12:58:34 -03:00
b395b06b65 Explicit public visibility on methods 2017-09-18 12:57:46 -03:00
bd84db735d Merge pull request #450 from aupiff/master
removing trailing whitespace
2017-09-18 12:01:22 -03:00
bd99b207c9 Merge pull request #454 from economicnetwork/master
comments on vesting
2017-09-18 11:46:48 -03:00
2438557255 explain cliff 2017-09-18 12:41:54 +07:00
9f1826d83e vesting: more corrections on comments 2017-09-18 12:22:23 +07:00
676f5f6931 comments on vesting 2017-09-18 12:18:10 +07:00
6d8bb497c8 removing trailing whitespace 2017-09-16 10:20:06 -04:00
5fd8684a5a properly kill background testrpc instance 2017-09-14 15:40:14 -03:00
1737555b0d Merge pull request #439 from frangio/fix-436
Remove indexed declaration of value in Burn event
2017-09-11 12:28:30 -03:00
eda63c75c4 Merge pull request #440 from spalladino/fix/simple_token_initial_supply
Fix INITIAL_SUPPLY in SimpleToken example
2017-09-11 12:27:35 -03:00
61f62eb3c7 Fix INITIAL_SUPPLY in SimpleToken example
Use token decimals
2017-09-11 12:13:19 -03:00
f96ebfca31 cosmetic changes to BurnableToken 2017-09-11 12:11:00 -03:00
fac580d1a9 remove indexed declaration of uint event parameter 2017-09-11 12:08:23 -03:00
dc1017c929 Simplify implementation using similar interface as PullPayment contract 2017-09-09 12:04:31 -03:00
07b688a0e6 Merge pull request #430 from frangio/fix-unchecked-transfer
Use SafeERC20 to transfer tokens safely
2017-09-07 20:33:43 -03:00
20187f2970 use SafeERC20#safeTransfer 2017-09-07 20:04:48 -03:00
84be318ca9 Merge pull request #424 from eugene-babichenko/transfer-ownership-event
Add OwnershipTransferred event to Ownable contract and its derivatives
2017-09-07 11:59:29 -03:00
5035718e4b fixed wrong call order in Ownable.transferOwnership 2017-09-07 11:59:36 +03:00
fdc8fbaa45 Merge pull request #428 from frangio/fix-425-pausable-docs
Fix Pausable documentation
2017-09-06 16:25:37 -03:00
99887da49a fix Pausable documentation 2017-09-06 15:07:12 -03:00
7a36a6c92a fix calls to OwnershipTransferred 2017-09-06 10:31:23 +03:00
6beac0f215 add previousOwner field to OwnershipTransferred event 2017-09-06 10:29:25 +03:00
b59469c151 fire OwnershipTransferred event when the owner of an Ownable contract instance actually changed 2017-09-05 18:32:07 +03:00
b07466a477 Merge pull request #420 from sh4ka/patch-1
Fix docblock syntax
2017-09-01 11:25:50 -03:00
0bd22e78d3 Fix docblock syntax 2017-09-01 14:03:31 +01:00
69e83e5086 Add a SplitPullPayment contract that combines distribution of funds and delayed withdrawal from each party 2017-08-29 12:06:24 -03:00
8336785a9b Add a SplitPayment contract to distribute funds among multiple beneficiaries 2017-08-29 12:06:23 -03:00
f073352632 Merge pull request #416 from frangio/add-comment-basictoken-throw
Add comment making explicit that transfer throws without enough balance
2017-08-29 12:05:14 -03:00
aad25205cd add comment making explicit that SafeMath.sub can throw 2017-08-29 11:51:41 -03:00
dcdc453a55 Merge pull request #413 from frangio/add-safe-erc20
Add SafeERC20 helpers
2017-08-28 19:43:32 -03:00
5636575327 Merge pull request #415 from frangio/merge-411-manually
Check that destination of token transfers is not 0x0
2017-08-28 19:41:29 -03:00
00f80c726a fix reference to mock contract 2017-08-28 19:31:19 -03:00
74db6c2b3b add missing test for error when doing transferFrom to 0x0 2017-08-28 19:31:19 -03:00
d095ba84bf Add tests to check transfers to 0x0 fail 2017-08-28 19:31:19 -03:00
209e2de93b Fix for #400: Check that destination of token transfers is not 0x 2017-08-28 19:31:07 -03:00
c37c233d22 add SafeERC20 tests for succeeding operations 2017-08-28 19:27:56 -03:00
7b463769a5 explain how to use SafeERC20 2017-08-28 17:34:25 -03:00
c7636bdc4c add safe ERC20 helpers 2017-08-28 17:32:18 -03:00
307d34e05a Merge pull request #407 from frangio/rename-truffle-config
Rename Truffle config file
2017-08-25 20:47:43 -03:00
69e21dacb8 rename truffle.js to truffle-config.js 2017-08-25 20:08:54 -03:00
f27a1ac040 update solidity-coverage to 0.2.2 2017-08-25 20:08:54 -03:00
af6fdae3dd Merge pull request #348 from SylTi/refactor/HasNoToken
refactor HasNoTokens.sol to extract reclaimToken
2017-08-24 20:24:34 -03:00
6ae22e084a Merge pull request #406 from frangio/update-testrpc-4.1.1
Update testrpc to 4.1.1
2017-08-24 19:41:31 -03:00
d463b26709 bump testrpc to 4.1.1 2017-08-24 18:36:03 -03:00
271e6192e8 remove moment.js from package-lock 2017-08-24 18:36:03 -03:00
51906bae6c refactor 2017-08-24 21:42:31 +02:00
406004a99a refactor HasNoTokens.sol 2017-08-24 21:42:31 +02:00
b50894aabe Merge pull request #405 from androolloyd/fix/396-make-decimals-uint8-in-token-example
changed decimal to be uint8 so that it matches the ERC20 specification.
2017-08-24 11:12:29 -03:00
d6f07267ee Merge pull request #403 from rstormsf/patch-2
Remove confusing comment left from FinalizableCrowdsale
2017-08-24 11:07:51 -03:00
1827cbfd2a changed decimal to be uint8 so that it matches the ERC20 specification. 2017-08-24 10:41:41 -03:00
a0c0cb66c5 Remove confusing comment left from FinalizableCrowdsale
AFter this PR 
https://github.com/OpenZeppelin/zeppelin-solidity/pull/364
the comment was left.
2017-08-23 18:57:22 -07:00
47aa4bbf8f Merge pull request #394 from sot528/fix/remove-coverall-script
Removed coveralls script from package.json
2017-08-22 20:48:37 -03:00
33de70158c remove coveralls script from package.json 2017-08-22 10:15:21 +09:00
f45a4e8243 Merge pull request #392 from OpenZeppelin/revert-376-bugfix/windowsIncompatibilty
Revert Truffle config renaming
2017-08-21 16:30:02 -03:00
ac75f4e2ed Revert "[bugfix] windows incompatibilty" 2017-08-21 16:04:30 -03:00
631748480e Merge pull request #391 from rudygodoy/pr-224-tests
Added tests for PR #224
2017-08-21 15:47:02 -03:00
3d5c759d62 Merge pull request #388 from duckranger/patch-1
Update limitbalance.rst
2017-08-21 15:36:51 -03:00
2e0440e549 Merge pull request #389 from duckranger/patch-2
Update pullpayment.rst
2017-08-21 15:36:31 -03:00
86beb5b730 Merge pull request #376 from SylTi/bugfix/windowsIncompatibilty
[bugfix] windows incompatibilty
2017-08-21 15:34:40 -03:00
289fd87ef8 Tests increase and decrease allowance for spender
- Spender starts with 0 tokens allowed to spend
- Spender is granted 50, then decreased it's allowance by 10

Refs PR #224
2017-08-20 23:20:09 -05:00
8b11035b39 Indentation refactoring. 2017-08-20 23:13:39 -05:00
21f251eafb Removed onlyPayloadSize modifier 2017-08-20 23:11:23 -05:00
e7b1c33955 Update StandardToken.sol
Added increaseApproval and decreaseApproval to increase / decrease the approval in 1 transaction.
2017-08-20 23:10:28 -05:00
1da0467820 Update pullpayment.rst
Fixed typo
2017-08-20 22:00:42 +12:00
05609de044 Update limitbalance.rst
Fixed typo
2017-08-20 21:58:27 +12:00
02fb43ff52 Merge pull request #386 from frangio/remove-packagejson-main
Remove main field from package.json
2017-08-19 18:35:14 -03:00
1626c0095f Merge pull request #369 from frangio/parallelize-travis
Make Travis run tests and coverage in parallel
2017-08-19 18:34:09 -03:00
341ce621a9 remove main field from package.json 2017-08-19 18:22:42 -03:00
52efe2412c Merge pull request #384 from frangio/fix-pausabletoken-documentation
Fix PausableToken documentation
2017-08-19 16:40:13 -03:00
84e3e76bb8 fix PausableToken documentation 2017-08-19 16:35:46 -03:00
1d162e95c5 Merge pull request #377 from yaronvel/master
fix for issue 375: transferFrom allows sending to self more than self balance
2017-08-19 16:26:46 -03:00
060843d912 Merge pull request #380 from skywinder/typo-fix
Fixed typos in documentation
2017-08-19 16:24:31 -03:00
d3bc0a4ef7 Merge pull request #379 from skywinder/patch-1
Fixed typo in documentation
2017-08-19 16:22:58 -03:00
d1a82dde63 Merge pull request #373 from Neurone/patch-1
Fix mispelled words (#371)
2017-08-19 16:06:57 -03:00
99efe80c61 fixed typos in standart token doc 2017-08-18 15:35:13 +03:00
b12db57f34 Fixed typo
recieve -> receive
2017-08-18 15:25:15 +03:00
9333fec5f1 fix to issue 375 2017-08-17 21:56:11 +03:00
6f94af9264 fix windows incompatibilty 2017-08-17 12:34:43 +02:00
0ed98ea9b9 Merge pull request #368 from jakub-wojciechowski/master
Remove moment.js dependencies
2017-08-16 10:17:53 -03:00
0b66144942 Merge pull request #374 from rstormsf/patch-1
Remove beta tag from truffle
2017-08-16 01:12:51 -03:00
b91a3eded3 Remove beta tag from truffle
truffle@beta uses old solc 0.4.11
truffle main branch uses most up to date 0.4.15
2017-08-15 14:55:37 -07:00
7c9c0f6538 Fix for mispelled words (#371) 2017-08-15 23:08:41 +02:00
0d6846a882 Remove moment.js dependencies - updates after review 2017-08-15 12:31:49 +02:00
84a68e0c25 Merge pull request #364 from frangio/remove-crowdsale-finish-minting
Remove token.finishMinting() from default finalization
2017-08-14 14:57:22 -03:00
e82fa4eae0 parallelize tests and coverage in travis 2017-08-14 13:37:53 -03:00
c79c6d76d8 unify test and coverage scripts 2017-08-14 13:37:11 -03:00
36452136f1 add test for finishMinting 2017-08-13 22:41:25 -03:00
17cfb0fc78 Remove moment.js from package dependencies 2017-08-14 00:36:01 +02:00
e86ac90853 Refactor and remove moment.js usages 2017-08-14 00:27:09 +02:00
99e0f5b5cb Refactor time manipulation in TokenTimelock tests 2017-08-14 00:21:57 +02:00
4fc6bb7977 remove token.finishMinting() from default finalization 2017-08-12 22:02:44 -03:00
6e66ba321e Merge pull request #363 from frangio/sync-yarn-npm-locks
Sync yarn.lock file with package-lock.json
2017-08-12 19:26:58 -03:00
2c2067ecc1 sync yarn.lock file with package-lock.json
1. deleted node_modules
2. ran `npm install`
3. deleted yarn.lock
4. ran `yarn import`
2017-08-12 18:57:32 -03:00
e6a7a978d1 Merge pull request #362 from cgewecke/bump-solidity-coverage
Upgrade solidity coverage to ^0.2.1
2017-08-12 18:42:55 -03:00
3e02f45f67 Upgrade solidity coverage to ^0.2.1 2017-08-12 14:20:14 -07:00
b972f43513 Merge pull request #345 from SylTi/master
Add Transfer event when token is minted
2017-08-11 14:47:43 -03:00
30d02b1c78 Merge pull request #357 from frangio/fix-hdwallet-dependency
Move truffle-hdwallet-provider to devDependencies
2017-08-11 13:13:11 -03:00
479d01101d move truffle-hdwallet-provider to devDependencies 2017-08-11 11:30:44 -03:00
2b079136fb Merge pull request #353 from jakub-wojciechowski/master
Change crowdsales to use timestamps instead of block numbers #350
2017-08-10 12:42:55 -03:00
46c5759b88 Introduce increaseTimeTo helper method. 2017-08-10 16:23:52 +02:00
7c883b6368 Duration helper and eliminated hardcoded periods 2017-08-10 13:13:49 +02:00
69daed7746 Merge pull request #341 from lsaether/master
Added contracts/token/BurnableToken.sol
2017-08-09 17:22:58 -03:00
0b9afefa93 Merge pull request #339 from abarmat/typo-1
Fix typo in SafeMath doc
2017-08-07 17:25:36 -03:00
52490b92bf Merge pull request #340 from abarmat/style-1
Add missing parentheses in modifier
2017-08-07 17:25:01 -03:00
2261039d52 Simplify advanceBlock in tests 2017-08-07 18:29:09 +02:00
24323d3ce3 MerkleTree util class hashes elements 2017-08-07 11:23:52 -04:00
c6e055689b Change crowdsales to use timestamps instead of block numbers #350 update example 2017-08-06 16:42:16 +02:00
2b5192b9ce Change crowdsales to use timestamps instead of block numbers #350 update derived crowdsales 2017-08-06 16:41:43 +02:00
77dfcb6e23 Change crowdsales to use timestamps instead of block numbers #350 2017-08-06 16:40:19 +02:00
4fe837704b Add Transfer event when token is minted to be fully ERC20 compliant &
tests
2017-08-05 00:14:01 +02:00
cf58330936 added tests for BurnableToken 2017-07-31 17:23:23 -07:00
287b873add Merge pull request #338 from jeremygrenier/master
Remove return values of pause() and unpause() of Pausable
2017-07-31 11:58:56 -03:00
115e7afe0b Merge pull request #342 from jakub-wojciechowski/master
Add complex crowdsale example #331
2017-07-31 11:42:38 -03:00
a9e1fcd623 Add complex crowdsale example #331 requested changes 2017-07-29 09:00:54 +01:00
04e0b2e5c2 Add complex crowdsale example #331 tests 2017-07-29 00:29:59 +01:00
2403508e1b Add complex crowdsale example #331 2017-07-29 00:29:17 +01:00
b414545b6e fixed typos XP 2017-07-28 16:11:27 -07:00
3296471bda Added contracts/token/BurnableToken.sol 2017-07-28 16:07:04 -07:00
eb5b6252bc Add missing parentheses in modifier 2017-07-28 20:59:11 +02:00
e5da857d4f Fix typos in SafeMath doc 2017-07-28 20:53:55 +02:00
09a8da5d6a Remove return values of pause() and unpause() of Pausable 2017-07-28 17:35:27 +02:00
863ad48a81 Check proof length multiple of 32. Use keccak256 instead of sha3 2017-07-28 10:38:32 -04:00
de0e6ba222 Merge pull request #333 from frangio/examples
Move examples to separate directory
2017-07-26 20:22:20 -03:00
91e5a925d9 Merge pull request #334 from OpenZeppelin/upgrade/truffle-3.4.6
Upgrade truffle to 3.4.6
2017-07-26 19:33:01 -03:00
5e7c168b25 Fix missing storage keyword warnings 2017-07-26 17:23:20 -03:00
6fccd202fe Fix invalid number of args for solidity function errors in tests 2017-07-26 17:20:28 -03:00
18e98fbba8 Upgrade version of Truffle to 3.4.6 2017-07-26 16:36:13 -03:00
a799d218fd add constant qualifier 2017-07-26 16:12:05 -03:00
9f0cbd3303 move example contract 2017-07-26 16:12:05 -03:00
93fb8f35a8 Merge pull request #328 from frangio/remove-multisig
Remove MultisigWallet in favor of ConsenSys/MultiSigWallet
2017-07-24 19:13:23 -03:00
2303fd51a3 Merge pull request #329 from frangio/fix-test-script-cleanup
Fix test script cleanup and portability
2017-07-24 19:06:08 -03:00
910fc4915e Merge pull request #330 from frangio/coveralls-notification
Remove coveralls token
2017-07-24 18:00:27 -03:00
002acb984e remove coveralls token from repository 2017-07-24 17:23:24 -03:00
bebe704688 use portable shebang line 2017-07-24 13:57:42 -03:00
9a006f3a68 add check to see if process is running
because when we interrupt the tests via ^C, the signal also kills the
background process
2017-07-24 13:57:34 -03:00
58e2e4d742 remove MultisigWallet in favor of ConsenSys/MultiSigWallet 2017-07-24 13:26:48 -03:00
60bc6a6da5 Merge pull request #327 from jakub-wojciechowski/master
fix testing error throwing
2017-07-22 22:17:32 -03:00
b3f60b9320 refactor testing error throwing 2017-07-22 21:40:01 +01:00
e9cf6dfb60 Merge pull request #323 from pooleja/fix/ownable_error
Fix/ownable error - Silent transferOwnership Failure
2017-07-22 15:57:45 -03:00
5e7847537a fix testing error throwing 2017-07-22 11:46:49 +01:00
64787b1ac5 Add semicolon to match coding standards 2017-07-21 23:07:50 -07:00
58fdb956b5 Add assert to prevent regression 2017-07-21 23:04:50 -07:00
4d91118dd9 Merge pull request #320 from cgewecke/coverage-badge
Minor coverage maintenance
2017-07-21 16:06:23 -03:00
ed872ca0a1 Minor coverage maintenance 2017-07-21 11:25:53 -07:00
1bb1d41beb Merge pull request #281 from rudygodoy/master
Tests refactoring and typo fixes
2017-07-21 11:57:13 -03:00
1db46aa5d5 Merge pull request #292 from jakub-wojciechowski/test/pausable
Test if unpause prevents events allowed in paused state
2017-07-21 11:39:42 -03:00
c991eaf916 Merge pull request #325 from frangio/refactor/test-script
Refactor test script
2017-07-21 11:13:40 -03:00
86a69fd6d6 refactor test script
- fix status code (script exited with success even with failing tests)
- clean up and explain things
2017-07-20 18:58:31 -03:00
6735a3ccd6 Renamed tAMOUNT to much friendly amount 2017-07-20 16:01:41 -05:00
6d565ef841 Fix auto-formatting 2017-07-20 10:58:16 -07:00
b2e36314cb Add requirement for address to not be 0 and throw error 2017-07-20 10:51:57 -07:00
6904f12032 Merge with upstream/master 2017-07-20 07:01:58 -05:00
c3a30e9be3 Merge pull request #318 from BrianGuo/master
changed instances of uint to uint256
2017-07-19 15:54:53 -03:00
93b953fb48 changed instances of uint to uint256; fixes issue #226 2017-07-19 09:59:46 -04:00
e2fdf09e9b v1.2.0 2017-07-18 15:07:10 -03:00
4f44427966 Added function helper, few changes on ECRecover lib 2017-07-18 11:31:30 -03:00
f8c0fab5d8 Fixed tests and few changes on contract comments 2017-07-18 11:31:30 -03:00
478d1b1a93 Removed safeRecover, using ecrecover method instead, recovering signature from entire hash 2017-07-18 11:31:30 -03:00
a68eaa4e2d Added NatSpec documentation on ECRecovery contract 2017-07-18 11:31:30 -03:00
68c2bcb9dd Removed .only on ECRecovery tests 2017-07-18 11:31:30 -03:00
635c04378d Removed ECRecovery mock contract, ECRecovery funcions are public constants 2017-07-18 11:31:30 -03:00
227c7aae0f added check to ret boolean on ECRecovery 2017-07-18 11:31:30 -03:00
641b751385 Fix ECRecovery contract indentation
Fix ident on github

Fix ident github

Fix ident on github
2017-07-18 11:31:30 -03:00
4201d50dcf ECRecovery library added with test and docs 2017-07-18 11:31:30 -03:00
b05fb9c200 Update ownable.rst
Change the name of the function in the docs to the actual name in the contract source To prevent misunderstandings.
2017-07-17 21:37:59 -03:00
4f34d41523 Fixing typo. 2017-07-17 21:37:32 -03:00
91fc295a42 Updated reference to Ownable contract. 2017-07-17 21:37:32 -03:00
67d3a759a7 leave weiAmount after PR comments 2017-07-17 21:36:09 -03:00
950b6a5e56 sanity check for RefundableCrowdsale: goal > 0 2017-07-17 21:36:09 -03:00
db40fd314a sanity check for CappedCrowdsale: cap > 0 2017-07-17 21:36:09 -03:00
6035bd522b simplify crowdsale weiRaised update 2017-07-17 21:36:09 -03:00
b8884687df fix off by one error in VestedToken 2017-07-17 21:34:38 -03:00
18581f138f converted if() throw convention to require()/assert()/revert() 2017-07-17 15:35:09 -03:00
f3867f8477 Merge pull request #315 from joeykrug/patch-1
Added Constant to SafeMath functions as they don't modify storage
2017-07-15 15:52:36 -03:00
353285e5d9 Added Constant to SafeMath functions as they don't modify storage 2017-07-15 11:37:35 -07:00
a56bcbf8fd Correctly call super.transferableTokens
Fix #307
2017-07-14 18:17:09 -03:00
81297fac88 Merge pull request #308 from frangio/fix/erc20
Make ERC20 and token contracts conform to standard
2017-07-13 17:28:50 -03:00
6331dd125d fix ERC20 to conform to standard 2017-07-13 12:05:45 -03:00
f8790c1ed7 Merge pull request #304 from cgewecke/fix-coveralls
Fix coverage
2017-07-10 23:24:45 -03:00
5afbdf00db Fix coverage 2017-07-10 15:45:12 -07:00
322a9598ab Merge pull request #289 from ezynda3/master
update according to changes in #288
2017-07-06 11:07:13 -03:00
ba86e8e095 Merge pull request #296 from frangio/fix/293-tokentimelock-claim
Add TokenTimelock#release function that anyone can call
2017-07-05 11:47:15 -03:00
5e423bc353 add release function, deprecate claim 2017-07-05 11:24:59 -03:00
6eac859781 Test if unpause prevents events allowed in paused state 2017-07-03 17:06:47 +01:00
f2c2c01f8e Merge branch 'master' of github.com:OpenZeppelin/zeppelin-solidity 2017-07-02 15:50:40 -07:00
7434b3d6d2 v1.1.0 2017-07-02 18:53:32 -03:00
63b5fc5971 Merge pull request #290 from frangio/fix/safemath-references
Fix references to SafeMath in crowdsale contracts
2017-07-02 18:50:29 -03:00
f507a0ea29 fix references to SafeMath in crowdsale contracts 2017-07-02 18:39:51 -03:00
c254d8703d update according to changes in #288 2017-07-02 14:33:15 -07:00
981ec2dbdc v1.1.0 2017-07-02 18:27:18 -03:00
d5a75362ec Merge pull request #288 from frangio/refactor/math
Move SafeMath and create Math library for assorted operations
2017-07-02 18:13:47 -03:00
e748c3ea36 Merge pull request #283 from OpenZeppelin/crowdsale
Add Crowdsale contracts
2017-07-02 17:59:19 -03:00
421ed4f8ab fix references to max and min functions 2017-07-02 17:56:34 -03:00
0b1f08043b change Math to a library instead of a contract 2017-07-02 17:56:10 -03:00
759f8de81f fix import directories 2017-07-02 17:52:44 -03:00
96b550b722 Merge pull request #287 from jakub-wojciechowski/test/day-limit
Added new test for a day passed scenario to the DayLimit contract
2017-07-02 17:37:28 -03:00
b961eea89d fix claimRefund precondition 2017-07-02 17:10:11 -03:00
d2dd6e40b6 added new test for a day passed scenario to the DayLimit contract 2017-07-02 21:06:58 +01:00
070bcbcdbd rename purchaseValid to validPurchase 2017-07-02 17:05:06 -03:00
46fe7ee76d guard against beneficiary == 0x0 2017-07-02 16:51:26 -03:00
ba383a6d20 refactor max and min out of SafeMath 2017-07-02 13:01:55 -03:00
a66f5f8f03 format SafeMath documentation as NatSpec 2017-07-02 13:00:23 -03:00
262b7dd7dd Merge pull request #285 from frangio/feature/token-timelock
Add a TokenTimelock contract
2017-06-30 23:14:24 -03:00
5d847ed4d9 tweak TokenTimelock documentation 2017-06-30 21:28:45 -03:00
b3ca0c73b3 add a TokenTimelock contract 2017-06-30 21:25:59 -03:00
d6a45ef14e Merge pull request #282 from jasonbellamy/fix/standard-contract-docs-typo
fix(token): typo in documentation
2017-06-30 18:31:53 -03:00
54d74b1c26 rename canBuy to purchaseValid 2017-06-30 17:54:26 -03:00
657c56c650 remove unecessary whitespace 2017-06-30 17:54:07 -03:00
50a903a62d use npm test script for travis 2017-06-30 17:40:34 -03:00
0791e6639a add extra arguments to test command for development testing 2017-06-30 15:52:11 -03:00
59e9609926 remove CrowdsaleToken
it is superseded by the new crowdsale contracts
2017-06-30 15:50:47 -03:00
fadb2cf47e add tests for crowdsale contracts 2017-06-30 15:50:47 -03:00
4d55d8fa8e give more balance to testrpc accounts
includes fix to MultisigWallet test because bigger balances result in
floating point errors (see #204)
2017-06-30 15:50:47 -03:00
e31abffcb6 fix(token): typo in documentation
Implemantation -> Implementation
2017-06-30 14:40:15 -04:00
cd47fbe953 Improve Crowdsale#rate documentation 2017-06-30 11:23:28 -03:00
42c6392533 fix(token): typo in documentation 2017-06-30 00:41:12 -04:00
3c9638b62e Refactoring to not DRY.
The latest test case is not affected since the aproval is for
accounts[1], which does the transaction, and it is independent of
the amount of tokens that accounts[0] might have.
2017-06-29 13:18:54 -05:00
60ef284a9a Typo in variable, using global tAMOUNT for the latest test case. 2017-06-29 13:13:53 -05:00
b40a01e97b Small refactoring to not DRY 2017-06-29 13:12:58 -05:00
34e3ce4ab4 Typo fix: avaible -> available 2017-06-29 12:44:14 -05:00
4d6b48f39e Typo fix. standart -> standard 2017-06-29 12:40:26 -05:00
de99e7bf34 Prevent DRY 2017-06-29 12:31:32 -05:00
3430c7a289 Merge pull request #280 from rstormsf/fix/revert_inheritance_order
change inheritance order for StandardToken and PausableToken
2017-06-29 10:40:43 -03:00
daf1784be4 change inheritance order for StandardToken and PausableToken 2017-06-28 22:15:51 -07:00
de92a02127 Add Crowdsale contracts 2017-06-27 18:34:04 -03:00
549590d105 Refactored to prevent DRY with beforeEach().
Refs# 259
2017-06-26 17:32:34 -05:00
82ca385725 Merge pull request #277 from frangio/fix-261
Remove all checks for short address attack
2017-06-26 15:32:56 -03:00
e33d9bb41b remove all checks for short address attack (fixes #261) 2017-06-26 15:11:54 -03:00
79b3a1b1a2 Merge pull request #273 from jooray/patch-1
Fix typo in StandardToken allowance documentation
2017-06-22 13:15:28 -03:00
c6a3c29eb4 Merge pull request #272 from rstormsf/Removal-of-install-script
Removes install script
2017-06-22 10:34:07 -03:00
dd34d8df0f Fix typo in StandardToken allowance documentation 2017-06-22 15:33:34 +02:00
80d052d43f Fixes #253 2017-06-21 17:34:43 -07:00
710f77dfe1 Merge pull request #269 from rstormsf/uint256
change uint to uint256
2017-06-20 12:23:52 -03:00
b1e504d6c6 change uint to uint256 2017-06-19 18:55:09 -07:00
7deaee04c8 Merge pull request #263 from DaveAppleton/master
assert is now built in
2017-06-17 16:36:56 -03:00
2020d56ba4 assert is now built in 2017-06-17 11:10:30 +08:00
a49fe53fa1 Merge pull request #258 from mbrix/master
fixed typo
2017-06-15 13:52:34 -03:00
bc3db5d4c1 Fix weird indent issue for inline assembly 2017-06-15 11:13:37 -04:00
30e202313d Fix indentation in MerkleProof.sol and remove mock contract 2017-06-15 11:10:37 -04:00
2e0bd06da2 Add tests, docs and MerkleTree helper 2017-06-15 11:07:22 -04:00
3c4d0d0a77 MerkleProof library and initial stubbed out tests 2017-06-14 16:34:46 -04:00
403e7336a9 fixed typo 2017-06-14 16:31:12 -04:00
fea2a8383c Merge pull request #256 from DavidKnott/refactor-mintable-token
Refactor MintableToken Contract
2017-06-14 16:12:23 -03:00
ffe464a43e Refactors the Mintable Token contract 2017-06-14 10:38:32 -06:00
3fbcb1b282 Merge pull request #250 from jdkanani/yarn-setup
Add yarn support and use it for Travis CI
2017-06-12 12:11:14 -03:00
28b2a0c881 Move npm to yarn 2017-06-11 12:50:26 +05:30
214 changed files with 18831 additions and 4205 deletions

View File

@ -1 +0,0 @@
repo_token: AelGMv47LJ85e3KF1PhYBsjyduSjDmP0h

5
.env.example Normal file
View File

@ -0,0 +1,5 @@
# configure your infura api key (not technically required)
INFURA_API_KEY=
# change the mnemonic that your hd wallet is seeded with
MNEMONIC=

51
.eslintrc Normal file
View File

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

1
.gitattributes vendored Normal file
View File

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

34
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,34 @@
## 🎉 Description
<!-- Briefly describe the issue you are experiencing (or the feature you want to see added to OpenZeppelin). 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 Slack Channel](https://slack.openzeppelin.org/).** -->
- [ ] 🐛 This is a bug report.
- [ ] 📈 This is a feature request.
<!-- Please check one of the above by placing an x in the box. -->
## 💻 Environment
Next, we need to know what your environment looks like.
- Which version of OpenZeppelin are you using?
- What network are you deploying to? Ganache? Ropsten?
- How are you deploying your OpenZeppelin-backed contracts? truffle? Remix? Let us know!
## 📝 Details
Describe the problem you have been experiencing in more detail. Include as much information as you think is relevant. Keep in mind that transactions can fail for many reasons; context is key here.
## 🔢 Code To Reproduce Issue [ Good To Have ]
Please remember that with sample code it's easier to reproduce the bug and it's much faster to fix it.
```
insert short code snippets here
```
<!-- If your code is larger, consider linking us to a repo illustrating your issue. -->
## 👍 Other Information
<!-- List any other information that is relevant to your issue. Error logs, related issues, suggestions on how to fix, Stack Overflow links, forum links, etc. -->

17
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,17 @@
<!-- 0. 🎉 Thank you for submitting a PR! -->
<!-- 1. **Does this close any open issues?** If so, list them here. If not, remove the `Fixes #` line. -->
Fixes #
# 🚀 Description
<!-- 2. Describe the changes introduced in this pull request -->
<!-- Include any context necessary for understanding the PR's purpose. -->
<!-- 3. Before submitting, please review the following checklist: -->
- [ ] 📘 I've reviewed the [OpenZeppelin Contributor Guidelines](../blob/master/CONTRIBUTING.md)
- [ ] ✅ I've added tests where applicable to test my new functionality.
- [ ] 📖 I've made sure that my contracts are well-documented.
- [ ] 🎨 I've run the JS/Solidity linters and fixed any issues (`npm run lint:all:fix`).

35
.gitignore vendored
View File

@ -1,7 +1,36 @@
*.swp
*.swo
node_modules/
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
allFiredEvents
scTopics
# Coverage directory used by tools like istanbul
coverage
coverage.json
coverageEnv
# node-waf configuration
.lock-wscript
# Dependency directory
node_modules
# Debug log from npm
npm-debug.log
# local env variables
.env
# truffle build directory
build/
# lol macs
.DS_Store/
/coverage
coverage.json

1
.node-version Normal file
View File

@ -0,0 +1 @@
v8.9.1

9
.solcover.js Normal file
View File

@ -0,0 +1,9 @@
module.exports = {
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'
]
}

View File

@ -1 +1 @@
node_modules
node_modules

View File

@ -1,22 +1,13 @@
{
"custom-rules-filename": null,
"extends": "solium:all",
"plugins": ["security"],
"rules": {
"imports-on-top": true,
"variable-declarations": true,
"array-declarations": true,
"operator-whitespace": true,
"lbrace": true,
"mixedcase": false,
"camelcase": true,
"uppercase": true,
"no-with": true,
"no-empty-blocks": true,
"no-unused-vars": true,
"double-quotes": true,
"blank-lines": true,
"indentation": true,
"whitespace": true,
"deprecated-suicide": true,
"pragma-on-top": true
"quotes": ["error", "double"],
"no-empty-blocks": "off",
"indentation": ["error", 2],
"arg-overflow": ["warning", 3],
"security/enforce-explicit-visibility": ["error"],
"security/no-block-members": ["warning"],
"security/no-inline-assembly": ["warning"]
}
}

View File

@ -1,14 +1,31 @@
dist: trusty
sudo: false
sudo: required
group: beta
language: node_js
node_js:
- "6"
before_install:
- npm install truffle@3.2.2 -g
- npm i -g ethereumjs-testrpc
- "8"
cache:
directories:
- node_modules
env:
-
- SOLIDITY_COVERAGE=true
- SOLC_NIGHTLY=true
matrix:
fast_finish: true
allow_failures:
- env: SOLIDITY_COVERAGE=true
- env: SOLC_NIGHTLY=true
before_script:
- truffle version
script:
- testrpc > /dev/null &
- truffle test
after_script:
- npm run coveralls
- npm run lint
- npm run lint:sol
- npm run test
notifications:
slack:
rooms:
- secure: uEhwUkuwJp5pBNh+VTEytPHz3FDKsnPrKO+8MTAKv5hKi4PCRoVhLv6pklr82HUpL6pvSvJbUPA0HVebOXA+MMSxdny/BHZTh2mtw5Y78l2Ad0svDTWuV2Lus2pmhYigRhT0Wo00/SRX9+pxm0kg4EIFJSTS+uR9G76x0l9NljpEGXrqxlDxjxoHBgk8Ciru2LHaLzX/utE3jlABts4Sb1F3wc2BwFkjd6BDCRTGAPhVJwwFk41ZfnmLVbgSNUyk46Cb38oG5oXHb0FI3d3jV/k1OUhRyFfmA2fLXRk0wavibW8TG1gGJJWZ7xTCKzw/Cvup6mpehSAeQef8eekMdjpWEhF9hYRq1BvOs0384UU8NQ0O+BtdXU+X3Nyr84TMJN/iIfgN7gYX7AsvXH3jC0JfNUcIkWlJvyXdE6l2GV1hMmhL09GFEBbSpuSXRIWlOXTcYBlp5NbvE8xO8PUW+T6N5RG2XXjv1g8wCpr6Wwk1+LmRkX5trv8MFBZ2pM8p4H5da5++Ov8egLonNGK2jbx6aBLBX3tPf+g70LZEkiQ4eBfZw8VIgXIvKreisicppNuCD27gNmSEPNt0NkwiEBcTCJ9GSVAO0CU2g4ggvHDX2A+RW5XPET9bGkBXKLfFyV7Qe+MSQjXkCnW3bIRh7Wo1V31XiUiYOLuZPIiH3EQ=
on_success: change
on_failure: always
on_pull_requests: false

View File

@ -1,107 +1,58 @@
Contributing to Zeppelin
Contributing to OpenZeppelin
=======
## Design Guidelines
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.
These are some global design goals in Zeppelin.
## Contribution guidelines
### D0 - Security in Depth
We strive to provide secure, tested, audited code. To achieve this, we need to match intention with function. Thus, documentation, code clarity, community review and security discussions are fundamental.
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).
### D1 - Simple and Modular
Simpler code means easier audits, and better understanding of what each component does. We look for small files, small contracts, and small functions. If you can separate a contract into two independent functionalities you should probably do it.
## Creating Pull Requests (PRs)
### D2 - Naming Matters
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.
We take our time with picking names. Code is going to be written once, and read hundreds of times. Renaming for clarity is encouraged.
*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.
### D3 - Tests
## A typical workflow
Write tests for all your code. We encourage Test Driven Development so we know when our code is right. Even though not all code in the repository is tested at the moment, we aim to test every line of code in the future.
1) Make sure your fork is up to date with the main repository:
### D4 - Check preconditions and post-conditions
```
cd openzeppelin-solidity
git fetch upstream
git checkout development
git pull --rebase upstream development
```
NOTE: The directory `openzeppelin-solidity` represents your fork's local copy.
A very important way to prevent vulnerabilities is to catch a contracts inconsistent state as early as possible. This is why we want functions to check pre- and post-conditions for executing its logic. When writing code, ask yourself what you are expecting to be true before and after the function runs, and express it in code.
### D5 - Code Consistency
Consistency on the way classes are used is paramount to an easier understanding of the library. The codebase should be as unified as possible. Read existing code and get inspired before you write your own. Follow the style guidelines. Dont hesitate to ask for help on how to best write a specific piece of code.
### D6 - Regular Audits
Following good programming practices is a way to reduce the risk of vulnerabilities, but professional code audits are still needed. We will perform regular code audits on major releases, and hire security professionals to provide independent review.
## Style Guidelines
The design guidelines have quite a high abstraction level. These style guidelines are more concrete and easier to apply, and also more opinionated.
### General
#### G0 - Default to Solidity's official style guide.
Follow the official Solidity style guide: http://solidity.readthedocs.io/en/latest/style-guide.html
#### G1 - No Magic Constants
Avoid constants in the code as much as possible. Magic strings are also magic constants.
#### G2 - Code that Fails Early
We ask our code to fail as soon as possible when an unexpected input was provided or unexpected state was found.
#### G3 - Internal Amounts Must be Signed Integers and Represent the Smallest Units.
Avoid representation errors by always dealing with weis when handling ether. GUIs can convert to more human-friendly representations. Use Signed Integers (int) to prevent underflow problems.
### Testing
#### T1 - Tests Must be Written Elegantly
Style guidelines are not relaxed for tests. Tests are a good way to show how to use the library, and maintaining them is extremely necessary.
Don't write long tests, write helper functions to make them be as short and concise as possible (they should take just a few lines each), and use good variable names.
#### T2 - Tests Must not be Random
Inputs for tests should not be generated randomly. Accounts used to create test contracts are an exception, those can be random. Also, the type and structure of outputs should be checked.
### Documentation
TODO
## Pull Request Workflow
Our workflow is based on GitHub's pull requests. We use feature branches, prepended with: `test`, `feature`, `fix`, `refactor`, or `remove` according to the change the branch introduces. Some examples for such branches are:
```sh
git checkout -b test/some-module
git checkout -b feature/some-new-stuff
git checkout -b fix/some-bug
git checkout -b remove/some-file
2) Branch out from `development` 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
```
We expect pull requests to be rebased to the master branch before merging:
```sh
git remote add zep git@github.com:OpenZeppelin/zeppelin-solidity.git
git pull --rebase zep master
3) Make your changes, add your files, commit and push to your fork.
```
git add SomeFile.js
git commit "Fix some bug #123"
git push origin fix/some-bug-#123
```
Note that we require rebasing your branch instead of merging it, for commit readability reasons.
4) Go to [github.com/OpenZeppelin/openzeppelin-solidity](https://github.com/OpenZeppelin/zeppelin-solidity) in your web browser and issue a new pull request.
After that, you can push the changes to your fork, by doing:
```sh
git push origin your_branch_name
git push origin feature/some-new-stuff
git push origin fix/some-bug
```
*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.
Finally go to [github.com/OpenZeppelin/zeppelin-solidity](https://github.com/OpenZeppelin/zeppelin-solidity) in your web browser and issue a new pull request.
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.
Main contributors 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 Zeppelin.
*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 have any questions feel free to post them to
[github.com/OpenZeppelin/zeppelin-solidity/issues](https://github.com/OpenZeppelin/zeppelin-solidity/issues).
## All set!
Finally, if you're looking to collaborate and want to find easy tasks to start, [look at the issues we marked as easy](https://github.com/OpenZeppelin/zeppelin-solidity/labels/easy).
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!

16
LICENSE
View File

@ -5,18 +5,18 @@ 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
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,13 +1,13 @@
# Zeppelin Solidity
[![NPM Package](https://img.shields.io/npm/v/zeppelin-solidity.svg?style=flat-square)](https://www.npmjs.org/package/zeppelin-solidity)
[![Build Status](https://img.shields.io/travis/OpenZeppelin/zeppelin-solidity.svg?branch=master&style=flat-square)](https://travis-ci.org/OpenZeppelin/zeppelin-solidity)
[![Coverage Status](https://coveralls.io/repos/github/OpenZeppelin/zeppelin-solidity/badge.svg?branch=coveralls)](https://coveralls.io/github/OpenZeppelin/zeppelin-solidity?branch=coveralls)
# OpenZeppelin Solidity
[![NPM Package](https://img.shields.io/npm/v/openzeppelin-solidity.svg?style=flat-square)](https://www.npmjs.org/package/openzeppelin-solidity)
[![Build Status](https://img.shields.io/travis/OpenZeppelin/openzeppelin-solidity.svg?branch=master&style=flat-square)](https://travis-ci.org/OpenZeppelin/openzeppelin-solidity)
[![Coverage Status](https://img.shields.io/coveralls/github/OpenZeppelin/openzeppelin-solidity/master.svg?style=flat-square)](https://coveralls.io/github/OpenZeppelin/openzeppelin-solidity?branch=master)
OpenZeppelin is a library for writing secure [Smart Contracts](https://en.wikipedia.org/wiki/Smart_contract) on Ethereum.
With OpenZeppelin, you can build distributed applications, protocols and organizations:
- using common contract security patterns (See [Onward with Ethereum Smart Contract Security](https://medium.com/bitcorps-blog/onward-with-ethereum-smart-contract-security-97a827e47702#.y3kvdetbz))
- in the [Solidity language](http://solidity.readthedocs.io/en/develop/).
- in the [Solidity language](https://solidity.readthedocs.io/en/develop/).
> NOTE: New to smart contract development? Check our [introductory guide](https://medium.com/zeppelin-blog/the-hitchhikers-guide-to-smart-contracts-in-ethereum-848f08001f05#.cox40d2ut).
@ -16,20 +16,23 @@ With OpenZeppelin, you can build distributed applications, protocols and organiz
OpenZeppelin integrates with [Truffle](https://github.com/ConsenSys/truffle), an Ethereum development environment. Please install Truffle and initialize your project with `truffle init`.
```sh
npm install -g truffle@beta
npm install -g truffle
mkdir myproject && cd myproject
truffle init
```
To install the OpenZeppelin library, run:
To install the OpenZeppelin library, run the following in your Solidity project root directory:
```sh
npm install zeppelin-solidity
npm init -y
npm install -E openzeppelin-solidity
```
After that, you'll get all the library's contracts in the `node_modules/zeppelin-solidity/contracts` folder. You can use the contracts in the library like so:
**Note that OpenZeppelin does not currently follow semantic versioning.** You may encounter breaking changes upon a minor version bump. We recommend pinning the version of OpenZeppelin you use, as done by the `-E` (`--save-exact`) option.
```js
import 'zeppelin-solidity/contracts/ownership/Ownable.sol';
After that, you'll get all the library's contracts in the `node_modules/openzeppelin-solidity/contracts` folder. You can use the contracts in the library like so:
```solidity
import 'openzeppelin-solidity/contracts/ownership/Ownable.sol';
contract MyContract is Ownable {
...
@ -46,33 +49,16 @@ If you find a security issue, please email [security@openzeppelin.org](mailto:se
Building a distributed application, protocol or organization with OpenZeppelin?
- Read documentation: http://zeppelin-solidity.readthedocs.io/en/latest/
- Read documentation: https://openzeppelin.org/api/docs/open-zeppelin.html
- Ask for help and follow progress at: https://slack.openzeppelin.org/
Interested in contributing to OpenZeppelin?
- Framework proposal and roadmap: https://medium.com/zeppelin-blog/zeppelin-framework-proposal-and-development-roadmap-fdfa9a3a32ab#.iain47pak
- Issue tracker: https://github.com/OpenZeppelin/zeppelin-solidity/issues
- Contribution guidelines: https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/CONTRIBUTING.md
## Collaborating organizations and audits by OpenZeppelin
- [Golem](https://golem.network/)
- [Mediachain](http://www.mediachain.io/)
- [Truffle](http://truffleframework.com/)
- [Firstblood](http://firstblood.io/)
- [Rootstock](http://www.rsk.co/)
- [Consensys](https://consensys.net/)
- [DigixGlobal](https://www.dgx.io/)
- [Coinfund](https://coinfund.io/)
- [DemocracyEarth](http://democracy.earth/)
- [Signatura](https://signatura.co/)
- [Ether.camp](http://www.ether.camp/)
- [Aragon](https://aragon.one/)
- [Wings](https://wings.ai/)
among others...
- Issue tracker: https://github.com/OpenZeppelin/openzeppelin-solidity/issues
- Contribution guidelines: https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/CONTRIBUTING.md
- Wiki: https://github.com/OpenZeppelin/openzeppelin-solidity/wiki
## License
Code released under the [MIT License](https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/LICENSE).
Code released under the [MIT License](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/LICENSE).

View File

@ -5,7 +5,7 @@ Authored by Dennis Peterson and Peter Vessenes
# Introduction
Zeppelin requested that New Alchemy perform an audit of the contracts in their OpenZeppelin library. The OpenZeppelin contracts are a set of contracts intended to be a safe building block for a variety of uses by parties that may not be as sophisticated as the OpenZeppelin team. It is a design goal that the contracts be deployable safely and "as-is".
Zeppelin requested that New Alchemy perform an audit of the contracts in their OpenZeppelin library. The OpenZeppelin contracts are a set of contracts intended to be a safe building block for a variety of uses by parties that may not be as sophisticated as the OpenZeppelin team. It is a design goal that the contracts be deployable safely and "as-is".
The contracts are hosted at:
@ -22,9 +22,9 @@ The audit makes no statements or warrantees about utility of the code, safety of
# Executive Summary
Overall the OpenZeppelin codebase is of reasonably high quality -- it is clean, modular and follows best practices throughout.
Overall the OpenZeppelin codebase is of reasonably high quality -- it is clean, modular and follows best practices throughout.
It is still in flux as a codebase, and needs better documentation per file as to expected behavior and future plans. It probably needs more comprehensive and aggressive tests written by people less nice than the current OpenZeppelin team.
It is still in flux as a codebase, and needs better documentation per file as to expected behavior and future plans. It probably needs more comprehensive and aggressive tests written by people less nice than the current OpenZeppelin team.
We identified two critical errors and one moderate issue, and would not recommend this commit hash for public use until these bugs are remedied.
@ -34,12 +34,12 @@ The repository includes a set of Truffle unit tests, a requirement and best prac
## Big Picture: Is This A Worthwhile Project?
As soon as a developer touches OpenZeppelin contracts, they will modify something, leaving them in an un-audited state. We do not recommend developers deploy any unaudited code to the Blockchain if it will handle money, information or other things of value.
As soon as a developer touches OpenZeppelin contracts, they will modify something, leaving them in an un-audited state. We do not recommend developers deploy any unaudited code to the Blockchain if it will handle money, information or other things of value.
> "In accordance with Unix philosophy, Perl gives you enough rope to hang yourself"
> --Larry Wall
We think this is an incredibly worthwhile project -- aided by the high code quality. Creating a framework that can be easily extended helps increase the average code quality on the Blockchain by charting a course for developers and encouraging containment of modifications to certain sections.
We think this is an incredibly worthwhile project -- aided by the high code quality. Creating a framework that can be easily extended helps increase the average code quality on the Blockchain by charting a course for developers and encouraging containment of modifications to certain sections.
> "Rust: The language that makes you take the safety off before shooting yourself in the foot"
> -- (@mbrubeck)
@ -65,7 +65,7 @@ In general we prefer `throw` in our code audits, because it is simpler -- it's l
In the OpenZeppelin contracts, both styles are used in different parts of the codebase. `SimpleToken` transfers throw upon failure, while the full ERC20 token returns `false`. Some modifiers `throw`, others just wrap the function body in a conditional, effectively allowing the function to return false if the condition is not met.
We don't love this, and would usually recommend you stick with one style or the other throughout the codebase.
We don't love this, and would usually recommend you stick with one style or the other throughout the codebase.
In at least one case, these different techniques are combined cleverly (see the Multisig comments, line 65). As a set of contracts intended for general use, we recommend you either strive for more consistency or document explicit design criteria that govern which techniques are used where.
@ -77,19 +77,19 @@ Note that it may be impossible to use either one in all situations. For example,
CrowdsaleToken.sol has no provision for withdrawing the raised ether. We *strongly* recommend a standard `withdraw` function be added. There is no scenario in which someone should deploy this contract as is, whether for testing or live.
## Recursive Call in MultisigWallet
Line 45 of `MultisigWallet.sol` checks if the amount being sent by `execute` is under a daily limit.
Line 45 of `MultisigWallet.sol` checks if the amount being sent by `execute` is under a daily limit.
This function can only be called by the "Owner". As a first angle of attack, it's worth asking what will happen if the multisig wallet owners reset the daily limit by approving a call to `resetSpentToday`.
This function can only be called by the "Owner". As a first angle of attack, it's worth asking what will happen if the multisig wallet owners reset the daily limit by approving a call to `resetSpentToday`.
If a chain of calls can be constructed in which the owner confirms the `resetSpentToday` function and then withdraws through `execute` in a recursive call, the contract can be drained. In fact, this could be done without a recursive call, just through repeated `execute` calls alternating with the `confirm` calls.
We are still working through the confirmation protocol in `Shareable.sol`, but we are not convinced that this is impossible, in fact it looks possible. The flexibility any shared owner has in being able to revoke confirmation later is another worrisome angle of approach even if some simple patches are included.
We are still working through the confirmation protocol in `Shareable.sol`, but we are not convinced that this is impossible, in fact it looks possible. The flexibility any shared owner has in being able to revoke confirmation later is another worrisome angle of approach even if some simple patches are included.
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 `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.
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 `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.
We do not recommend using the MultisigWallet until these issues are fixed.
@ -97,9 +97,9 @@ We do not recommend using the MultisigWallet until these issues are fixed.
# Moderate to Minor Issues
## PullPayment
PullPayment.sol needs some work. It has no explicit provision for cancelling a payment. This would be desirable in a number of scenarios; consider a payee losing their wallet, or giving a griefing address, or just an address that requires more than the default gas offered by `send`.
PullPayment.sol needs some work. It has no explicit provision for cancelling a payment. This would be desirable in a number of scenarios; consider a payee losing their wallet, or giving a griefing address, or just an address that requires more than the default gas offered by `send`.
`asyncSend` has no overflow checking. This is a bad plan. We recommend overflow and underflow checking at the layer closest to the data manipulation.
`asyncSend` has no overflow checking. This is a bad plan. We recommend overflow and underflow checking at the layer closest to the data manipulation.
`asyncSend` allows more balance to be queued up for sending than the contract holds. This is probably a bad idea, or at the very least should be called something different. If the intent is to allow this, it should have provisions for dealing with race conditions between competing `withdrawPayments` calls.
@ -107,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 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.
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.
@ -129,7 +129,7 @@ I presume that the goal of this contract is to allow and annotate a migration to
### Pausable
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.
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 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)`.
@ -163,7 +163,7 @@ Line 34: "this contract only has six types of events"...actually only two.
Line 61: Why is `ownerIndex` keyed by addresses hashed to `uint`s? Why not use the addresses directly, so `ownerIndex` is less obscure, and so there's stronger typing?
Line 62: Do not love `++i) ... owners[2+ i]`. Makes me do math, which is not what I want to do. I want to not have to do math.
Line 62: Do not love `++i) ... owners[2+ i]`. Makes me do math, which is not what I want to do. I want to not have to do math.
There should probably be a function for adding a new operation, so the developer doesn't have to work directly with the internal data. (This would make the multisig contract even shorter.)
@ -171,7 +171,7 @@ There's a `revoke` function but not a `propose` function that we can see.
Beware reordering. If `propose` allows the user to choose a bytes string for their proposal, bad things(TM) will happen as currently written.
### Multisig
Just an interface. Note it allows changing an owner address, but not changing the number of owners. This is somewhat limiting but also simplifies implementation.
@ -184,9 +184,9 @@ Safe from reentrance attack since ether send is at the end, plus it uses `.send(
There's an argument to be made that `.call.value()` is a better option *if* you're sure that it will be done after all state updates, since `.send` will fail if the recipient has an expensive fallback function. However, in the context of a function meant to be embedded in other contracts, it's probably better to use `.send`. One possible compromise is to add a function which allows only the owner to send ether via `.call.value`.
If you don't use `call.value` you should implement a `cancel` function in case some value is pending here.
If you don't use `call.value` you should implement a `cancel` function in case some value is pending here.
Line 14:
Line 14:
Doesn't use safeAdd. Although it appears that payout amounts can only be increased, in fact the payer could lower the payout as much as desired via overflow. Also, the payer could add a large non-overflowing amount, causing the payment to exceed the contract balance and therefore fail when withdraw is attempted.
Recommendation: track the sum of non-withdrawn asyncSends, and don't allow a new one which exceeds the leftover balance. If it's ever desirable to make payments revocable, it should be done explicitly.
@ -195,7 +195,7 @@ Recommendation: track the sum of non-withdrawn asyncSends, and don't allow a new
### ERC20
Standard ERC20 interface only.
Standard ERC20 interface only.
There's a security hole in the standard, reported at Edcon: `approve` does not protect against race conditions and simply replaces the current value. An approved spender could wait for the owner to call `approve` again, then attempt to spend the old limit before the new limit is applied. If successful, this attacker could successfully spend the sum of both limits.
@ -208,11 +208,11 @@ https://drive.google.com/file/d/0ByMtMw2hul0EN3NCaVFHSFdxRzA/view
### ERC20Basic
Simpler interface skipping the Approve function. Note this departs from ERC20 in another way: transfer throws instead of returning false.
Simpler interface skipping the Approve function. Note this departs from ERC20 in another way: transfer throws instead of returning false.
### BasicToken
Uses `SafeSub` and `SafeMath`, so transfer `throw`s instead of returning false. This complies with ERC20Basic but not the actual ERC20 standard.
Uses `SafeSub` and `SafeMath`, so transfer `throw`s instead of returning false. This complies with ERC20Basic but not the actual ERC20 standard.
### StandardToken
@ -234,10 +234,10 @@ Note: an alternative pattern is a mint() function which is only callable from a
### VestedToken
Lines 23, 27:
Functions `transfer()` and `transferFrom()` have a modifier canTransfer which throws if not enough tokens are available. However, transfer() returns a boolean success. Inconsistent treatment of failure conditions may cause problems for other contracts using the token. (Note that transferableTokens() relies on safeSub(), so will also throw if there's insufficient balance.)
Lines 23, 27:
Functions `transfer()` and `transferFrom()` have a modifier canTransfer which throws if not enough tokens are available. However, transfer() returns a boolean success. Inconsistent treatment of failure conditions may cause problems for other contracts using the token. (Note that transferableTokens() relies on safeSub(), so will also throw if there's insufficient balance.)
Line 64:
Line 64:
Delete not actually necessary since the value is overwritten in the next line anyway.
## Root level
@ -255,7 +255,7 @@ The modifier `limitedDaily` calls `underLimit`, which both checks that the spend
Lines 4, 11:
Comment claims that `DayLimit` is multiowned, and Shareable is imported, but DayLimit does not actually inherit from Shareable. The intent may be for child contracts to inherit from Shareable (as Multisig does); in this case the import should be removed and the comment altered.
Line 46:
Line 46:
Manual overflow check instead of using safeAdd. Since this is called from a function that throws upon failure anyway, there's no real downside to using safeAdd.
### LimitBalance
@ -264,19 +264,19 @@ No issues.
### MultisigWallet
Lines 28, 76, 80:
Lines 28, 76, 80:
`kill`, `setDailyLimit`, and `resetSpentToday` only happen with multisig approval, and hashes for these actions are logged by Shareable. However, they should probably post their own events for easy reading.
Line 45:
Line 45:
This call to underLimit will reduce the daily limit, and then either throw or return 0. So in this case there's no danger that the limit will be reduced without the operation going through.
Line 65:
Line 65:
Shareable's onlyManyOwners will take the user's confirmation, and execute the function body if and only if enough users have confirmed. Whole thing throws if the send fails, which will roll back the confirmation. Confirm returns false if not enough have confirmed yet, true if the whole thing succeeds, and throws only in the exceptional circumstance that the designated transaction unexpectedly fails. Elegant design.
Line 68:
Line 68:
Throw here is good but note this function can fail either by returning false or by throwing.
Line 92:
Line 92:
A bit odd to split `clearPending()` between this contract and Shareable. However this does allow contracts inheriting from Shareable to use custom structs for pending transactions.

2
contracts/.npmignore Normal file
View File

@ -0,0 +1,2 @@
mocks
examples

View File

@ -0,0 +1,28 @@
pragma solidity ^0.4.21;
/**
* Utility library of inline functions on addresses
*/
library AddressUtils {
/**
* Returns whether the target address is a contract
* @dev This function will return false if invoked during the constructor of a contract,
* as the code is not actually created until after the constructor finishes.
* @param addr address to check
* @return whether the target address is a contract
*/
function isContract(address addr) internal view returns (bool) {
uint256 size;
// XXX Currently there is no better way to check if there is a contract in an address
// than to check the size of the code at that address.
// See https://ethereum.stackexchange.com/a/14016/36603
// for more details about how this works.
// TODO Check this again before the Serenity release, because all addresses will be
// contracts then.
assembly { size := extcodesize(addr) } // solium-disable-line security/no-inline-assembly
return size > 0;
}
}

View File

@ -1,78 +0,0 @@
pragma solidity ^0.4.11;
import './payment/PullPayment.sol';
import './lifecycle/Destructible.sol';
/**
* @title Bounty
* @dev This bounty will pay out to a researcher if they break invariant logic of the contract.
*/
contract Bounty is PullPayment, Destructible {
bool public claimed;
mapping(address => address) public researchers;
event TargetCreated(address createdAddress);
/**
* @dev Fallback function allowing the contract to recieve funds, if they haven't already been claimed.
*/
function() payable {
if (claimed) {
throw;
}
}
/**
* @dev Create and deploy the target contract (extension of Target contract), and sets the
* msg.sender as a researcher
* @return A target contract
*/
function createTarget() returns(Target) {
Target target = Target(deployContract());
researchers[target] = msg.sender;
TargetCreated(target);
return target;
}
/**
* @dev Internal function to deploy the target contract.
* @return A target contract address
*/
function deployContract() internal returns(address);
/**
* @dev Sends the contract funds to the researcher that proved the contract is broken.
* @param target contract
*/
function claim(Target target) {
address researcher = researchers[target];
if (researcher == 0) {
throw;
}
// Check Target contract invariants
if (target.checkInvariant()) {
throw;
}
asyncSend(researcher, this.balance);
claimed = true;
}
}
/**
* @title Target
* @dev Your main contract should inherit from this class and implement the checkInvariant method.
*/
contract Target {
/**
* @dev Checks all values a contract assumes to be true all the time. If this function returns
* false, the contract is broken in some way and is in an inconsistent state.
* In order to win the bounty, security researchers will try to cause this broken state.
* @return True if all invariant values are correct, false otherwise.
*/
function checkInvariant() returns(bool);
}

View File

@ -1,75 +0,0 @@
pragma solidity ^0.4.11;
/**
* @title DayLimit
* @dev Base contract that enables methods to be protected by placing a linear limit (specifiable)
* on a particular resource per calendar day. Is multiowned to allow the limit to be altered.
*/
contract DayLimit {
uint public dailyLimit;
uint public spentToday;
uint public lastDay;
/**
* @dev Constructor that sets the passed value as a dailyLimit.
* @param _limit Uint to represent the daily limit.
*/
function DayLimit(uint _limit) {
dailyLimit = _limit;
lastDay = today();
}
/**
* @dev sets the daily limit. Does not alter the amount already spent today.
* @param _newLimit Uint to represent the new limit.
*/
function _setDailyLimit(uint _newLimit) internal {
dailyLimit = _newLimit;
}
/**
* @dev Resets the amount already spent today.
*/
function _resetSpentToday() internal {
spentToday = 0;
}
/**
* @dev Checks to see if there is enough resource to spend today. If true, the resource may be expended.
* @param _value Uint representing the amount of resource to spend.
* @return A boolean that is True if the resource was spended and false otherwise.
*/
function underLimit(uint _value) internal returns (bool) {
// reset the spend limit if we're on a different day to last time.
if (today() > lastDay) {
spentToday = 0;
lastDay = today();
}
// check to see if there's enough left - if so, subtract and return true.
// overflow protection // dailyLimit check
if (spentToday + _value >= spentToday && spentToday + _value <= dailyLimit) {
spentToday += _value;
return true;
}
return false;
}
/**
* @dev Private function to determine today's index
* @return Uint of today's index.
*/
function today() private constant returns (uint) {
return now / 1 days;
}
/**
* @dev Simple modifier for daily limit.
*/
modifier limitedDaily(uint _value) {
if (!underLimit(_value)) {
throw;
}
_;
}
}

76
contracts/ECRecovery.sol Normal file
View File

@ -0,0 +1,76 @@
pragma solidity ^0.4.21;
/**
* @title Eliptic curve signature operations
*
* @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d
*
* TODO Remove this library once solidity supports passing a signature to ecrecover.
* See https://github.com/ethereum/solidity/issues/864
*
*/
library ECRecovery {
/**
* @dev Recover signer address from a message by using their signature
* @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address.
* @param sig bytes signature, the signature is generated using web3.eth.sign()
*/
function recover(bytes32 hash, bytes sig)
internal
pure
returns (address)
{
bytes32 r;
bytes32 s;
uint8 v;
// Check the signature length
if (sig.length != 65) {
return (address(0));
}
// Divide the signature in r, s and v variables
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
// solium-disable-next-line security/no-inline-assembly
assembly {
r := mload(add(sig, 32))
s := mload(add(sig, 64))
v := byte(0, mload(add(sig, 96)))
}
// Version of signature should be 27 or 28, but 0 and 1 are also possible versions
if (v < 27) {
v += 27;
}
// If the version is correct return the signer address
if (v != 27 && v != 28) {
return (address(0));
} else {
// solium-disable-next-line arg-overflow
return ecrecover(hash, v, r, s);
}
}
/**
* toEthSignedMessageHash
* @dev prefix a bytes32 value with "\x19Ethereum Signed Message:"
* @dev and hash the result
*/
function toEthSignedMessageHash(bytes32 hash)
internal
pure
returns (bytes32)
{
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(
"\x19Ethereum Signed Message:\n32",
hash
);
}
}

View File

@ -1,33 +0,0 @@
pragma solidity ^0.4.11;
/**
* @title LimitBalance
* @dev Simple contract to limit the balance of child contract.
* @dev Note this doesn't prevent other contracts to send funds by using selfdestruct(address);
* @dev See: https://github.com/ConsenSys/smart-contract-best-practices#remember-that-ether-can-be-forcibly-sent-to-an-account
*/
contract LimitBalance {
uint public limit;
/**
* @dev Constructor that sets the passed value as a limit.
* @param _limit Uint to represent the limit.
*/
function LimitBalance(uint _limit) {
limit = _limit;
}
/**
* @dev Checks if limit was reached. Case true, it throws.
*/
modifier limitedPayable() {
if (this.balance > limit) {
throw;
}
_;
}
}

35
contracts/MerkleProof.sol Normal file
View File

@ -0,0 +1,35 @@
pragma solidity ^0.4.21;
/*
* @title MerkleProof
* @dev Merkle proof verification
* @note Based on https://github.com/ameensol/merkle-tree-solidity/blob/master/src/MerkleProof.sol
*/
library MerkleProof {
/*
* @dev Verifies a Merkle proof proving the existence of a leaf in a Merkle tree. Assumes that each pair of leaves
* and each pair of pre-images is sorted.
* @param _proof Merkle proof containing sibling hashes on the branch from the leaf to the root of the Merkle tree
* @param _root Merkle root
* @param _leaf Leaf of Merkle tree
*/
function verifyProof(bytes32[] _proof, bytes32 _root, bytes32 _leaf) internal pure returns (bool) {
bytes32 computedHash = _leaf;
for (uint256 i = 0; i < _proof.length; i++) {
bytes32 proofElement = _proof[i];
if (computedHash < proofElement) {
// Hash(current computed hash + current element of the proof)
computedHash = keccak256(computedHash, proofElement);
} else {
// Hash(current element of the proof + current computed hash)
computedHash = keccak256(proofElement, computedHash);
}
}
// Check if the computed hash (root) is equal to the provided root
return computedHash == _root;
}
}

View File

@ -1,127 +0,0 @@
pragma solidity ^0.4.11;
import "./ownership/Multisig.sol";
import "./ownership/Shareable.sol";
import "./DayLimit.sol";
/**
* MultisigWallet
* Usage:
* bytes32 h = Wallet(w).from(oneOwner).execute(to, value, data);
* Wallet(w).from(anotherOwner).confirm(h);
*/
contract MultisigWallet is Multisig, Shareable, DayLimit {
struct Transaction {
address to;
uint value;
bytes data;
}
/**
* Constructor, sets the owners addresses, number of approvals required, and daily spending limit
* @param _owners A list of owners.
* @param _required The amount required for a transaction to be approved.
*/
function MultisigWallet(address[] _owners, uint _required, uint _daylimit)
Shareable(_owners, _required)
DayLimit(_daylimit) { }
/**
* @dev destroys the contract sending everything to `_to`.
*/
function destroy(address _to) onlymanyowners(keccak256(msg.data)) external {
selfdestruct(_to);
}
/**
* @dev Fallback function, receives value and emits a deposit event.
*/
function() payable {
// just being sent some cash?
if (msg.value > 0)
Deposit(msg.sender, msg.value);
}
/**
* @dev Outside-visible transaction entry point. Executes transaction immediately if below daily
* spending limit. If not, goes into multisig process. We provide a hash on return to allow the
* sender to provide shortcuts for the other confirmations (allowing them to avoid replicating
* the _to, _value, and _data arguments). They still get the option of using them if they want,
* anyways.
* @param _to The receiver address
* @param _value The value to send
* @param _data The data part of the transaction
*/
function execute(address _to, uint _value, bytes _data) external onlyOwner returns (bytes32 _r) {
// first, take the opportunity to check that we're under the daily limit.
if (underLimit(_value)) {
SingleTransact(msg.sender, _value, _to, _data);
// yes - just execute the call.
if (!_to.call.value(_value)(_data)) {
throw;
}
return 0;
}
// determine our operation hash.
_r = keccak256(msg.data, block.number);
if (!confirm(_r) && txs[_r].to == 0) {
txs[_r].to = _to;
txs[_r].value = _value;
txs[_r].data = _data;
ConfirmationNeeded(_r, msg.sender, _value, _to, _data);
}
}
/**
* @dev Confirm a transaction by providing just the hash. We use the previous transactions map,
* txs, in order to determine the body of the transaction from the hash provided.
* @param _h The transaction hash to approve.
*/
function confirm(bytes32 _h) onlymanyowners(_h) returns (bool) {
if (txs[_h].to != 0) {
if (!txs[_h].to.call.value(txs[_h].value)(txs[_h].data)) {
throw;
}
MultiTransact(msg.sender, _h, txs[_h].value, txs[_h].to, txs[_h].data);
delete txs[_h];
return true;
}
}
/**
* @dev Updates the daily limit value.
* @param _newLimit Uint to represent the new limit.
*/
function setDailyLimit(uint _newLimit) onlymanyowners(keccak256(msg.data)) external {
_setDailyLimit(_newLimit);
}
/**
* @dev Resets the value spent to enable more spending
*/
function resetSpentToday() onlymanyowners(keccak256(msg.data)) external {
_resetSpentToday();
}
// INTERNAL METHODS
/**
* @dev Clears the list of transactions pending approval.
*/
function clearPending() internal {
uint length = pendingsIndex.length;
for (uint i = 0; i < length; ++i) {
delete txs[pendingsIndex[i]];
}
super.clearPending();
}
// FIELDS
// pending transactions we have at present.
mapping (bytes32 => Transaction) txs;
}

View File

@ -1,34 +0,0 @@
pragma solidity ^0.4.11;
/**
* @title Helps contracts guard agains rentrancy attacks.
* @author Remco Bloemen <remco@2π.com>
* @notice If you mark a function `nonReentrant`, you should also
* mark it `external`.
*/
contract ReentrancyGuard {
/**
* @dev We use a single lock for the whole contract.
*/
bool private rentrancy_lock = false;
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* @notice If you mark a function `nonReentrant`, you should also
* mark it `external`. Calling one nonReentrant function from
* another is not supported. Instead, you can implement a
* `private` function doing the actual work, and a `external`
* wrapper marked as `nonReentrant`.
*/
modifier nonReentrant() {
if(rentrancy_lock == false) {
rentrancy_lock = true;
_;
rentrancy_lock = false;
} else {
throw;
}
}
}

View File

@ -1,53 +0,0 @@
pragma solidity ^0.4.11;
/**
* Math operations with safety checks
*/
library SafeMath {
function mul(uint a, uint b) internal returns (uint) {
uint c = a * b;
assert(a == 0 || c / a == b);
return c;
}
function div(uint a, uint b) internal returns (uint) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function sub(uint a, uint b) internal returns (uint) {
assert(b <= a);
return a - b;
}
function add(uint a, uint b) internal returns (uint) {
uint c = a + b;
assert(c >= a);
return c;
}
function max64(uint64 a, uint64 b) internal constant returns (uint64) {
return a >= b ? a : b;
}
function min64(uint64 a, uint64 b) internal constant returns (uint64) {
return a < b ? a : b;
}
function max256(uint256 a, uint256 b) internal constant returns (uint256) {
return a >= b ? a : b;
}
function min256(uint256 a, uint256 b) internal constant returns (uint256) {
return a < b ? a : b;
}
function assert(bool assertion) internal {
if (!assertion) {
throw;
}
}
}

View File

@ -0,0 +1,98 @@
pragma solidity ^0.4.18;
import "../ownership/Ownable.sol";
import "../ownership/rbac/RBAC.sol";
import "../ECRecovery.sol";
/**
* @title SignatureBouncer
* @author PhABC and Shrugs
* @dev Bouncer allows users to submit a signature as a permission to do an action.
* @dev If the signature is from one of the authorized bouncer addresses, the signature
* @dev is valid. The owner of the contract adds/removes bouncers.
* @dev Bouncer addresses can be individual servers signing grants or different
* @dev users within a decentralized club that have permission to invite other members.
* @dev
* @dev This technique is useful for whitelists and airdrops; instead of putting all
* @dev valid addresses on-chain, simply sign a grant of the form
* @dev keccak256(`:contractAddress` + `:granteeAddress`) using a valid bouncer address.
* @dev Then restrict access to your crowdsale/whitelist/airdrop using the
* @dev `onlyValidSignature` modifier (or implement your own using isValidSignature).
* @dev
* @dev See the tests Bouncer.test.js for specific usage examples.
*/
contract SignatureBouncer is Migratable, Ownable, RBAC {
using ECRecovery for bytes32;
string public constant ROLE_BOUNCER = "bouncer";
function initialize(address _sender)
isInitializer("SignatureBouncer", "1.9.0")
public
{
Ownable.initialize(_sender);
}
/**
* @dev requires that a valid signature of a bouncer was provided
*/
modifier onlyValidSignature(bytes _sig)
{
require(isValidSignature(msg.sender, _sig));
_;
}
/**
* @dev allows the owner to add additional bouncer addresses
*/
function addBouncer(address _bouncer)
onlyOwner
public
{
require(_bouncer != address(0));
addRole(_bouncer, ROLE_BOUNCER);
}
/**
* @dev allows the owner to remove bouncer addresses
*/
function removeBouncer(address _bouncer)
onlyOwner
public
{
require(_bouncer != address(0));
removeRole(_bouncer, ROLE_BOUNCER);
}
/**
* @dev is the signature of `this + sender` from a bouncer?
* @return bool
*/
function isValidSignature(address _address, bytes _sig)
internal
view
returns (bool)
{
return isValidDataHash(
keccak256(address(this), _address),
_sig
);
}
/**
* @dev internal function to convert a hash to an eth signed message
* @dev and then recover the signature and check it against the bouncer role
* @return bool
*/
function isValidDataHash(bytes32 hash, bytes _sig)
internal
view
returns (bool)
{
address signer = hash
.toEthSignedMessageHash()
.recover(_sig);
return hasRole(signer, ROLE_BOUNCER);
}
}

View File

@ -1,25 +0,0 @@
pragma solidity ^0.4.11;
import "../ownership/Ownable.sol";
/**
* @title Destructible
* @dev Base contract that can be destroyed by owner. All funds in contract will be sent to the owner.
*/
contract Destructible is Ownable {
function Destructible() payable { }
/**
* @dev Transfers the current balance to the owner and terminates the contract.
*/
function destroy() onlyOwner {
selfdestruct(owner);
}
function destroyAndSend(address _recipient) onlyOwner {
selfdestruct(_recipient);
}
}

View File

@ -1,21 +0,0 @@
pragma solidity ^0.4.11;
import '../ownership/Ownable.sol';
/**
* @title Migrations
* @dev This is a truffle contract, needed for truffle integration, not meant for use by Zeppelin users.
*/
contract Migrations is Ownable {
uint public lastCompletedMigration;
function setCompleted(uint completed) onlyOwner {
lastCompletedMigration = completed;
}
function upgrade(address newAddress) onlyOwner {
Migrations upgraded = Migrations(newAddress);
upgraded.setCompleted(lastCompletedMigration);
}
}

View File

@ -1,4 +1,4 @@
pragma solidity ^0.4.11;
pragma solidity ^0.4.21;
import "../ownership/Ownable.sol";
@ -8,44 +8,46 @@ import "../ownership/Ownable.sol";
* @title Pausable
* @dev Base contract which allows children to implement an emergency stop mechanism.
*/
contract Pausable is Ownable {
contract Pausable is Migratable, Ownable {
event Pause();
event Unpause();
bool public paused = false;
function initialize(address _sender) isInitializer("Pausable", "1.9.0") public {
Ownable.initialize(_sender);
}
/**
* @dev modifier to allow actions only when the contract IS paused
* @dev Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
if (paused) throw;
require(!paused);
_;
}
/**
* @dev modifier to allow actions only when the contract IS NOT paused
* @dev Modifier to make a function callable only when the contract is paused.
*/
modifier whenPaused {
if (!paused) throw;
modifier whenPaused() {
require(paused);
_;
}
/**
* @dev called by the owner to pause, triggers stopped state
*/
function pause() onlyOwner whenNotPaused returns (bool) {
function pause() onlyOwner whenNotPaused public {
paused = true;
Pause();
return true;
emit Pause();
}
/**
* @dev called by the owner to unpause, returns to normal state
*/
function unpause() onlyOwner whenPaused returns (bool) {
function unpause() onlyOwner whenPaused public {
paused = false;
Unpause();
return true;
emit Unpause();
}
}

View File

@ -1,36 +0,0 @@
pragma solidity ^0.4.11;
import "../ownership/Ownable.sol";
import "../token/ERC20Basic.sol";
/**
* @title TokenDestructible:
* @author Remco Bloemen <remco@2π.com>
* @dev Base contract that can be destroyed by owner. All funds in contract including
* listed tokens will be sent to the owner.
*/
contract TokenDestructible is Ownable {
function TokenDestructible() payable { }
/**
* @notice Terminate contract and refund to owner
* @param tokens List of addresses of ERC20 or ERC20Basic token contracts to
refund.
* @notice The called token contracts could try to re-enter this contract. Only
supply token contracts you trust.
*/
function destroy(address[] tokens) onlyOwner {
// Transfer tokens to owner
for(uint i = 0; i < tokens.length; i++) {
ERC20Basic token = ERC20Basic(tokens[i]);
uint256 balance = token.balanceOf(this);
token.transfer(owner, balance);
}
// Transfer Eth to owner and terminate contract
selfdestruct(owner);
}
}

24
contracts/math/Math.sol Normal file
View File

@ -0,0 +1,24 @@
pragma solidity ^0.4.21;
/**
* @title Math
* @dev Assorted math operations
*/
library Math {
function max64(uint64 a, uint64 b) internal pure returns (uint64) {
return a >= b ? a : b;
}
function min64(uint64 a, uint64 b) internal pure returns (uint64) {
return a < b ? a : b;
}
function max256(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
function min256(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
}

View File

@ -0,0 +1,48 @@
pragma solidity ^0.4.21;
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}

View File

@ -0,0 +1,15 @@
pragma solidity ^0.4.21;
import "../token/ERC20/BasicToken.sol";
// mock class using BasicToken
contract BasicTokenMock is BasicToken {
function BasicTokenMock(address initialAccount, uint256 initialBalance) public {
balances[initialAccount] = initialBalance;
totalSupply_ = initialBalance;
}
}

View File

@ -0,0 +1,29 @@
pragma solidity ^0.4.18;
import "../access/SignatureBouncer.sol";
contract SignatureBouncerMock is SignatureBouncer {
function initialize(address _sender)
isInitializer("SignatureBouncerMock", "1.9.0")
public
{
SignatureBouncer.initialize(_sender);
}
function checkValidSignature(address _address, bytes _sig)
public
view
returns (bool)
{
return isValidSignature(_address, _sig);
}
function onlyWithValidSignature(bytes _sig)
onlyValidSignature(_sig)
public
view
{
}
}

View File

@ -0,0 +1,13 @@
pragma solidity ^0.4.21;
import "../token/ERC20/BurnableToken.sol";
contract BurnableTokenMock is BurnableToken {
function BurnableTokenMock(address initialAccount, uint initialBalance) public {
balances[initialAccount] = initialBalance;
totalSupply_ = initialBalance;
}
}

View File

@ -0,0 +1,11 @@
pragma solidity ^0.4.21;
import "../token/ERC20/StandardToken.sol";
import "../token/ERC20/DetailedERC20.sol";
contract DetailedERC20Mock is StandardToken, DetailedERC20 {
function DetailedERC20Mock(string _name, string _symbol, uint8 _decimals) public {
DetailedERC20.initialize(_name, _symbol, _decimals);
}
}

View File

@ -0,0 +1,25 @@
pragma solidity ^0.4.21;
import "../ECRecovery.sol";
contract ECRecoveryMock {
using ECRecovery for bytes32;
function recover(bytes32 hash, bytes sig)
public
pure
returns (address)
{
return hash.recover(sig);
}
function toEthSignedMessageHash(bytes32 hash)
public
pure
returns (bytes32)
{
return hash.toEthSignedMessageHash();
}
}

View File

@ -0,0 +1,18 @@
pragma solidity ^0.4.21;
import "../token/ERC721/ERC721BasicToken.sol";
/**
* @title ERC721BasicTokenMock
* This mock just provides a public mint and burn functions for testing purposes
*/
contract ERC721BasicTokenMock is ERC721BasicToken {
function mint(address _to, uint256 _tokenId) public {
super._mint(_to, _tokenId);
}
function burn(uint256 _tokenId) public {
super._burn(ownerOf(_tokenId), _tokenId);
}
}

View File

@ -0,0 +1,34 @@
pragma solidity ^0.4.21;
import "../token/ERC721/ERC721Receiver.sol";
contract ERC721ReceiverMock is ERC721Receiver {
bytes4 retval;
bool reverts;
event Received(address _address, uint256 _tokenId, bytes _data, uint256 _gas);
function ERC721ReceiverMock(bytes4 _retval, bool _reverts) public {
retval = _retval;
reverts = _reverts;
}
function onERC721Received(
address _address,
uint256 _tokenId,
bytes _data
)
public
returns(bytes4)
{
require(!reverts);
emit Received(
_address,
_tokenId,
_data,
gasleft() // msg.gas was deprecated in solidityv0.4.21
);
return retval;
}
}

View File

@ -0,0 +1,27 @@
pragma solidity ^0.4.21;
import "../token/ERC721/ERC721Token.sol";
/**
* @title ERC721TokenMock
* This mock just provides a public mint and burn functions for testing purposes,
* and a public setter for metadata URI
*/
contract ERC721TokenMock is ERC721Token {
function ERC721TokenMock(string name, string symbol) public {
ERC721Token.initialize(name, symbol);
}
function mint(address _to, uint256 _tokenId) public {
super._mint(_to, _tokenId);
}
function burn(uint256 _tokenId) public {
super._burn(ownerOf(_tokenId), _tokenId);
}
function setTokenURI(uint256 _tokenId, string _uri) public {
super._setTokenURI(_tokenId, _uri);
}
}

View File

@ -0,0 +1,26 @@
pragma solidity ^0.4.21;
import "../../contracts/math/Math.sol";
contract MathMock {
uint64 public result64;
uint256 public result256;
function max64(uint64 a, uint64 b) public {
result64 = Math.max64(a, b);
}
function min64(uint64 a, uint64 b) public {
result64 = Math.min64(a, b);
}
function max256(uint256 a, uint256 b) public {
result256 = Math.max256(a, b);
}
function min256(uint256 a, uint256 b) public {
result256 = Math.min256(a, b);
}
}

View File

@ -0,0 +1,11 @@
pragma solidity ^0.4.21;
import { MerkleProof } from "../MerkleProof.sol";
contract MerkleProofWrapper {
function verifyProof(bytes32[] _proof, bytes32 _root, bytes32 _leaf) public pure returns (bool) {
return MerkleProof.verifyProof(_proof, _root, _leaf);
}
}

View File

@ -1,15 +1,17 @@
pragma solidity ^0.4.11;
pragma solidity ^0.4.21;
import '../../contracts/lifecycle/Pausable.sol';
import "../lifecycle/Pausable.sol";
// mock class using Pausable
contract PausableMock is Pausable {
bool public drasticMeasureTaken;
uint public count;
uint256 public count;
function PausableMock() public {
Ownable.initialize(msg.sender);
function PausableMock() {
drasticMeasureTaken = false;
count = 0;
}

View File

@ -1,11 +1,14 @@
pragma solidity ^0.4.11;
pragma solidity ^0.4.21;
import "../token/ERC20/PausableToken.sol";
import '../../contracts/token/PausableToken.sol';
// mock class using PausableToken
contract PausableTokenMock is PausableToken {
function PausableTokenMock(address initialAccount, uint initialBalance) {
function PausableTokenMock(address initialAccount, uint initialBalance) public {
Ownable.initialize(msg.sender);
balances[initialAccount] = initialBalance;
}

View File

@ -0,0 +1,17 @@
pragma solidity ^0.4.21;
import "../payment/PullPayment.sol";
// mock class using PullPayment
contract PullPaymentMock is PullPayment {
function PullPaymentMock() public payable { }
// test helper function to call asyncSend
function callSend(address dest, uint256 amount) public {
asyncSend(dest, amount);
}
}

View File

@ -0,0 +1,71 @@
pragma solidity ^0.4.21;
import "../ownership/rbac/RBACWithAdmin.sol";
contract RBACMock is RBACWithAdmin {
string constant ROLE_ADVISOR = "advisor";
modifier onlyAdminOrAdvisor()
{
require(
hasRole(msg.sender, ROLE_ADMIN) ||
hasRole(msg.sender, ROLE_ADVISOR)
);
_;
}
function RBACMock(address[] _advisors)
public
{
RBACWithAdmin.initialize(msg.sender);
addRole(msg.sender, ROLE_ADVISOR);
for (uint256 i = 0; i < _advisors.length; i++) {
addRole(_advisors[i], ROLE_ADVISOR);
}
}
function onlyAdminsCanDoThis()
onlyAdmin
view
external
{
}
function onlyAdvisorsCanDoThis()
onlyRole(ROLE_ADVISOR)
view
external
{
}
function eitherAdminOrAdvisorCanDoThis()
onlyAdminOrAdvisor
view
external
{
}
function nobodyCanDoThis()
onlyRole("unknown")
view
external
{
}
// admins can remove advisor's role
function removeAdvisor(address _addr)
onlyAdmin
public
{
// revert if the user isn't an advisor
// (perhaps you want to soft-fail here instead?)
checkRole(_addr, ROLE_ADVISOR);
// remove the advisor's role
removeRole(_addr, ROLE_ADVISOR);
}
}

View File

@ -0,0 +1,95 @@
pragma solidity ^0.4.21;
import "../token/ERC20/ERC20.sol";
import "../token/ERC20/SafeERC20.sol";
contract ERC20FailingMock is ERC20 {
function totalSupply() public view returns (uint256) {
return 0;
}
function transfer(address, uint256) public returns (bool) {
return false;
}
function transferFrom(address, address, uint256) public returns (bool) {
return false;
}
function approve(address, uint256) public returns (bool) {
return false;
}
function balanceOf(address) public view returns (uint256) {
return 0;
}
function allowance(address, address) public view returns (uint256) {
return 0;
}
}
contract ERC20SucceedingMock is ERC20 {
function totalSupply() public view returns (uint256) {
return 0;
}
function transfer(address, uint256) public returns (bool) {
return true;
}
function transferFrom(address, address, uint256) public returns (bool) {
return true;
}
function approve(address, uint256) public returns (bool) {
return true;
}
function balanceOf(address) public view returns (uint256) {
return 0;
}
function allowance(address, address) public view returns (uint256) {
return 0;
}
}
contract SafeERC20Helper {
using SafeERC20 for ERC20;
ERC20 failing;
ERC20 succeeding;
function SafeERC20Helper() public {
failing = new ERC20FailingMock();
succeeding = new ERC20SucceedingMock();
}
function doFailingTransfer() public {
failing.safeTransfer(0, 0);
}
function doFailingTransferFrom() public {
failing.safeTransferFrom(0, 0, 0);
}
function doFailingApprove() public {
failing.safeApprove(0, 0);
}
function doSucceedingTransfer() public {
succeeding.safeTransfer(0, 0);
}
function doSucceedingTransferFrom() public {
succeeding.safeTransferFrom(0, 0, 0);
}
function doSucceedingApprove() public {
succeeding.safeApprove(0, 0);
}
}

View File

@ -0,0 +1,24 @@
pragma solidity ^0.4.21;
import "../math/SafeMath.sol";
contract SafeMathMock {
function mul(uint256 a, uint256 b) public pure returns (uint256) {
return SafeMath.mul(a, b);
}
function div(uint256 a, uint256 b) public pure returns (uint256) {
return SafeMath.div(a, b);
}
function sub(uint256 a, uint256 b) public pure returns (uint256) {
return SafeMath.sub(a, b);
}
function add(uint256 a, uint256 b) public pure returns (uint256) {
return SafeMath.add(a, b);
}
}

View File

@ -0,0 +1,13 @@
pragma solidity ^0.4.18;
import "../token/ERC20/StandardBurnableToken.sol";
contract StandardBurnableTokenMock is StandardBurnableToken {
function StandardBurnableTokenMock(address initialAccount, uint initialBalance) public {
balances[initialAccount] = initialBalance;
totalSupply_ = initialBalance;
}
}

View File

@ -0,0 +1,14 @@
pragma solidity ^0.4.21;
import "../token/ERC20/StandardToken.sol";
// mock class using StandardToken
contract StandardTokenMock is StandardToken {
function StandardTokenMock(address initialAccount, uint256 initialBalance) public {
balances[initialAccount] = initialBalance;
totalSupply_ = initialBalance;
}
}

View File

@ -1,40 +0,0 @@
pragma solidity ^0.4.11;
import './Ownable.sol';
/**
* @title Claimable
* @dev Extension for the Ownable contract, where the ownership needs to be claimed.
* This allows the new owner to accept the transfer.
*/
contract Claimable is Ownable {
address public pendingOwner;
/**
* @dev Modifier throws if called by any account other than the pendingOwner.
*/
modifier onlyPendingOwner() {
if (msg.sender != pendingOwner) {
throw;
}
_;
}
/**
* @dev Allows the current owner to set the pendingOwner address.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) onlyOwner {
pendingOwner = newOwner;
}
/**
* @dev Allows the pendingOwner address to finalize the transfer.
*/
function claimOwnership() onlyPendingOwner {
owner = pendingOwner;
pendingOwner = 0x0;
}
}

View File

@ -1,21 +0,0 @@
pragma solidity ^0.4.11;
import './Ownable.sol';
/**
* @title Contactable token
* @dev Basic version of a contactable contract, allowing the owner to provide a string with their
* contact information.
*/
contract Contactable is Ownable{
string public contactInformation;
/**
* @dev Allows the owner to set a string with their contact information.
* @param info The contact information to attach to the contract.
*/
function setContactInformation(string info) onlyOwner{
contactInformation = info;
}
}

View File

@ -1,43 +0,0 @@
pragma solidity ^0.4.11;
import './Claimable.sol';
/**
* @title DelayedClaimable
* @dev Extension for the Claimable contract, where the ownership needs to be claimed before/after
* a certain block number.
*/
contract DelayedClaimable is Claimable {
uint public end;
uint public start;
/**
* @dev Used to specify the time period during which a pending
* owner can claim ownership.
* @param _start The earliest time ownership can be claimed.
* @param _end The latest time ownership can be claimed.
*/
function setLimits(uint _start, uint _end) onlyOwner {
if (_start > _end)
throw;
end = _end;
start = _start;
}
/**
* @dev Allows the pendingOwner address to finalize the transfer, as long as it is called within
* the specified start and end time.
*/
function claimOwnership() onlyPendingOwner {
if ((block.number > end) || (block.number < start))
throw;
owner = pendingOwner;
pendingOwner = 0x0;
end = 0;
}
}

View File

@ -1,21 +0,0 @@
pragma solidity ^0.4.11;
import "./Ownable.sol";
/**
* @title Contracts that should not own Contracts
* @author Remco Bloemen <remco@2π.com>
* @dev Should contracts (anything Ownable) end up being owned by this contract, it allows the owner
* of this contract to reclaim ownership of the contracts.
*/
contract HasNoContracts is Ownable {
/**
* @dev Reclaim ownership of Ownable contracts
* @param contractAddr The address of the Ownable to be reclaimed.
*/
function reclaimContract(address contractAddr) external onlyOwner {
Ownable contractInst = Ownable(contractAddr);
contractInst.transferOwnership(owner);
}
}

View File

@ -1,44 +0,0 @@
pragma solidity ^0.4.11;
import "./Ownable.sol";
/**
* @title Contracts that should not own Ether
* @author Remco Bloemen <remco@2π.com>
* @dev This tries to block incoming ether to prevent accidental loss of Ether. Should Ether end up
* in the contract, it will allow the owner to reclaim this ether.
* @notice Ether can still be send to this contract by:
* calling functions labeled `payable`
* `selfdestruct(contract_address)`
* mining directly to the contract address
*/
contract HasNoEther is Ownable {
/**
* @dev Constructor that rejects incoming Ether
* @dev The `payable` flag is added so we can access `msg.value` without compiler warning. If we
* leave out payable, then Solidity will allow inheriting contracts to implement a payable
* constructor. By doing it this way we prevent a payable constructor from working. Alternatively
* we could use assembly to access msg.value.
*/
function HasNoEther() payable {
if(msg.value > 0) {
throw;
}
}
/**
* @dev Disallows direct send by settings a default function without the `payable` flag.
*/
function() external {
}
/**
* @dev Transfer all Ether held by the contract to the owner.
*/
function reclaimEther() external onlyOwner {
if(!owner.send(this.balance)) {
throw;
}
}
}

View File

@ -1,34 +0,0 @@
pragma solidity ^0.4.11;
import "./Ownable.sol";
import "../token/ERC20Basic.sol";
/**
* @title Contracts that should not own Tokens
* @author Remco Bloemen <remco@2π.com>
* @dev This blocks incoming ERC23 tokens to prevent accidental loss of tokens.
* Should tokens (any ERC20Basic compatible) end up in the contract, it allows the
* owner to reclaim the tokens.
*/
contract HasNoTokens is Ownable {
/**
* @dev Reject all ERC23 compatible tokens
* @param from_ address The address that is transferring the tokens
* @param value_ Uint the amount of the specified token
* @param data_ Bytes The data passed from the caller.
*/
function tokenFallback(address from_, uint value_, bytes data_) external {
throw;
}
/**
* @dev Reclaim all ERC20Basic compatible tokens
* @param tokenAddr address The address of the token contract
*/
function reclaimToken(address tokenAddr) external onlyOwner {
ERC20Basic tokenInst = ERC20Basic(tokenAddr);
uint256 balance = tokenInst.balanceOf(this);
tokenInst.transfer(owner, balance);
}
}

View File

@ -1,28 +0,0 @@
pragma solidity ^0.4.11;
/**
* @title Multisig
* @dev Interface contract for multisig proxy contracts; see below for docs.
*/
contract Multisig {
// EVENTS
// logged events:
// Funds has arrived into the wallet (record how much).
event Deposit(address _from, uint value);
// Single transaction going out of the wallet (record who signed for it, how much, and to whom it's going).
event SingleTransact(address owner, uint value, address to, bytes data);
// Multi-sig transaction going out of the wallet (record who signed for it last, the operation hash, how much, and to whom it's going).
event MultiTransact(address owner, bytes32 operation, uint value, address to, bytes data);
// Confirmation still needed for a transaction.
event ConfirmationNeeded(bytes32 operation, address initiator, uint value, address to, bytes data);
// FUNCTIONS
// TODO: document
function changeOwner(address _from, address _to) external;
function execute(address _to, uint _value, bytes _data) external returns (bytes32);
function confirm(bytes32 _h) returns (bool);
}

View File

@ -1,14 +0,0 @@
pragma solidity ^0.4.11;
import "./HasNoEther.sol";
import "./HasNoTokens.sol";
import "./HasNoContracts.sol";
/**
* @title Base contract for contracts that should not own things.
* @author Remco Bloemen <remco@2π.com>
* @dev Solves a class of errors where a contract accidentally becomes owner of Ether, Tokens or
* Owned contracts. See respective base contracts for details.
*/
contract NoOwner is HasNoEther, HasNoTokens, HasNoContracts {
}

View File

@ -1,43 +1,43 @@
pragma solidity ^0.4.11;
pragma solidity ^0.4.21;
import "zos-lib/contracts/migrations/Migratable.sol";
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
contract Ownable is Migratable {
address public owner;
/**
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
function Ownable() {
owner = msg.sender;
function initialize(address _sender) public isInitializer("Ownable", "1.9.0") {
owner = _sender;
}
/**
* @dev Throws if called by any account other than the owner.
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
if (msg.sender != owner) {
throw;
}
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) onlyOwner {
if (newOwner != address(0)) {
owner = newOwner;
}
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}

View File

@ -1,189 +0,0 @@
pragma solidity ^0.4.11;
/**
* @title Shareable
* @dev inheritable "property" contract that enables methods to be protected by requiring the
* acquiescence of either a single, or, crucially, each of a number of, designated owners.
* @dev Usage: use modifiers onlyowner (just own owned) or onlymanyowners(hash), whereby the same hash must be provided by some number (specified in constructor) of the set of owners (specified in the constructor) before the interior is executed.
*/
contract Shareable {
// struct for the status of a pending operation.
struct PendingState {
uint yetNeeded;
uint ownersDone;
uint index;
}
// the number of owners that must confirm the same operation before it is run.
uint public required;
// list of owners
address[256] owners;
// index on the list of owners to allow reverse lookup
mapping(address => uint) ownerIndex;
// the ongoing operations.
mapping(bytes32 => PendingState) pendings;
bytes32[] pendingsIndex;
// this contract only has six types of events: it can accept a confirmation, in which case
// we record owner and operation (hash) alongside it.
event Confirmation(address owner, bytes32 operation);
event Revoke(address owner, bytes32 operation);
// simple single-sig function modifier.
modifier onlyOwner {
if (!isOwner(msg.sender)) {
throw;
}
_;
}
/**
* @dev Modifier for multisig functions.
* @param _operation The operation must have an intrinsic hash in order that later attempts can be
* realised as the same underlying operation and thus count as confirmations.
*/
modifier onlymanyowners(bytes32 _operation) {
if (confirmAndCheck(_operation)) {
_;
}
}
/**
* @dev Constructor is given the number of sigs required to do protected "onlymanyowners"
* transactions as well as the selection of addresses capable of confirming them.
* @param _owners A list of owners.
* @param _required The amount required for a transaction to be approved.
*/
function Shareable(address[] _owners, uint _required) {
owners[1] = msg.sender;
ownerIndex[msg.sender] = 1;
for (uint i = 0; i < _owners.length; ++i) {
owners[2 + i] = _owners[i];
ownerIndex[_owners[i]] = 2 + i;
}
required = _required;
if (required > owners.length) {
throw;
}
}
/**
* @dev Revokes a prior confirmation of the given operation.
* @param _operation A string identifying the operation.
*/
function revoke(bytes32 _operation) external {
uint index = ownerIndex[msg.sender];
// make sure they're an owner
if (index == 0) {
return;
}
uint ownerIndexBit = 2**index;
var pending = pendings[_operation];
if (pending.ownersDone & ownerIndexBit > 0) {
pending.yetNeeded++;
pending.ownersDone -= ownerIndexBit;
Revoke(msg.sender, _operation);
}
}
/**
* @dev Gets an owner by 0-indexed position (using numOwners as the count)
* @param ownerIndex Uint The index of the owner
* @return The address of the owner
*/
function getOwner(uint ownerIndex) external constant returns (address) {
return address(owners[ownerIndex + 1]);
}
/**
* @dev Checks if given address is an owner.
* @param _addr address The address which you want to check.
* @return True if the address is an owner and fase otherwise.
*/
function isOwner(address _addr) constant returns (bool) {
return ownerIndex[_addr] > 0;
}
/**
* @dev Function to check is specific owner has already confirme the operation.
* @param _operation The operation identifier.
* @param _owner The owner address.
* @return True if the owner has confirmed and false otherwise.
*/
function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool) {
var pending = pendings[_operation];
uint index = ownerIndex[_owner];
// make sure they're an owner
if (index == 0) {
return false;
}
// determine the bit to set for this owner.
uint ownerIndexBit = 2**index;
return !(pending.ownersDone & ownerIndexBit == 0);
}
/**
* @dev Confirm and operation and checks if it's already executable.
* @param _operation The operation identifier.
* @return Returns true when operation can be executed.
*/
function confirmAndCheck(bytes32 _operation) internal returns (bool) {
// determine what index the present sender is:
uint index = ownerIndex[msg.sender];
// make sure they're an owner
if (index == 0) {
throw;
}
var pending = pendings[_operation];
// if we're not yet working on this operation, switch over and reset the confirmation status.
if (pending.yetNeeded == 0) {
// reset count of confirmations needed.
pending.yetNeeded = required;
// reset which owners have confirmed (none) - set our bitmap to 0.
pending.ownersDone = 0;
pending.index = pendingsIndex.length++;
pendingsIndex[pending.index] = _operation;
}
// determine the bit to set for this owner.
uint ownerIndexBit = 2**index;
// make sure we (the message sender) haven't confirmed this operation previously.
if (pending.ownersDone & ownerIndexBit == 0) {
Confirmation(msg.sender, _operation);
// ok - check if count is enough to go ahead.
if (pending.yetNeeded <= 1) {
// enough confirmations: reset and run interior.
delete pendingsIndex[pendings[_operation].index];
delete pendings[_operation];
return true;
} else {
// not enough: record that this owner in particular confirmed.
pending.yetNeeded--;
pending.ownersDone |= ownerIndexBit;
}
}
return false;
}
/**
* @dev Clear the pending list.
*/
function clearPending() internal {
uint length = pendingsIndex.length;
for (uint i = 0; i < length; ++i) {
if (pendingsIndex[i] != 0) {
delete pendings[pendingsIndex[i]];
}
}
delete pendingsIndex;
}
}

View File

@ -0,0 +1,108 @@
pragma solidity ^0.4.21;
import "./Roles.sol";
/**
* @title RBAC (Role-Based Access Control)
* @author Matt Condon (@Shrugs)
* @dev Stores and provides setters and getters for roles and addresses.
* @dev Supports unlimited numbers of roles and addresses.
* @dev See //contracts/mocks/RBACMock.sol for an example of usage.
* This RBAC method uses strings to key roles. It may be beneficial
* for you to write your own implementation of this interface using Enums or similar.
* It's also recommended that you define constants in the contract, like ROLE_ADMIN below,
* to avoid typos.
*/
contract RBAC {
using Roles for Roles.Role;
mapping (string => Roles.Role) private roles;
event RoleAdded(address addr, string roleName);
event RoleRemoved(address addr, string roleName);
/**
* @dev reverts if addr does not have role
* @param addr address
* @param roleName the name of the role
* // reverts
*/
function checkRole(address addr, string roleName)
view
public
{
roles[roleName].check(addr);
}
/**
* @dev determine if addr has role
* @param addr address
* @param roleName the name of the role
* @return bool
*/
function hasRole(address addr, string roleName)
view
public
returns (bool)
{
return roles[roleName].has(addr);
}
/**
* @dev add a role to an address
* @param addr address
* @param roleName the name of the role
*/
function addRole(address addr, string roleName)
internal
{
roles[roleName].add(addr);
emit RoleAdded(addr, roleName);
}
/**
* @dev remove a role from an address
* @param addr address
* @param roleName the name of the role
*/
function removeRole(address addr, string roleName)
internal
{
roles[roleName].remove(addr);
emit RoleRemoved(addr, roleName);
}
/**
* @dev modifier to scope access to a single role (uses msg.sender as addr)
* @param roleName the name of the role
* // reverts
*/
modifier onlyRole(string roleName)
{
checkRole(msg.sender, roleName);
_;
}
/**
* @dev modifier to scope access to a set of roles (uses msg.sender as addr)
* @param roleNames the names of the roles to scope access to
* // reverts
*
* @TODO - when solidity supports dynamic arrays as arguments to modifiers, provide this
* see: https://github.com/ethereum/solidity/issues/2467
*/
// modifier onlyRoles(string[] roleNames) {
// bool hasAnyRole = false;
// for (uint8 i = 0; i < roleNames.length; i++) {
// if (hasRole(msg.sender, roleNames[i])) {
// hasAnyRole = true;
// break;
// }
// }
// require(hasAnyRole);
// _;
// }
}

View File

@ -0,0 +1,62 @@
pragma solidity ^0.4.21;
import "./RBAC.sol";
import "zos-lib/contracts/migrations/Migratable.sol";
/**
* @title RBACWithAdmin
* @author Matt Condon (@Shrugs)
* @dev It's recommended that you define constants in the contract,
* @dev like ROLE_ADMIN below, to avoid typos.
*/
contract RBACWithAdmin is RBAC, Migratable {
/**
* A constant role name for indicating admins.
*/
string public constant ROLE_ADMIN = "admin";
/**
* @dev modifier to scope access to admins
* // reverts
*/
modifier onlyAdmin()
{
checkRole(msg.sender, ROLE_ADMIN);
_;
}
/**
* @dev constructor. Sets initialAdmin as admin.
*/
function initialize(address initialAdmin)
isInitializer("RBACWithAdmin", "1.9.0")
public
{
addRole(initialAdmin, ROLE_ADMIN);
}
/**
* @dev add a role to an address
* @param addr address
* @param roleName the name of the role
*/
function adminAddRole(address addr, string roleName)
onlyAdmin
public
{
addRole(addr, roleName);
}
/**
* @dev remove a role from an address
* @param addr address
* @param roleName the name of the role
*/
function adminRemoveRole(address addr, string roleName)
onlyAdmin
public
{
removeRole(addr, roleName);
}
}

View File

@ -0,0 +1,55 @@
pragma solidity ^0.4.21;
/**
* @title Roles
* @author Francisco Giordano (@frangio)
* @dev Library for managing addresses assigned to a Role.
* See RBAC.sol for example usage.
*/
library Roles {
struct Role {
mapping (address => bool) bearer;
}
/**
* @dev give an address access to this role
*/
function add(Role storage role, address addr)
internal
{
role.bearer[addr] = true;
}
/**
* @dev remove an address' access to this role
*/
function remove(Role storage role, address addr)
internal
{
role.bearer[addr] = false;
}
/**
* @dev check if an address has this role
* // reverts
*/
function check(Role storage role, address addr)
view
internal
{
require(has(role, addr));
}
/**
* @dev check if an address has this role
* @return bool
*/
function has(Role storage role, address addr)
view
internal
returns (bool)
{
return role.bearer[addr];
}
}

View File

@ -1,50 +1,43 @@
pragma solidity ^0.4.11;
pragma solidity ^0.4.21;
import '../SafeMath.sol';
import "../math/SafeMath.sol";
/**
* @title PullPayment
* @dev Base contract supporting async send for pull payments. Inherit from this
* contract and use asyncSend instead of send.
* contract and use asyncSend instead of send or transfer.
*/
contract PullPayment {
using SafeMath for uint;
using SafeMath for uint256;
mapping(address => uint) public payments;
uint public totalPayments;
mapping(address => uint256) public payments;
uint256 public totalPayments;
/**
* @dev Withdraw accumulated balance, called by payee.
*/
function withdrawPayments() public {
address payee = msg.sender;
uint256 payment = payments[payee];
require(payment != 0);
require(address(this).balance >= payment);
totalPayments = totalPayments.sub(payment);
payments[payee] = 0;
payee.transfer(payment);
}
/**
* @dev Called by the payer to store the sent amount as credit to be pulled.
* @param dest The destination address of the funds.
* @param amount The amount to transfer.
*/
function asyncSend(address dest, uint amount) internal {
function asyncSend(address dest, uint256 amount) internal {
payments[dest] = payments[dest].add(amount);
totalPayments = totalPayments.add(amount);
}
/**
* @dev withdraw accumulated balance, called by payee.
*/
function withdrawPayments() {
address payee = msg.sender;
uint payment = payments[payee];
if (payment == 0) {
throw;
}
if (this.balance < payment) {
throw;
}
totalPayments = totalPayments.sub(payment);
payments[payee] = 0;
if (!payee.send(payment)) {
throw;
}
}
}

View File

@ -0,0 +1,76 @@
pragma solidity ^0.4.21;
import "../math/SafeMath.sol";
import "zos-lib/contracts/migrations/Migratable.sol";
/**
* @title SplitPayment
* @dev Base contract that supports multiple payees claiming funds sent to this contract
* according to the proportion they own.
*/
contract SplitPayment is Migratable {
using SafeMath for uint256;
uint256 public totalShares = 0;
uint256 public totalReleased = 0;
mapping(address => uint256) public shares;
mapping(address => uint256) public released;
address[] public payees;
/**
* @dev Constructor
*/
function initialize(address[] _payees, uint256[] _shares)
isInitializer("SplitPayment", "1.9.0")
public
payable
{
require(_payees.length == _shares.length);
for (uint256 i = 0; i < _payees.length; i++) {
addPayee(_payees[i], _shares[i]);
}
}
/**
* @dev payable fallback
*/
function () public payable {}
/**
* @dev Claim your share of the balance.
*/
function claim() public {
address payee = msg.sender;
require(shares[payee] > 0);
uint256 totalReceived = address(this).balance.add(totalReleased);
uint256 payment = totalReceived.mul(shares[payee]).div(totalShares).sub(released[payee]);
require(payment != 0);
require(address(this).balance >= payment);
released[payee] = released[payee].add(payment);
totalReleased = totalReleased.add(payment);
payee.transfer(payment);
}
/**
* @dev Add a new payee to the contract.
* @param _payee The address of the payee to add.
* @param _shares The number of shares owned by the payee.
*/
function addPayee(address _payee, uint256 _shares) internal {
require(_payee != address(0));
require(_shares > 0);
require(shares[_payee] == 0);
payees.push(_payee);
shares[_payee] = _shares;
totalShares = totalShares.add(_shares);
}
}

View File

@ -1,47 +0,0 @@
pragma solidity ^0.4.11;
import './ERC20Basic.sol';
import '../SafeMath.sol';
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
*/
contract BasicToken is ERC20Basic {
using SafeMath for uint;
mapping(address => uint) balances;
/**
* @dev Fix for the ERC20 short address attack.
*/
modifier onlyPayloadSize(uint size) {
if(msg.data.length < size + 4) {
throw;
}
_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
function transfer(address _to, uint _value) onlyPayloadSize(2 * 32) {
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value);
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint representing the amount owned by the passed address.
*/
function balanceOf(address _owner) constant returns (uint balance) {
return balances[_owner];
}
}

View File

@ -1,60 +0,0 @@
pragma solidity ^0.4.11;
import "./StandardToken.sol";
/**
* @title CrowdsaleToken
*
* @dev Simple ERC20 Token example, with crowdsale token creation
* @dev IMPORTANT NOTE: do not use or deploy this contract as-is. It needs some changes to be
* production ready.
*/
contract CrowdsaleToken is StandardToken {
string public constant name = "CrowdsaleToken";
string public constant symbol = "CRW";
uint public constant decimals = 18;
// replace with your fund collection multisig address
address public constant multisig = 0x0;
// 1 ether = 500 example tokens
uint public constant PRICE = 500;
/**
* @dev Fallback function which receives ether and sends the appropriate number of tokens to the
* msg.sender.
*/
function () payable {
createTokens(msg.sender);
}
/**
* @dev Creates tokens and send to the specified address.
* @param recipient The address which will recieve the new tokens.
*/
function createTokens(address recipient) payable {
if (msg.value == 0) {
throw;
}
uint tokens = msg.value.mul(getPrice());
totalSupply = totalSupply.add(tokens);
balances[recipient] = balances[recipient].add(tokens);
if (!multisig.send(msg.value)) {
throw;
}
}
/**
* @dev replace this with any other price function
* @return The price per unit of token.
*/
function getPrice() constant returns (uint result) {
return PRICE;
}
}

View File

@ -1,16 +0,0 @@
pragma solidity ^0.4.11;
import './ERC20Basic.sol';
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) constant returns (uint);
function transferFrom(address from, address to, uint value);
function approve(address spender, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
}

View File

@ -0,0 +1,50 @@
pragma solidity ^0.4.21;
import "./ERC20Basic.sol";
import "../../math/SafeMath.sol";
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
*/
contract BasicToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
uint256 totalSupply_;
/**
* @dev total number of tokens in existence
*/
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
*/
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
}

View File

@ -0,0 +1,32 @@
pragma solidity ^0.4.21;
import "./BasicToken.sol";
/**
* @title Burnable Token
* @dev Token that can be irreversibly burned (destroyed).
*/
contract BurnableToken is BasicToken {
event Burn(address indexed burner, uint256 value);
/**
* @dev Burns a specific amount of tokens.
* @param _value The amount of token to be burned.
*/
function burn(uint256 _value) public {
_burn(msg.sender, _value);
}
function _burn(address _who, uint256 _value) internal {
require(_value <= balances[_who]);
// no need to require value <= totalSupply, since that would imply the
// sender's balance is greater than the totalSupply, which *should* be an assertion failure
balances[_who] = balances[_who].sub(_value);
totalSupply_ = totalSupply_.sub(_value);
emit Burn(_who, _value);
emit Transfer(_who, address(0), _value);
}
}

View File

@ -0,0 +1,17 @@
pragma solidity ^0.4.21;
import "./ERC20.sol";
import "zos-lib/contracts/migrations/Migratable.sol";
contract DetailedERC20 is Migratable, ERC20 {
string public name;
string public symbol;
uint8 public decimals;
function initialize(string _name, string _symbol, uint8 _decimals) public isInitializer("DetailedERC20", "1.9.0") {
name = _name;
symbol = _symbol;
decimals = _decimals;
}
}

View File

@ -0,0 +1,21 @@
pragma solidity ^0.4.21;
import "zos-lib/contracts/migrations/Migratable.sol";
import "./DetailedERC20.sol";
import "./MintableToken.sol";
contract DetailedMintableToken is Migratable, DetailedERC20, MintableToken {
function initialize(
address _sender,
string _name,
string _symbol,
uint8 _decimals
)
isInitializer("DetailedMintableToken", "1.9.0")
public
{
DetailedERC20.initialize(_name, _symbol, _decimals);
MintableToken.initialize(_sender);
}
}

View File

@ -0,0 +1,29 @@
pragma solidity ^0.4.21;
import "zos-lib/contracts/migrations/Migratable.sol";
import "./DetailedERC20.sol";
import "./MintableToken.sol";
contract DetailedPremintedToken is Migratable, DetailedERC20, StandardToken {
function initialize(
address _sender,
string _name,
string _symbol,
uint8 _decimals,
uint256 _initialBalance
)
isInitializer("DetailedPremintedToken", "1.9.0")
public
{
DetailedERC20.initialize(_name, _symbol, _decimals);
_premint(_sender, _initialBalance);
}
function _premint(address _to, uint256 _value) internal {
totalSupply_ += _value;
balances[_to] += _value;
emit Transfer(0, _to, _value);
}
}

View File

@ -0,0 +1,15 @@
pragma solidity ^0.4.21;
import "./ERC20Basic.sol";
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}

View File

@ -0,0 +1,14 @@
pragma solidity ^0.4.21;
/**
* @title ERC20Basic
* @dev Simpler version of ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/179
*/
contract ERC20Basic {
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}

View File

@ -0,0 +1,53 @@
pragma solidity ^0.4.21;
import "./StandardToken.sol";
import "../../ownership/Ownable.sol";
import "zos-lib/contracts/migrations/Migratable.sol";
/**
* @title Mintable token
* @dev Simple ERC20 Token example, with mintable token creation
* @dev Issue: * https://github.com/OpenZeppelin/openzeppelin-solidity/issues/120
* Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
*/
contract MintableToken is Migratable, Ownable, StandardToken {
event Mint(address indexed to, uint256 amount);
event MintFinished();
bool public mintingFinished = false;
modifier canMint() {
require(!mintingFinished);
_;
}
function initialize(address _sender) isInitializer("MintableToken", "1.9.0") public {
Ownable.initialize(_sender);
}
/**
* @dev Function to mint tokens
* @param _to The address that will receive the minted tokens.
* @param _amount The amount of tokens to mint.
* @return A boolean that indicates if the operation was successful.
*/
function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool) {
totalSupply_ = totalSupply_.add(_amount);
balances[_to] = balances[_to].add(_amount);
emit Mint(_to, _amount);
emit Transfer(address(0), _to, _amount);
return true;
}
/**
* @dev Function to stop minting new tokens.
* @return True if the operation was successful.
*/
function finishMinting() onlyOwner canMint public returns (bool) {
mintingFinished = true;
emit MintFinished();
return true;
}
}

View File

@ -0,0 +1,36 @@
pragma solidity ^0.4.21;
import "./StandardToken.sol";
import "../../lifecycle/Pausable.sol";
/**
* @title Pausable token
* @dev StandardToken modified with pausable transfers.
**/
contract PausableToken is Migratable, StandardToken, Pausable {
function initialize(address _sender) isInitializer("PausableToken", "1.9.0") public {
Pausable.initialize(_sender);
}
function transfer(address _to, uint256 _value) public whenNotPaused returns (bool) {
return super.transfer(_to, _value);
}
function transferFrom(address _from, address _to, uint256 _value) public whenNotPaused returns (bool) {
return super.transferFrom(_from, _to, _value);
}
function approve(address _spender, uint256 _value) public whenNotPaused returns (bool) {
return super.approve(_spender, _value);
}
function increaseApproval(address _spender, uint _addedValue) public whenNotPaused returns (bool success) {
return super.increaseApproval(_spender, _addedValue);
}
function decreaseApproval(address _spender, uint _subtractedValue) public whenNotPaused returns (bool success) {
return super.decreaseApproval(_spender, _subtractedValue);
}
}

View File

@ -0,0 +1,32 @@
pragma solidity ^0.4.21;
import "./ERC20Basic.sol";
import "./ERC20.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure.
* To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
assert(token.transfer(to, value));
}
function safeTransferFrom(
ERC20 token,
address from,
address to,
uint256 value
)
internal
{
assert(token.transferFrom(from, to, value));
}
function safeApprove(ERC20 token, address spender, uint256 value) internal {
assert(token.approve(spender, value));
}
}

View File

@ -0,0 +1,25 @@
pragma solidity ^0.4.18;
import "./BurnableToken.sol";
import "./StandardToken.sol";
/**
* @title Standard Burnable Token
* @dev Adds burnFrom method to ERC20 implementations
*/
contract StandardBurnableToken is BurnableToken, StandardToken {
/**
* @dev Burns a specific amount of tokens from the target address and decrements allowance
* @param _from address The address which you want to send tokens from
* @param _value uint256 The amount of token to be burned
*/
function burnFrom(address _from, uint256 _value) public {
require(_value <= allowed[_from][msg.sender]);
// Should https://github.com/OpenZeppelin/zeppelin-solidity/issues/707 be accepted,
// this function needs to emit an event with the updated approval.
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
_burn(_from, _value);
}
}

View File

@ -0,0 +1,100 @@
pragma solidity ^0.4.21;
import "./BasicToken.sol";
import "./ERC20.sol";
/**
* @title Standard ERC20 token
*
* @dev Implementation of the basic standard token.
* @dev https://github.com/ethereum/EIPs/issues/20
* @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
*/
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) internal allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
*/
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
*/
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}

View File

@ -0,0 +1,52 @@
pragma solidity ^0.4.21;
import "./SafeERC20.sol";
import "zos-lib/contracts/migrations/Migratable.sol";
/**
* @title TokenTimelock
* @dev TokenTimelock is a token holder contract that will allow a
* beneficiary to extract the tokens after a given release time
*/
contract TokenTimelock is Migratable {
using SafeERC20 for ERC20Basic;
// ERC20 basic token contract being held
ERC20Basic public token;
// beneficiary of tokens after they are released
address public beneficiary;
// timestamp when token release is enabled
uint256 public releaseTime;
function initialize(
address _sender,
ERC20Basic _token,
address _beneficiary,
uint256 _releaseTime
)
isInitializer("TokenTimelock", "1.9.0")
public
{
// solium-disable-next-line security/no-block-members
require(_releaseTime > block.timestamp);
token = _token;
beneficiary = _beneficiary;
releaseTime = _releaseTime;
}
/**
* @notice Transfers tokens held by timelock to beneficiary.
*/
function release() public {
// solium-disable-next-line security/no-block-members
require(block.timestamp >= releaseTime);
uint256 amount = token.balanceOf(this);
require(amount > 0);
token.safeTransfer(beneficiary, amount);
}
}

View File

@ -0,0 +1,130 @@
/* solium-disable security/no-block-members */
pragma solidity ^0.4.21;
import "./ERC20Basic.sol";
import "./SafeERC20.sol";
import "../../ownership/Ownable.sol";
import "../../math/SafeMath.sol";
import "zos-lib/contracts/migrations/Migratable.sol";
/**
* @title TokenVesting
* @dev A token holder contract that can release its token balance gradually like a
* typical vesting scheme, with a cliff and vesting period. Optionally revocable by the
* owner.
*/
contract TokenVesting is Migratable, Ownable {
using SafeMath for uint256;
using SafeERC20 for ERC20Basic;
event Released(uint256 amount);
event Revoked();
// beneficiary of tokens after they are released
address public beneficiary;
uint256 public cliff;
uint256 public start;
uint256 public duration;
bool public revocable;
mapping (address => uint256) public released;
mapping (address => bool) public revoked;
/**
* @dev Creates a vesting contract that vests its balance of any ERC20 token to the
* _beneficiary, gradually in a linear fashion until _start + _duration. By then all
* of the balance will have vested.
* @param _beneficiary address of the beneficiary to whom vested tokens are transferred
* @param _cliff duration in seconds of the cliff in which tokens will begin to vest
* @param _duration duration in seconds of the period in which the tokens will vest
* @param _revocable whether the vesting is revocable or not
*/
function initialize(
address _sender,
address _beneficiary,
uint256 _start,
uint256 _cliff,
uint256 _duration,
bool _revocable
)
public
isInitializer("TokenVesting", "1.9.0")
{
Ownable.initialize(_sender);
require(_beneficiary != address(0));
require(_cliff <= _duration);
beneficiary = _beneficiary;
revocable = _revocable;
duration = _duration;
cliff = _start.add(_cliff);
start = _start;
}
/**
* @notice Transfers vested tokens to beneficiary.
* @param token ERC20 token which is being vested
*/
function release(ERC20Basic token) public {
uint256 unreleased = releasableAmount(token);
require(unreleased > 0);
released[token] = released[token].add(unreleased);
token.safeTransfer(beneficiary, unreleased);
emit Released(unreleased);
}
/**
* @notice Allows the owner to revoke the vesting. Tokens already vested
* remain in the contract, the rest are returned to the owner.
* @param token ERC20 token which is being vested
*/
function revoke(ERC20Basic token) public onlyOwner {
require(revocable);
require(!revoked[token]);
uint256 balance = token.balanceOf(this);
uint256 unreleased = releasableAmount(token);
uint256 refund = balance.sub(unreleased);
revoked[token] = true;
token.safeTransfer(owner, refund);
emit Revoked();
}
/**
* @dev Calculates the amount that has already vested but hasn't been released yet.
* @param token ERC20 token which is being vested
*/
function releasableAmount(ERC20Basic token) public view returns (uint256) {
return vestedAmount(token).sub(released[token]);
}
/**
* @dev Calculates the amount that has already vested.
* @param token ERC20 token which is being vested
*/
function vestedAmount(ERC20Basic token) public view returns (uint256) {
uint256 currentBalance = token.balanceOf(this);
uint256 totalBalance = currentBalance.add(released[token]);
if (block.timestamp < cliff) {
return 0;
} else if (block.timestamp >= start.add(duration) || revoked[token]) {
return totalBalance;
} else {
return totalBalance.mul(block.timestamp.sub(start)).div(duration);
}
}
}

View File

@ -1,14 +0,0 @@
pragma solidity ^0.4.11;
/**
* @title ERC20Basic
* @dev Simpler version of ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20Basic {
uint public totalSupply;
function balanceOf(address who) constant returns (uint);
function transfer(address to, uint value);
event Transfer(address indexed from, address indexed to, uint value);
}

View File

@ -0,0 +1,33 @@
pragma solidity ^0.4.21;
import "./ERC721Basic.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
*/
contract ERC721Enumerable is ERC721Basic {
function totalSupply() public view returns (uint256);
function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId);
function tokenByIndex(uint256 _index) public view returns (uint256);
}
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
*/
contract ERC721Metadata is ERC721Basic {
function name() public view returns (string _name);
function symbol() public view returns (string _symbol);
function tokenURI(uint256 _tokenId) public view returns (string);
}
/**
* @title ERC-721 Non-Fungible Token Standard, full implementation interface
* @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
*/
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}

View File

@ -0,0 +1,32 @@
pragma solidity ^0.4.21;
/**
* @title ERC721 Non-Fungible Token Standard basic interface
* @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
*/
contract ERC721Basic {
event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
function balanceOf(address _owner) public view returns (uint256 _balance);
function ownerOf(uint256 _tokenId) public view returns (address _owner);
function exists(uint256 _tokenId) public view returns (bool _exists);
function approve(address _to, uint256 _tokenId) public;
function getApproved(uint256 _tokenId) public view returns (address _operator);
function setApprovalForAll(address _operator, bool _approved) public;
function isApprovedForAll(address _owner, address _operator) public view returns (bool);
function transferFrom(address _from, address _to, uint256 _tokenId) public;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;
function safeTransferFrom(
address _from,
address _to,
uint256 _tokenId,
bytes _data
)
public;
}

View File

@ -0,0 +1,295 @@
pragma solidity ^0.4.21;
import "./ERC721Basic.sol";
import "./ERC721Receiver.sol";
import "../../math/SafeMath.sol";
import "../../AddressUtils.sol";
/**
* @title ERC721 Non-Fungible Token Standard basic implementation
* @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
*/
contract ERC721BasicToken is ERC721Basic {
using SafeMath for uint256;
using AddressUtils for address;
// Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
// which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;
// Mapping from token ID to owner
mapping (uint256 => address) internal tokenOwner;
// Mapping from token ID to approved address
mapping (uint256 => address) internal tokenApprovals;
// Mapping from owner to number of owned token
mapping (address => uint256) internal ownedTokensCount;
// Mapping from owner to operator approvals
mapping (address => mapping (address => bool)) internal operatorApprovals;
/**
* @dev Guarantees msg.sender is owner of the given token
* @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
*/
modifier onlyOwnerOf(uint256 _tokenId) {
require(ownerOf(_tokenId) == msg.sender);
_;
}
/**
* @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
* @param _tokenId uint256 ID of the token to validate
*/
modifier canTransfer(uint256 _tokenId) {
require(isApprovedOrOwner(msg.sender, _tokenId));
_;
}
/**
* @dev Gets the balance of the specified address
* @param _owner address to query the balance of
* @return uint256 representing the amount owned by the passed address
*/
function balanceOf(address _owner) public view returns (uint256) {
require(_owner != address(0));
return ownedTokensCount[_owner];
}
/**
* @dev Gets the owner of the specified token ID
* @param _tokenId uint256 ID of the token to query the owner of
* @return owner address currently marked as the owner of the given token ID
*/
function ownerOf(uint256 _tokenId) public view returns (address) {
address owner = tokenOwner[_tokenId];
require(owner != address(0));
return owner;
}
/**
* @dev Returns whether the specified token exists
* @param _tokenId uint256 ID of the token to query the existance of
* @return whether the token exists
*/
function exists(uint256 _tokenId) public view returns (bool) {
address owner = tokenOwner[_tokenId];
return owner != address(0);
}
/**
* @dev Approves another address to transfer the given token ID
* @dev The zero address indicates there is no approved address.
* @dev There can only be one approved address per token at a given time.
* @dev Can only be called by the token owner or an approved operator.
* @param _to address to be approved for the given token ID
* @param _tokenId uint256 ID of the token to be approved
*/
function approve(address _to, uint256 _tokenId) public {
address owner = ownerOf(_tokenId);
require(_to != owner);
require(msg.sender == owner || isApprovedForAll(owner, msg.sender));
if (getApproved(_tokenId) != address(0) || _to != address(0)) {
tokenApprovals[_tokenId] = _to;
emit Approval(owner, _to, _tokenId);
}
}
/**
* @dev Gets the approved address for a token ID, or zero if no address set
* @param _tokenId uint256 ID of the token to query the approval of
* @return address currently approved for a the given token ID
*/
function getApproved(uint256 _tokenId) public view returns (address) {
return tokenApprovals[_tokenId];
}
/**
* @dev Sets or unsets the approval of a given operator
* @dev An operator is allowed to transfer all tokens of the sender on their behalf
* @param _to operator address to set the approval
* @param _approved representing the status of the approval to be set
*/
function setApprovalForAll(address _to, bool _approved) public {
require(_to != msg.sender);
operatorApprovals[msg.sender][_to] = _approved;
emit ApprovalForAll(msg.sender, _to, _approved);
}
/**
* @dev Tells whether an operator is approved by a given owner
* @param _owner owner address which you want to query the approval of
* @param _operator operator address which you want to query the approval of
* @return bool whether the given operator is approved by the given owner
*/
function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
return operatorApprovals[_owner][_operator];
}
/**
* @dev Transfers the ownership of a given token ID to another address
* @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
* @dev Requires the msg sender to be the owner, approved, or operator
* @param _from current owner of the token
* @param _to address to receive the ownership of the given token ID
* @param _tokenId uint256 ID of the token to be transferred
*/
function transferFrom(address _from, address _to, uint256 _tokenId) public canTransfer(_tokenId) {
require(_from != address(0));
require(_to != address(0));
clearApproval(_from, _tokenId);
removeTokenFrom(_from, _tokenId);
addTokenTo(_to, _tokenId);
emit Transfer(_from, _to, _tokenId);
}
/**
* @dev Safely transfers the ownership of a given token ID to another address
* @dev If the target address is a contract, it must implement `onERC721Received`,
* which is called upon a safe transfer, and return the magic value
* `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
* the transfer is reverted.
* @dev Requires the msg sender to be the owner, approved, or operator
* @param _from current owner of the token
* @param _to address to receive the ownership of the given token ID
* @param _tokenId uint256 ID of the token to be transferred
*/
function safeTransferFrom(
address _from,
address _to,
uint256 _tokenId
)
public
canTransfer(_tokenId)
{
// solium-disable-next-line arg-overflow
safeTransferFrom(_from, _to, _tokenId, "");
}
/**
* @dev Safely transfers the ownership of a given token ID to another address
* @dev If the target address is a contract, it must implement `onERC721Received`,
* which is called upon a safe transfer, and return the magic value
* `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
* the transfer is reverted.
* @dev Requires the msg sender to be the owner, approved, or operator
* @param _from current owner of the token
* @param _to address to receive the ownership of the given token ID
* @param _tokenId uint256 ID of the token to be transferred
* @param _data bytes data to send along with a safe transfer check
*/
function safeTransferFrom(
address _from,
address _to,
uint256 _tokenId,
bytes _data
)
public
canTransfer(_tokenId)
{
transferFrom(_from, _to, _tokenId);
// solium-disable-next-line arg-overflow
require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
}
/**
* @dev Returns whether the given spender can transfer a given token ID
* @param _spender address of the spender to query
* @param _tokenId uint256 ID of the token to be transferred
* @return bool whether the msg.sender is approved for the given token ID,
* is an operator of the owner, or is the owner of the token
*/
function isApprovedOrOwner(address _spender, uint256 _tokenId) internal view returns (bool) {
address owner = ownerOf(_tokenId);
return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);
}
/**
* @dev Internal function to mint a new token
* @dev Reverts if the given token ID already exists
* @param _to The address that will own the minted token
* @param _tokenId uint256 ID of the token to be minted by the msg.sender
*/
function _mint(address _to, uint256 _tokenId) internal {
require(_to != address(0));
addTokenTo(_to, _tokenId);
emit Transfer(address(0), _to, _tokenId);
}
/**
* @dev Internal function to burn a specific token
* @dev Reverts if the token does not exist
* @param _tokenId uint256 ID of the token being burned by the msg.sender
*/
function _burn(address _owner, uint256 _tokenId) internal {
clearApproval(_owner, _tokenId);
removeTokenFrom(_owner, _tokenId);
emit Transfer(_owner, address(0), _tokenId);
}
/**
* @dev Internal function to clear current approval of a given token ID
* @dev Reverts if the given address is not indeed the owner of the token
* @param _owner owner of the token
* @param _tokenId uint256 ID of the token to be transferred
*/
function clearApproval(address _owner, uint256 _tokenId) internal {
require(ownerOf(_tokenId) == _owner);
if (tokenApprovals[_tokenId] != address(0)) {
tokenApprovals[_tokenId] = address(0);
emit Approval(_owner, address(0), _tokenId);
}
}
/**
* @dev Internal function to add a token ID to the list of a given address
* @param _to address representing the new owner of the given token ID
* @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function addTokenTo(address _to, uint256 _tokenId) internal {
require(tokenOwner[_tokenId] == address(0));
tokenOwner[_tokenId] = _to;
ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
}
/**
* @dev Internal function to remove a token ID from the list of a given address
* @param _from address representing the previous owner of the given token ID
* @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function removeTokenFrom(address _from, uint256 _tokenId) internal {
require(ownerOf(_tokenId) == _from);
ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
tokenOwner[_tokenId] = address(0);
}
/**
* @dev Internal function to invoke `onERC721Received` on a target address
* @dev The call is not executed if the target address is not a contract
* @param _from address representing the previous owner of the given token ID
* @param _to target address that will receive the tokens
* @param _tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return whether the call correctly returned the expected magic value
*/
function checkAndCallSafeTransfer(
address _from,
address _to,
uint256 _tokenId,
bytes _data
)
internal
returns (bool)
{
if (!_to.isContract()) {
return true;
}
bytes4 retval = ERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);
return (retval == ERC721_RECEIVED);
}
}

View File

@ -0,0 +1,10 @@
pragma solidity ^0.4.21;
import "./ERC721Receiver.sol";
contract ERC721Holder is ERC721Receiver {
function onERC721Received(address, uint256, bytes) public returns(bytes4) {
return ERC721_RECEIVED;
}
}

View File

@ -0,0 +1,30 @@
pragma solidity ^0.4.21;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
contract ERC721Receiver {
/**
* @dev Magic value to be returned upon successful reception of an NFT
* Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`,
* which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
*/
bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;
/**
* @notice Handle the receipt of an NFT
* @dev The ERC721 smart contract calls this function on the recipient
* after a `safetransfer`. This function MAY throw to revert and reject the
* transfer. This function MUST use 50,000 gas or less. Return of other
* than the magic value MUST result in the transaction being reverted.
* Note: the contract address is always the message sender.
* @param _from The sending address
* @param _tokenId The NFT identifier which is being transfered
* @param _data Additional data with no specified format
* @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
*/
function onERC721Received(address _from, uint256 _tokenId, bytes _data) public returns(bytes4);
}

View File

@ -0,0 +1,186 @@
pragma solidity ^0.4.21;
import "./ERC721.sol";
import "./ERC721BasicToken.sol";
import "zos-lib/contracts/migrations/Migratable.sol";
/**
* @title Full ERC721 Token
* This implementation includes all the required and some optional functionality of the ERC721 standard
* Moreover, it includes approve all functionality using operator terminology
* @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
*/
contract ERC721Token is Migratable, ERC721, ERC721BasicToken {
// Token name
string internal name_;
// Token symbol
string internal symbol_;
// Mapping from owner to list of owned token IDs
mapping (address => uint256[]) internal ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) internal ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] internal allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) internal allTokensIndex;
// Optional mapping for token URIs
mapping(uint256 => string) internal tokenURIs;
/**
* @dev Constructor function
*/
function initialize(string _name, string _symbol) public isInitializer("ERC721Token", "1.9.0") {
name_ = _name;
symbol_ = _symbol;
}
/**
* @dev Gets the token name
* @return string representing the token name
*/
function name() public view returns (string) {
return name_;
}
/**
* @dev Gets the token symbol
* @return string representing the token symbol
*/
function symbol() public view returns (string) {
return symbol_;
}
/**
* @dev Returns an URI for a given token ID
* @dev Throws if the token ID does not exist. May return an empty string.
* @param _tokenId uint256 ID of the token to query
*/
function tokenURI(uint256 _tokenId) public view returns (string) {
require(exists(_tokenId));
return tokenURIs[_tokenId];
}
/**
* @dev Gets the token ID at a given index of the tokens list of the requested owner
* @param _owner address owning the tokens list to be accessed
* @param _index uint256 representing the index to be accessed of the requested tokens list
* @return uint256 token ID at the given index of the tokens list owned by the requested address
*/
function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256) {
require(_index < balanceOf(_owner));
return ownedTokens[_owner][_index];
}
/**
* @dev Gets the total amount of tokens stored by the contract
* @return uint256 representing the total amount of tokens
*/
function totalSupply() public view returns (uint256) {
return allTokens.length;
}
/**
* @dev Gets the token ID at a given index of all the tokens in this contract
* @dev Reverts if the index is greater or equal to the total number of tokens
* @param _index uint256 representing the index to be accessed of the tokens list
* @return uint256 token ID at the given index of the tokens list
*/
function tokenByIndex(uint256 _index) public view returns (uint256) {
require(_index < totalSupply());
return allTokens[_index];
}
/**
* @dev Internal function to set the token URI for a given token
* @dev Reverts if the token ID does not exist
* @param _tokenId uint256 ID of the token to set its URI
* @param _uri string URI to assign
*/
function _setTokenURI(uint256 _tokenId, string _uri) internal {
require(exists(_tokenId));
tokenURIs[_tokenId] = _uri;
}
/**
* @dev Internal function to add a token ID to the list of a given address
* @param _to address representing the new owner of the given token ID
* @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function addTokenTo(address _to, uint256 _tokenId) internal {
super.addTokenTo(_to, _tokenId);
uint256 length = ownedTokens[_to].length;
ownedTokens[_to].push(_tokenId);
ownedTokensIndex[_tokenId] = length;
}
/**
* @dev Internal function to remove a token ID from the list of a given address
* @param _from address representing the previous owner of the given token ID
* @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function removeTokenFrom(address _from, uint256 _tokenId) internal {
super.removeTokenFrom(_from, _tokenId);
uint256 tokenIndex = ownedTokensIndex[_tokenId];
uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
uint256 lastToken = ownedTokens[_from][lastTokenIndex];
ownedTokens[_from][tokenIndex] = lastToken;
ownedTokens[_from][lastTokenIndex] = 0;
// Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
// be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
// the lastToken to the first position, and then dropping the element placed in the last position of the list
ownedTokens[_from].length--;
ownedTokensIndex[_tokenId] = 0;
ownedTokensIndex[lastToken] = tokenIndex;
}
/**
* @dev Internal function to mint a new token
* @dev Reverts if the given token ID already exists
* @param _to address the beneficiary that will own the minted token
* @param _tokenId uint256 ID of the token to be minted by the msg.sender
*/
function _mint(address _to, uint256 _tokenId) internal {
super._mint(_to, _tokenId);
allTokensIndex[_tokenId] = allTokens.length;
allTokens.push(_tokenId);
}
/**
* @dev Internal function to burn a specific token
* @dev Reverts if the token does not exist
* @param _owner owner of the token to burn
* @param _tokenId uint256 ID of the token being burned by the msg.sender
*/
function _burn(address _owner, uint256 _tokenId) internal {
super._burn(_owner, _tokenId);
// Clear metadata (if any)
if (bytes(tokenURIs[_tokenId]).length != 0) {
delete tokenURIs[_tokenId];
}
// Reorg all tokens array
uint256 tokenIndex = allTokensIndex[_tokenId];
uint256 lastTokenIndex = allTokens.length.sub(1);
uint256 lastToken = allTokens[lastTokenIndex];
allTokens[tokenIndex] = lastToken;
allTokens[lastTokenIndex] = 0;
allTokens.length--;
allTokensIndex[_tokenId] = 0;
allTokensIndex[lastToken] = tokenIndex;
}
}

View File

@ -0,0 +1,19 @@
pragma solidity ^0.4.21;
import "./ERC721Token.sol";
import "../../ownership/Ownable.sol";
/**
* @title Mintable ERC721 Token
*/
contract MintableERC721Token is Migratable, Ownable, ERC721Token {
function initialize(address _sender, string _name, string _symbol) isInitializer("MintableERC721Token", "1.9.0") public {
Ownable.initialize(_sender);
ERC721Token.initialize(_name, _symbol);
}
function mint(address _to, uint256 _tokenId) onlyOwner public {
_mint(_to, _tokenId);
}
}

View File

@ -1,57 +0,0 @@
pragma solidity ^0.4.11;
import "./ERC20.sol";
/**
* @title LimitedTransferToken
* @dev LimitedTransferToken defines the generic interface and the implementation to limit token
* transferability for different events. It is intended to be used as a base class for other token
* contracts.
* LimitedTransferToken has been designed to allow for different limiting factors,
* this can be achieved by recursively calling super.transferableTokens() until the base class is
* hit. For example:
* function transferableTokens(address holder, uint64 time) constant public returns (uint256) {
* return min256(unlockedTokens, super.transferableTokens(holder, time));
* }
* A working example is VestedToken.sol:
* https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/VestedToken.sol
*/
contract LimitedTransferToken is ERC20 {
/**
* @dev Checks whether it can transfer or otherwise throws.
*/
modifier canTransfer(address _sender, uint _value) {
if (_value > transferableTokens(_sender, uint64(now))) throw;
_;
}
/**
* @dev Checks modifier and allows transfer if tokens are not locked.
* @param _to The address that will recieve the tokens.
* @param _value The amount of tokens to be transferred.
*/
function transfer(address _to, uint _value) canTransfer(msg.sender, _value) {
super.transfer(_to, _value);
}
/**
* @dev Checks modifier and allows transfer if tokens are not locked.
* @param _from The address that will send the tokens.
* @param _to The address that will recieve the tokens.
* @param _value The amount of tokens to be transferred.
*/
function transferFrom(address _from, address _to, uint _value) canTransfer(_from, _value) {
super.transferFrom(_from, _to, _value);
}
/**
* @dev Default transferable tokens function returns all tokens for a holder (no limit).
* @dev Overwriting transferableTokens(address holder, uint64 time) is the way to provide the
* specific logic for limiting token transferability for a holder over time.
*/
function transferableTokens(address holder, uint64 time) constant public returns (uint256) {
return balanceOf(holder);
}
}

View File

@ -1,51 +0,0 @@
pragma solidity ^0.4.11;
import './StandardToken.sol';
import '../ownership/Ownable.sol';
/**
* @title Mintable token
* @dev Simple ERC20 Token example, with mintable token creation
* @dev Issue: * https://github.com/OpenZeppelin/zeppelin-solidity/issues/120
* Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
*/
contract MintableToken is StandardToken, Ownable {
event Mint(address indexed to, uint value);
event MintFinished();
bool public mintingFinished = false;
uint public totalSupply = 0;
modifier canMint() {
if(mintingFinished) throw;
_;
}
/**
* @dev Function to mint tokens
* @param _to The address that will recieve the minted tokens.
* @param _amount The amount of tokens to mint.
* @return A boolean that indicates if the operation was successful.
*/
function mint(address _to, uint _amount) onlyOwner canMint returns (bool) {
totalSupply = totalSupply.add(_amount);
balances[_to] = balances[_to].add(_amount);
Mint(_to, _amount);
return true;
}
/**
* @dev Function to stop minting new tokens.
* @return True if the operation was successful.
*/
function finishMinting() onlyOwner returns (bool) {
mintingFinished = true;
MintFinished();
return true;
}
}

View File

@ -1,25 +0,0 @@
pragma solidity ^0.4.11;
import './StandardToken.sol';
import '../lifecycle/Pausable.sol';
/**
* Pausable token
*
* Simple ERC20 Token example, with pausable token creation
* Issue:
* https://github.com/OpenZeppelin/zeppelin-solidity/issues/194
* Based on code by BCAPtoken:
* https://github.com/BCAPtoken/BCAPToken/blob/5cb5e76338cc47343ba9268663a915337c8b268e/sol/BCAPToken.sol#L27
**/
contract PausableToken is Pausable, StandardToken {
function transfer(address _to, uint _value) whenNotPaused {
super.transfer(_to, _value);
}
function transferFrom(address _from, address _to, uint _value) whenNotPaused {
super.transferFrom(_from, _to, _value);
}
}

View File

@ -1,28 +0,0 @@
pragma solidity ^0.4.11;
import "./StandardToken.sol";
/**
* @title SimpleToken
* @dev Very simple ERC20 Token example, where all tokens are pre-assigned to the creator.
* Note they can later distribute these tokens as they wish using `transfer` and other
* `StandardToken` functions.
*/
contract SimpleToken is StandardToken {
string public name = "SimpleToken";
string public symbol = "SIM";
uint public decimals = 18;
uint public INITIAL_SUPPLY = 10000;
/**
* @dev Contructor that gives msg.sender all of existing tokens.
*/
function SimpleToken() {
totalSupply = INITIAL_SUPPLY;
balances[msg.sender] = INITIAL_SUPPLY;
}
}

View File

@ -1,65 +0,0 @@
pragma solidity ^0.4.11;
import './BasicToken.sol';
import './ERC20.sol';
/**
* @title Standard ERC20 token
*
* @dev Implemantation of the basic standart token.
* @dev https://github.com/ethereum/EIPs/issues/20
* @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
*/
contract StandardToken is BasicToken, ERC20 {
mapping (address => mapping (address => uint)) allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint the amout of tokens to be transfered
*/
function transferFrom(address _from, address _to, uint _value) onlyPayloadSize(3 * 32) {
var _allowance = allowed[_from][msg.sender];
// Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
// if (_value > _allowance) throw;
balances[_to] = balances[_to].add(_value);
balances[_from] = balances[_from].sub(_value);
allowed[_from][msg.sender] = _allowance.sub(_value);
Transfer(_from, _to, _value);
}
/**
* @dev Aprove the passed address to spend the specified amount of tokens on beahlf of msg.sender.
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
function approve(address _spender, uint _value) {
// To change the approve amount you first have to reduce the addresses`
// allowance to zero by calling `approve(_spender, 0)` if it is not
// already 0 to mitigate the race condition described here:
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
if ((_value != 0) && (allowed[msg.sender][_spender] != 0)) throw;
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
}
/**
* @dev Function to check the amount of tokens than an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint specifing the amount of tokens still avaible for the spender.
*/
function allowance(address _owner, address _spender) constant returns (uint remaining) {
return allowed[_owner][_spender];
}
}

View File

@ -1,247 +0,0 @@
pragma solidity ^0.4.11;
import "./StandardToken.sol";
import "./LimitedTransferToken.sol";
/**
* @title Vested token
* @dev Tokens that can be vested for a group of addresses.
*/
contract VestedToken is StandardToken, LimitedTransferToken {
uint256 MAX_GRANTS_PER_ADDRESS = 20;
struct TokenGrant {
address granter; // 20 bytes
uint256 value; // 32 bytes
uint64 cliff;
uint64 vesting;
uint64 start; // 3 * 8 = 24 bytes
bool revokable;
bool burnsOnRevoke; // 2 * 1 = 2 bits? or 2 bytes?
} // total 78 bytes = 3 sstore per operation (32 per sstore)
mapping (address => TokenGrant[]) public grants;
event NewTokenGrant(address indexed from, address indexed to, uint256 value, uint256 grantId);
/**
* @dev Grant tokens to a specified address
* @param _to address The address which the tokens will be granted to.
* @param _value uint256 The amount of tokens to be granted.
* @param _start uint64 Time of the beginning of the grant.
* @param _cliff uint64 Time of the cliff period.
* @param _vesting uint64 The vesting period.
*/
function grantVestedTokens(
address _to,
uint256 _value,
uint64 _start,
uint64 _cliff,
uint64 _vesting,
bool _revokable,
bool _burnsOnRevoke
) public {
// Check for date inconsistencies that may cause unexpected behavior
if (_cliff < _start || _vesting < _cliff) {
throw;
}
if (tokenGrantsCount(_to) > MAX_GRANTS_PER_ADDRESS) throw; // To prevent a user being spammed and have his balance locked (out of gas attack when calculating vesting).
uint count = grants[_to].push(
TokenGrant(
_revokable ? msg.sender : 0, // avoid storing an extra 20 bytes when it is non-revokable
_value,
_cliff,
_vesting,
_start,
_revokable,
_burnsOnRevoke
)
);
transfer(_to, _value);
NewTokenGrant(msg.sender, _to, _value, count - 1);
}
/**
* @dev Revoke the grant of tokens of a specifed address.
* @param _holder The address which will have its tokens revoked.
* @param _grantId The id of the token grant.
*/
function revokeTokenGrant(address _holder, uint _grantId) public {
TokenGrant grant = grants[_holder][_grantId];
if (!grant.revokable) { // Check if grant was revokable
throw;
}
if (grant.granter != msg.sender) { // Only granter can revoke it
throw;
}
address receiver = grant.burnsOnRevoke ? 0xdead : msg.sender;
uint256 nonVested = nonVestedTokens(grant, uint64(now));
// remove grant from array
delete grants[_holder][_grantId];
grants[_holder][_grantId] = grants[_holder][grants[_holder].length.sub(1)];
grants[_holder].length -= 1;
balances[receiver] = balances[receiver].add(nonVested);
balances[_holder] = balances[_holder].sub(nonVested);
Transfer(_holder, receiver, nonVested);
}
/**
* @dev Calculate the total amount of transferable tokens of a holder at a given time
* @param holder address The address of the holder
* @param time uint64 The specific time.
* @return An uint representing a holder's total amount of transferable tokens.
*/
function transferableTokens(address holder, uint64 time) constant public returns (uint256) {
uint256 grantIndex = tokenGrantsCount(holder);
if (grantIndex == 0) return balanceOf(holder); // shortcut for holder without grants
// Iterate through all the grants the holder has, and add all non-vested tokens
uint256 nonVested = 0;
for (uint256 i = 0; i < grantIndex; i++) {
nonVested = SafeMath.add(nonVested, nonVestedTokens(grants[holder][i], time));
}
// Balance - totalNonVested is the amount of tokens a holder can transfer at any given time
uint256 vestedTransferable = SafeMath.sub(balanceOf(holder), nonVested);
// Return the minimum of how many vested can transfer and other value
// in case there are other limiting transferability factors (default is balanceOf)
return SafeMath.min256(vestedTransferable, super.transferableTokens(holder, time));
}
/**
* @dev Check the amount of grants that an address has.
* @param _holder The holder of the grants.
* @return A uint representing the total amount of grants.
*/
function tokenGrantsCount(address _holder) constant returns (uint index) {
return grants[_holder].length;
}
/**
* @dev Calculate amount of vested tokens at a specifc time.
* @param tokens uint256 The amount of tokens grantted.
* @param time uint64 The time to be checked
* @param start uint64 A time representing the begining of the grant
* @param cliff uint64 The cliff period.
* @param vesting uint64 The vesting period.
* @return An uint representing the amount of vested tokensof a specif grant.
* transferableTokens
* | _/-------- vestedTokens rect
* | _/
* | _/
* | _/
* | _/
* | /
* | .|
* | . |
* | . |
* | . |
* | . |
* | . |
* +===+===========+---------+----------> time
* Start Clift Vesting
*/
function calculateVestedTokens(
uint256 tokens,
uint256 time,
uint256 start,
uint256 cliff,
uint256 vesting) constant returns (uint256)
{
// Shortcuts for before cliff and after vesting cases.
if (time < cliff) return 0;
if (time >= vesting) return tokens;
// Interpolate all vested tokens.
// As before cliff the shortcut returns 0, we can use just calculate a value
// in the vesting rect (as shown in above's figure)
// vestedTokens = tokens * (time - start) / (vesting - start)
uint256 vestedTokens = SafeMath.div(
SafeMath.mul(
tokens,
SafeMath.sub(time, start)
),
SafeMath.sub(vesting, start)
);
return vestedTokens;
}
/**
* @dev Get all information about a specifc grant.
* @param _holder The address which will have its tokens revoked.
* @param _grantId The id of the token grant.
* @return Returns all the values that represent a TokenGrant(address, value, start, cliff,
* revokability, burnsOnRevoke, and vesting) plus the vested value at the current time.
*/
function tokenGrant(address _holder, uint _grantId) constant returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting, bool revokable, bool burnsOnRevoke) {
TokenGrant grant = grants[_holder][_grantId];
granter = grant.granter;
value = grant.value;
start = grant.start;
cliff = grant.cliff;
vesting = grant.vesting;
revokable = grant.revokable;
burnsOnRevoke = grant.burnsOnRevoke;
vested = vestedTokens(grant, uint64(now));
}
/**
* @dev Get the amount of vested tokens at a specific time.
* @param grant TokenGrant The grant to be checked.
* @param time The time to be checked
* @return An uint representing the amount of vested tokens of a specific grant at a specific time.
*/
function vestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {
return calculateVestedTokens(
grant.value,
uint256(time),
uint256(grant.start),
uint256(grant.cliff),
uint256(grant.vesting)
);
}
/**
* @dev Calculate the amount of non vested tokens at a specific time.
* @param grant TokenGrant The grant to be checked.
* @param time uint64 The time to be checked
* @return An uint representing the amount of non vested tokens of a specifc grant on the
* passed time frame.
*/
function nonVestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {
return grant.value.sub(vestedTokens(grant, time));
}
/**
* @dev Calculate the date when the holder can trasfer all its tokens
* @param holder address The address of the holder
* @return An uint representing the date of the last transferable tokens.
*/
function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) {
date = uint64(now);
uint256 grantIndex = grants[holder].length;
for (uint256 i = 0; i < grantIndex; i++) {
date = SafeMath.max64(grants[holder][i].vesting, date);
}
}
}

View File

@ -1,20 +0,0 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SPHINXPROJ = zeppelin-solidity
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

View File

@ -1,12 +0,0 @@
BasicToken
=============================================
Simpler version of StandardToken, with no allowances
balanceOf(address _owner) constant returns (uint balance)
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Returns the token balance of the passed address.
function transfer(address _to, uint _value) returns (bool success)
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Transfers tokens from sender's account. Amount must not be greater than sender's balance.

View File

@ -1,60 +0,0 @@
Bounty
=============================================
To create a bounty for your contract, inherit from the base `Bounty` contract and provide an implementation for ```deployContract()``` returning the new contract address.::
import {Bounty, Target} from "./zeppelin/Bounty.sol";
import "./YourContract.sol";
contract YourBounty is Bounty {
function deployContract() internal returns(address) {
return new YourContract()
}
}
Next, implement invariant logic into your smart contract.
Your main contract should inherit from the Target class and implement the checkInvariant method. This is a function that should check everything your contract assumes to be true all the time. If this function returns false, it means your contract was broken in some way and is in an inconsistent state. This is what security researchers will try to acomplish when trying to get the bounty.
At contracts/YourContract.sol::
import {Bounty, Target} from "./zeppelin/Bounty.sol";
contract YourContract is Target {
function checkInvariant() returns(bool) {
// Implement your logic to make sure that none of the invariants are broken.
}
}
Next, deploy your bounty contract along with your main contract to the network.
At ```migrations/2_deploy_contracts.js```::
module.exports = function(deployer) {
deployer.deploy(YourContract);
deployer.deploy(YourBounty);
};
Next, add a reward to the bounty contract
After deploying the contract, send reward funds into the bounty contract.
From ```truffle console```::
bounty = YourBounty.deployed();
address = 0xb9f68f96cde3b895cc9f6b14b856081b41cb96f1; // your account address
reward = 5; // reward to pay to a researcher who breaks your contract
web3.eth.sendTransaction({
from: address,
to: bounty.address,
value: web3.toWei(reward, "ether")
})
If researchers break the contract, they can claim their reward.
For each researcher who wants to hack the contract and claims the reward, refer to our `Test <https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/test/Bounty.js/>`_ for the detail.
Finally, if you manage to protect your contract from security researchers, you can reclaim the bounty funds. To end the bounty, destroy the contract so that all the rewards go back to the owner.::
bounty.destroy();

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