From 8c394de4504251c8c81afe224d87997d8f294378 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Thu, 27 Sep 2018 19:40:18 -0300 Subject: [PATCH 1/9] Add SignatureBouncer test for when msg.data is too short (#1360) * add test for msg.data too short * fix test to hit that branch * Update SignatureBouncer.test.js (cherry picked from commit 1a4e5346ed40e5c02f5ca75d3cdfccb694c641d9) --- contracts/mocks/SignatureBouncerMock.sol | 7 +++++++ test/drafts/SignatureBouncer.test.js | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/contracts/mocks/SignatureBouncerMock.sol b/contracts/mocks/SignatureBouncerMock.sol index 1ac00bfa2..67a39636e 100644 --- a/contracts/mocks/SignatureBouncerMock.sol +++ b/contracts/mocks/SignatureBouncerMock.sol @@ -64,4 +64,11 @@ contract SignatureBouncerMock is SignatureBouncer, SignerRoleMock { { } + + function tooShortMsgData() + public + onlyValidSignatureAndData("") + view + { + } } diff --git a/test/drafts/SignatureBouncer.test.js b/test/drafts/SignatureBouncer.test.js index b320ca98c..c234687fc 100644 --- a/test/drafts/SignatureBouncer.test.js +++ b/test/drafts/SignatureBouncer.test.js @@ -128,6 +128,12 @@ contract('SignatureBouncer', function ([_, signer, otherSigner, anyone, authoriz ) ); }); + + it('does not allow msg.data shorter than SIGNATURE_SIZE', async function () { + await assertRevert( + this.sigBouncer.tooShortMsgData({ from: authorizedUser }) + ); + }); }); }); From 08bf6bbed9332d1cb7808b93c34d0ad4b6f8b055 Mon Sep 17 00:00:00 2001 From: Leo Arias Date: Wed, 26 Sep 2018 14:36:45 -0600 Subject: [PATCH 2/9] Add missing tests to ECSDA (#1248) * fix: refactor sign.js and related tests * fix: remove unused dep * fix: update package.json correctly * Add missing tests to ECRecovery * fix lint * Reorganize the tests * Reuse signature * fix static errors * Apply suggestions by @frangion and @nventuro * Remove only * More suggestions * Remove unnecessary max-len * remove only (cherry picked from commit 75c0a59bb484eb0f04ec76eb8fa287d758af8ee5) --- test/library/ECDSA.test.js | 145 ++++++++++++++++++++++++++----------- 1 file changed, 103 insertions(+), 42 deletions(-) diff --git a/test/library/ECDSA.test.js b/test/library/ECDSA.test.js index 7fe705653..f8d333a5f 100644 --- a/test/library/ECDSA.test.js +++ b/test/library/ECDSA.test.js @@ -11,56 +11,117 @@ const WRONG_MESSAGE = web3.sha3('Nope'); contract('ECDSA', function ([_, anyone]) { beforeEach(async function () { - this.mock = await ECDSAMock.new(); + this.ecdsa = await ECDSAMock.new(); }); - it('recover v0', async function () { - // Signature generated outside ganache with method web3.eth.sign(signer, message) - const signer = '0x2cc1166f6212628a0deef2b33befb2187d35b86c'; - // eslint-disable-next-line max-len - const signature = '0x5d99b6f7f6d1f73d1a26497f2b1c89b24c0993913f86e9a2d02cd69887d9c94f3c880358579d811b21dd1b7fd9bb01c1d81d10e69f0384e675c32b39643be89200'; - (await this.mock.recover(TEST_MESSAGE, signature)).should.equal(signer); + context('recover with valid signature', function () { + context('with v0 signature', function () { + // Signature generated outside ganache with method web3.eth.sign(signer, message) + const signer = '0x2cc1166f6212628a0deef2b33befb2187d35b86c'; + // eslint-disable-next-line max-len + const signatureWithoutVersion = '0x5d99b6f7f6d1f73d1a26497f2b1c89b24c0993913f86e9a2d02cd69887d9c94f3c880358579d811b21dd1b7fd9bb01c1d81d10e69f0384e675c32b39643be892'; + + context('with 00 as version value', function () { + it('works', async function () { + const version = '00'; + const signature = signatureWithoutVersion + version; + (await this.ecdsa.recover(TEST_MESSAGE, signature)).should.equal(signer); + }); + }); + + context('with 27 as version value', function () { + it('works', async function () { + const version = '1b'; // 27 = 1b. + const signature = signatureWithoutVersion + version; + (await this.ecdsa.recover(TEST_MESSAGE, signature)).should.equal(signer); + }); + }); + + context('with wrong version', function () { + it('returns 0', async function () { + // The last two hex digits are the signature version. + // The only valid values are 0, 1, 27 and 28. + const version = '02'; + const signature = signatureWithoutVersion + version; + (await this.ecdsa.recover(TEST_MESSAGE, signature)).should.equal( + '0x0000000000000000000000000000000000000000'); + }); + }); + }); + + context('with v1 signature', function () { + const signer = '0x1e318623ab09fe6de3c9b8672098464aeda9100e'; + // eslint-disable-next-line max-len + const signatureWithoutVersion = '0x331fe75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e0'; + + context('with 01 as version value', function () { + it('works', async function () { + const version = '01'; + const signature = signatureWithoutVersion + version; + (await this.ecdsa.recover(TEST_MESSAGE, signature)).should.equal(signer); + }); + }); + + context('with 28 signature', function () { + it('works', async function () { + const version = '1c'; // 28 = 1c. + const signature = signatureWithoutVersion + version; + (await this.ecdsa.recover(TEST_MESSAGE, signature)).should.equal(signer); + }); + }); + + context('with wrong version', function () { + it('returns 0', async function () { + // The last two hex digits are the signature version. + // The only valid values are 0, 1, 27 and 28. + const version = '02'; + const signature = signatureWithoutVersion + version; + (await this.ecdsa.recover(TEST_MESSAGE, signature)).should.equal( + '0x0000000000000000000000000000000000000000'); + }); + }); + }); + + context('using web3.eth.sign', function () { + context('with correct signature', function () { + it('returns signer address', async function () { + // Create the signature + const signature = signMessage(anyone, TEST_MESSAGE); + + // Recover the signer address from the generated message and signature. + (await this.ecdsa.recover( + toEthSignedMessageHash(TEST_MESSAGE), + signature + )).should.equal(anyone); + }); + }); + + context('with wrong signature', function () { + it('does not return signer address', async function () { + // Create the signature + const signature = signMessage(anyone, TEST_MESSAGE); + + // Recover the signer address from the generated message and wrong signature. + (await this.ecdsa.recover(WRONG_MESSAGE, signature)).should.not.equal(anyone); + }); + }); + }); }); - it('recover v1', async function () { - // Signature generated outside ganache with method web3.eth.sign(signer, message) - const signer = '0x1e318623ab09fe6de3c9b8672098464aeda9100e'; - // eslint-disable-next-line max-len - const signature = '0x331fe75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e001'; - (await this.mock.recover(TEST_MESSAGE, signature)).should.equal(signer); - }); - - it('recover using web3.eth.sign()', async function () { - // Create the signature - const signature = signMessage(anyone, TEST_MESSAGE); - - // Recover the signer address from the generated message and signature. - (await this.mock.recover( - toEthSignedMessageHash(TEST_MESSAGE), - signature - )).should.equal(anyone); - }); - - it('recover using web3.eth.sign() should return wrong signer', async function () { - // Create the signature - const signature = signMessage(anyone, TEST_MESSAGE); - - // Recover the signer address from the generated message and wrong signature. - (await this.mock.recover(WRONG_MESSAGE, signature)).should.not.equal(anyone); - }); - - // @TODO - remove `skip` once we upgrade to solc^0.5 - it.skip('recover should revert when a small hash is sent', async function () { - // Create the signature - const signature = signMessage(anyone, TEST_MESSAGE); - await expectThrow( - this.mock.recover(TEST_MESSAGE.substring(2), signature) - ); + context('with small hash', function () { + // @TODO - remove `skip` once we upgrade to solc^0.5 + it.skip('reverts', async function () { + // Create the signature + const signature = signMessage(anyone, TEST_MESSAGE); + await expectThrow( + this.ecdsa.recover(TEST_MESSAGE.substring(2), signature) + ); + }); }); context('toEthSignedMessage', function () { it('should prefix hashes correctly', async function () { - (await this.mock.toEthSignedMessageHash(TEST_MESSAGE)).should.equal(toEthSignedMessageHash(TEST_MESSAGE)); + (await this.ecdsa.toEthSignedMessageHash(TEST_MESSAGE)).should.equal(toEthSignedMessageHash(TEST_MESSAGE)); }); }); }); From 76169cda400d34cb3b44415630cfa7bfd1bd5939 Mon Sep 17 00:00:00 2001 From: dwardu Date: Tue, 11 Sep 2018 17:32:05 +0200 Subject: [PATCH 3/9] Fixed a broken payment test (+ another small fix) (#1318) * Fixed a broken payment test * In PR template, npm run lint:fix, not lint:all:fix * In SplitPayment test, replaced an await-in-loop with Promise.all (cherry picked from commit b79196f911d013e1d3930e395cc5646917992cc3) --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- test/payment/SplitPayment.test.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c32ba08f2..72b331668 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -14,4 +14,4 @@ Fixes # - [ ] 📘 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`). +- [ ] 🎨 I've run the JS/Solidity linters and fixed any issues (`npm run lint:fix`). diff --git a/test/payment/SplitPayment.test.js b/test/payment/SplitPayment.test.js index 788296016..05cc0b701 100644 --- a/test/payment/SplitPayment.test.js +++ b/test/payment/SplitPayment.test.js @@ -51,10 +51,10 @@ contract('SplitPayment', function ([_, owner, payee1, payee2, payee3, nonpayee1, }); it('should have payees', async function () { - this.payees.forEach(async (payee, index) => { - (await this.payee(index)).should.be.equal(payee); + await Promise.all(this.payees.map(async (payee, index) => { + (await this.contract.payee(index)).should.be.equal(payee); (await this.contract.released(payee)).should.be.bignumber.equal(0); - }); + })); }); it('should accept payments', async function () { From bd8345a153a897b6614f80b06af1bd4c692cda5e Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Thu, 4 Oct 2018 11:10:08 -0300 Subject: [PATCH 4/9] Separate ERC721Mintable (#1365) * separate part of ERC721Mintable into ERC721MetadataMintable * remove mint and burn from 721 tests * Fixed linter error. * fix ERC721 mint tests * Minor fixes. (cherry picked from commit 744f567f40bcd31f821a35d2a9a004602e28a1e9) --- contracts/mocks/ERC721FullMock.sol | 7 ++-- .../mocks/ERC721MintableBurnableImpl.sol | 3 +- .../token/ERC721/ERC721MetadataMintable.sol | 32 +++++++++++++++++++ contracts/token/ERC721/ERC721Mintable.sol | 18 ++--------- test/token/ERC721/ERC721Full.test.js | 2 -- test/token/ERC721/ERC721MintBurn.behavior.js | 4 +-- 6 files changed, 43 insertions(+), 23 deletions(-) create mode 100644 contracts/token/ERC721/ERC721MetadataMintable.sol diff --git a/contracts/mocks/ERC721FullMock.sol b/contracts/mocks/ERC721FullMock.sol index e3f79b08f..49f4e31b7 100644 --- a/contracts/mocks/ERC721FullMock.sol +++ b/contracts/mocks/ERC721FullMock.sol @@ -2,15 +2,18 @@ pragma solidity ^0.4.24; import "../token/ERC721/ERC721Full.sol"; import "../token/ERC721/ERC721Mintable.sol"; +import "../token/ERC721/ERC721MetadataMintable.sol"; import "../token/ERC721/ERC721Burnable.sol"; /** - * @title ERC721Mock + * @title ERC721FullMock * This mock just provides a public mint and burn functions for testing purposes, * and a public setter for metadata URI */ -contract ERC721FullMock is ERC721Full, ERC721Mintable, ERC721Burnable { +contract ERC721FullMock + is ERC721Full, ERC721Mintable, ERC721MetadataMintable, ERC721Burnable { + constructor(string name, string symbol) public ERC721Mintable() ERC721Full(name, symbol) diff --git a/contracts/mocks/ERC721MintableBurnableImpl.sol b/contracts/mocks/ERC721MintableBurnableImpl.sol index 4d3c962d8..eb328afa2 100644 --- a/contracts/mocks/ERC721MintableBurnableImpl.sol +++ b/contracts/mocks/ERC721MintableBurnableImpl.sol @@ -2,6 +2,7 @@ pragma solidity ^0.4.24; import "../token/ERC721/ERC721Full.sol"; import "../token/ERC721/ERC721Mintable.sol"; +import "../token/ERC721/ERC721MetadataMintable.sol"; import "../token/ERC721/ERC721Burnable.sol"; @@ -9,7 +10,7 @@ import "../token/ERC721/ERC721Burnable.sol"; * @title ERC721MintableBurnableImpl */ contract ERC721MintableBurnableImpl - is ERC721Full, ERC721Mintable, ERC721Burnable { + is ERC721Full, ERC721Mintable, ERC721MetadataMintable, ERC721Burnable { constructor() ERC721Mintable() diff --git a/contracts/token/ERC721/ERC721MetadataMintable.sol b/contracts/token/ERC721/ERC721MetadataMintable.sol new file mode 100644 index 000000000..95a9f2124 --- /dev/null +++ b/contracts/token/ERC721/ERC721MetadataMintable.sol @@ -0,0 +1,32 @@ +pragma solidity ^0.4.24; + +import "./ERC721Metadata.sol"; +import "../../access/roles/MinterRole.sol"; + + +/** + * @title ERC721MetadataMintable + * @dev ERC721 minting logic with metadata + */ +contract ERC721MetadataMintable is ERC721, ERC721Metadata, MinterRole { + /** + * @dev Function to mint tokens + * @param to The address that will receive the minted tokens. + * @param tokenId The token id to mint. + * @param tokenURI The token URI of the minted token. + * @return A boolean that indicates if the operation was successful. + */ + function mintWithTokenURI( + address to, + uint256 tokenId, + string tokenURI + ) + public + onlyMinter + returns (bool) + { + _mint(to, tokenId); + _setTokenURI(tokenId, tokenURI); + return true; + } +} diff --git a/contracts/token/ERC721/ERC721Mintable.sol b/contracts/token/ERC721/ERC721Mintable.sol index 3d17c0bc2..b7928a903 100644 --- a/contracts/token/ERC721/ERC721Mintable.sol +++ b/contracts/token/ERC721/ERC721Mintable.sol @@ -1,6 +1,6 @@ pragma solidity ^0.4.24; -import "./ERC721Full.sol"; +import "./ERC721.sol"; import "../../access/roles/MinterRole.sol"; @@ -8,7 +8,7 @@ import "../../access/roles/MinterRole.sol"; * @title ERC721Mintable * @dev ERC721 minting logic */ -contract ERC721Mintable is ERC721Full, MinterRole { +contract ERC721Mintable is ERC721, MinterRole { /** * @dev Function to mint tokens * @param to The address that will receive the minted tokens. @@ -26,18 +26,4 @@ contract ERC721Mintable is ERC721Full, MinterRole { _mint(to, tokenId); return true; } - - function mintWithTokenURI( - address to, - uint256 tokenId, - string tokenURI - ) - public - onlyMinter - returns (bool) - { - mint(to, tokenId); - _setTokenURI(tokenId, tokenURI); - return true; - } } diff --git a/test/token/ERC721/ERC721Full.test.js b/test/token/ERC721/ERC721Full.test.js index ce8e915fa..ef3f67bc8 100644 --- a/test/token/ERC721/ERC721Full.test.js +++ b/test/token/ERC721/ERC721Full.test.js @@ -1,6 +1,5 @@ const { assertRevert } = require('../../helpers/assertRevert'); const { shouldBehaveLikeERC721 } = require('./ERC721.behavior'); -const { shouldBehaveLikeMintAndBurnERC721 } = require('./ERC721MintBurn.behavior'); const { shouldSupportInterfaces } = require('../../introspection/SupportsInterface.behavior'); const _ = require('lodash'); @@ -217,7 +216,6 @@ contract('ERC721Full', function ([ }); shouldBehaveLikeERC721(creator, minter, accounts); - shouldBehaveLikeMintAndBurnERC721(creator, minter, accounts); shouldSupportInterfaces([ 'ERC165', diff --git a/test/token/ERC721/ERC721MintBurn.behavior.js b/test/token/ERC721/ERC721MintBurn.behavior.js index 31db1d176..ab54a6ae6 100644 --- a/test/token/ERC721/ERC721MintBurn.behavior.js +++ b/test/token/ERC721/ERC721MintBurn.behavior.js @@ -52,13 +52,13 @@ function shouldBehaveLikeMintAndBurnERC721 ( describe('when the given owner address is the zero address', function () { it('reverts', async function () { - await assertRevert(this.token.mint(ZERO_ADDRESS, thirdTokenId)); + await assertRevert(this.token.mint(ZERO_ADDRESS, thirdTokenId, { from: minter })); }); }); describe('when the given token ID was already tracked by this contract', function () { it('reverts', async function () { - await assertRevert(this.token.mint(owner, firstTokenId)); + await assertRevert(this.token.mint(owner, firstTokenId, { from: minter })); }); }); }); From 7c984968d8e734a6e640847f32da03b54c503062 Mon Sep 17 00:00:00 2001 From: Aniket <30843294+Aniket-Engg@users.noreply.github.com> Date: Wed, 3 Oct 2018 21:20:01 +0530 Subject: [PATCH 5/9] Prevents Bounty from being claimed twice (#1374) * signing prefix added * Minor improvement * Tests changed * Successfully tested * Minor improvements * Minor improvements * Revert "Dangling commas are now required. (#1359)" This reverts commit a6889776f46adca374b6ebf014aa7b0038112a9d. * updates * fixes #1356 * Removed extra semicolon. (cherry picked from commit c87433e0c242f922d37d28710ced32584b561234) --- contracts/drafts/BreakInvariantBounty.sol | 1 + test/drafts/BreakInvariantBounty.test.js | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/contracts/drafts/BreakInvariantBounty.sol b/contracts/drafts/BreakInvariantBounty.sol index 58d725980..51ea06a06 100644 --- a/contracts/drafts/BreakInvariantBounty.sol +++ b/contracts/drafts/BreakInvariantBounty.sol @@ -47,6 +47,7 @@ contract BreakInvariantBounty is PullPayment, Ownable { * @param target contract */ function claim(Target target) public { + require(!_claimed); address researcher = _researchers[target]; require(researcher != address(0)); // Check Target contract invariants diff --git a/test/drafts/BreakInvariantBounty.test.js b/test/drafts/BreakInvariantBounty.test.js index d80bca92a..037ff53ef 100644 --- a/test/drafts/BreakInvariantBounty.test.js +++ b/test/drafts/BreakInvariantBounty.test.js @@ -92,6 +92,10 @@ contract('BreakInvariantBounty', function ([_, owner, researcher, anyone, nonTar it('no longer accepts rewards', async function () { await assertRevert(ethSendTransaction({ from: owner, to: this.bounty.address, value: reward })); }); + + it('reverts when reclaimed', async function () { + await assertRevert(this.bounty.claim(this.target.address, { from: researcher })); + }); }); }); }); From 38ca422170af45279993182d76a595f641244101 Mon Sep 17 00:00:00 2001 From: Aniket <30843294+Aniket-Engg@users.noreply.github.com> Date: Wed, 3 Oct 2018 20:53:08 +0530 Subject: [PATCH 6/9] Removing unrequired `_burn()` override (#1373) * signing prefix added * Minor improvement * Tests changed * Successfully tested * Minor improvements * Minor improvements * Revert "Dangling commas are now required. (#1359)" This reverts commit a6889776f46adca374b6ebf014aa7b0038112a9d. * updates * fixes #1371 * Removed extra whitespace (cherry picked from commit f3888bb0b0a2eba5282a1bd5828135910b65bc8d) --- contracts/token/ERC20/ERC20Burnable.sol | 8 -------- 1 file changed, 8 deletions(-) diff --git a/contracts/token/ERC20/ERC20Burnable.sol b/contracts/token/ERC20/ERC20Burnable.sol index e49d5de2c..658068d87 100644 --- a/contracts/token/ERC20/ERC20Burnable.sol +++ b/contracts/token/ERC20/ERC20Burnable.sol @@ -25,12 +25,4 @@ contract ERC20Burnable is ERC20 { function burnFrom(address from, uint256 value) public { _burnFrom(from, value); } - - /** - * @dev Overrides ERC20._burn in order for burn and burnFrom to emit - * an additional Burn event. - */ - function _burn(address who, uint256 value) internal { - super._burn(who, value); - } } From ffeae0d83e84512d06f87d01c81ebc97e683dc14 Mon Sep 17 00:00:00 2001 From: Anton Bukov Date: Wed, 3 Oct 2018 00:15:59 +0300 Subject: [PATCH 7/9] ERC20 internal transfer method (#1370) (cherry picked from commit 43ebb4fc433979d19c4cbec4aa0c25e0e3e9e5f7) --- contracts/token/ERC20/ERC20.sol | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/contracts/token/ERC20/ERC20.sol b/contracts/token/ERC20/ERC20.sol index d1f3094d4..22b7df3c5 100644 --- a/contracts/token/ERC20/ERC20.sol +++ b/contracts/token/ERC20/ERC20.sol @@ -59,12 +59,7 @@ contract ERC20 is IERC20 { * @param value The amount to be transferred. */ function transfer(address to, uint256 value) public returns (bool) { - require(value <= _balances[msg.sender]); - require(to != address(0)); - - _balances[msg.sender] = _balances[msg.sender].sub(value); - _balances[to] = _balances[to].add(value); - emit Transfer(msg.sender, to, value); + _transfer(msg.sender, to, value); return true; } @@ -99,14 +94,10 @@ contract ERC20 is IERC20 { public returns (bool) { - require(value <= _balances[from]); require(value <= _allowed[from][msg.sender]); - require(to != address(0)); - _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); + _transfer(from, to, value); return true; } @@ -158,6 +149,21 @@ contract ERC20 is IERC20 { return true; } + /** + * @dev Transfer token for a specified addresses + * @param from The address to transfer from. + * @param to The address to transfer to. + * @param value The amount to be transferred. + */ + function _transfer(address from, address to, uint256 value) internal { + require(value <= _balances[from]); + require(to != address(0)); + + _balances[from] = _balances[from].sub(value); + _balances[to] = _balances[to].add(value); + emit Transfer(from, to, value); + } + /** * @dev Internal function that mints an amount of the token and assigns it to * an account. This encapsulates the modification of balances such that the From 0db1f8144d3e58cbab1159cc3cae15aefeab4a38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Venturo?= Date: Thu, 4 Oct 2018 11:15:22 -0300 Subject: [PATCH 8/9] Removed unnecessary Secondary inheritance from RefundEscrow. (#1381) (cherry picked from commit 308e5e9cc0bc9a65436cf3ae933551e1a62167ea) --- contracts/payment/RefundEscrow.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/payment/RefundEscrow.sol b/contracts/payment/RefundEscrow.sol index ae7f9c463..acad2ba3c 100644 --- a/contracts/payment/RefundEscrow.sol +++ b/contracts/payment/RefundEscrow.sol @@ -1,7 +1,6 @@ pragma solidity ^0.4.24; import "./ConditionalEscrow.sol"; -import "../ownership/Secondary.sol"; /** @@ -10,7 +9,7 @@ import "../ownership/Secondary.sol"; * The primary account may close the deposit period, and allow for either withdrawal * by the beneficiary, or refunds to the depositors. */ -contract RefundEscrow is Secondary, ConditionalEscrow { +contract RefundEscrow is ConditionalEscrow { enum State { Active, Refunding, Closed } event Closed(); From 2d30918149c1d61da3cf52d20f2381574b80cf33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Venturo?= Date: Thu, 4 Oct 2018 11:17:57 -0300 Subject: [PATCH 9/9] Release candidate v2.0.0-rc.3 --- ethpm.json | 2 +- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ethpm.json b/ethpm.json index f47982ffa..ced48af3d 100644 --- a/ethpm.json +++ b/ethpm.json @@ -1,6 +1,6 @@ { "package_name": "zeppelin", - "version": "2.0.0-rc.2", + "version": "2.0.0-rc.3", "description": "Secure Smart Contract library for Solidity", "authors": [ "OpenZeppelin Community " diff --git a/package-lock.json b/package-lock.json index 254a0e369..bcdabbce1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "openzeppelin-solidity", - "version": "2.0.0-rc.2", + "version": "2.0.0-rc.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fda5f1342..55697d8e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openzeppelin-solidity", - "version": "2.0.0-rc.2", + "version": "2.0.0-rc.3", "description": "Secure Smart Contract library for Solidity", "files": [ "build",