From afe930d060a82f12603a60699bbc4506ad4fb5ec Mon Sep 17 00:00:00 2001 From: Tadej Vengust Date: Thu, 12 Apr 2018 10:54:18 +0200 Subject: [PATCH] Rename of SettableTransferXcert to PausableXcert. --- contracts/mocks/XcertMock.sol | 6 +-- contracts/tokens/PausableXcert.sol | 53 ++++++++++++++++++++++ contracts/tokens/SettableTransferXcert.sol | 53 ---------------------- contracts/utils/Selector.sol | 8 ++-- test/mocks/XcertMock.sol | 17 ------- test/tokens/PausableXcert.test.js | 45 ++++++++++++++++++ test/tokens/SettableTransferXcert.test.js | 45 ------------------ test/tokens/XcertMock.test.js | 2 +- test/utils/Selector.test.js | 8 ++-- 9 files changed, 110 insertions(+), 127 deletions(-) create mode 100644 contracts/tokens/PausableXcert.sol delete mode 100644 contracts/tokens/SettableTransferXcert.sol delete mode 100644 test/mocks/XcertMock.sol create mode 100644 test/tokens/PausableXcert.test.js delete mode 100644 test/tokens/SettableTransferXcert.test.js diff --git a/contracts/mocks/XcertMock.sol b/contracts/mocks/XcertMock.sol index b722e58..29f9761 100644 --- a/contracts/mocks/XcertMock.sol +++ b/contracts/mocks/XcertMock.sol @@ -1,14 +1,14 @@ pragma solidity ^0.4.19; import "../../contracts/tokens/BurnableXcert.sol"; -import "../../contracts/tokens/SettableTransferXcert.sol"; +import "../../contracts/tokens/PausableXcert.sol"; import "../../contracts/tokens/ChainableXcert.sol"; -contract XcertMock is BurnableXcert, SettableTransferXcert, ChainableXcert { +contract XcertMock is BurnableXcert, PausableXcert, ChainableXcert { function XcertMock(string _name, string _symbol) BurnableXcert(_name, _symbol) - SettableTransferXcert(_name, _symbol) + PausableXcert(_name, _symbol) ChainableXcert(_name, _symbol) public { diff --git a/contracts/tokens/PausableXcert.sol b/contracts/tokens/PausableXcert.sol new file mode 100644 index 0000000..e6eb22d --- /dev/null +++ b/contracts/tokens/PausableXcert.sol @@ -0,0 +1,53 @@ +pragma solidity ^0.4.19; + +import "./Xcert.sol"; + +contract PausableXcert is Xcert { + + /* + * @dev This emits when ability of beeing able to transfer NFTokens changes (paused/unpaused). + */ + event IsPaused(bool _isPaused); + + /* + * @dev Are NFTokens paused or not. + */ + bool public isPaused; + + function PausableXcert(string _name, string _symbol) + Xcert(_name, _symbol) + public + { + supportedInterfaces[0xbedb86fb] = true; // PausableXcert + isPaused = false; + } + + /* + * @dev Guarantees that the msg.sender is allowed to transfer NFToken. + * @param _tokenId ID of the NFToken to transfer. + */ + modifier canTransfer(uint256 _tokenId) { + address owner = idToOwner[_tokenId]; + require(!isPaused && ( + owner == msg.sender + || getApproved(_tokenId) == msg.sender + || ownerToOperators[owner][msg.sender]) + ); + + _; + } + + /* + * @dev Sets if NFTokens are paused or not. + * @param _isPaused Pause status. + */ + function setPause(bool _isPaused) + external + onlyOwner + { + require(isPaused != _isPaused); + isPaused = _isPaused; + IsPaused(_isPaused); + } + +} \ No newline at end of file diff --git a/contracts/tokens/SettableTransferXcert.sol b/contracts/tokens/SettableTransferXcert.sol deleted file mode 100644 index 93823d8..0000000 --- a/contracts/tokens/SettableTransferXcert.sol +++ /dev/null @@ -1,53 +0,0 @@ -pragma solidity ^0.4.19; - -import "./Xcert.sol"; - -contract SettableTransferXcert is Xcert { - - /* - * @dev This emits when ability of beeing able to transfer NFTokens changes. - */ - event TransferStatusChange(bool _isTransferable); - - /* - * @dev Are NFTokens transferable or not. - */ - bool public isTransferable; - - function SettableTransferXcert(string _name, string _symbol) - Xcert(_name, _symbol) - public - { - supportedInterfaces[0x9cd23707] = true; // SettableTransferXcert - isTransferable = true; - } - - /* - * @dev Guarantees that the msg.sender is allowed to transfer NFToken. - * @param _tokenId ID of the NFToken to transfer. - */ - modifier canTransfer(uint256 _tokenId) { - address owner = idToOwner[_tokenId]; - require(isTransferable && ( - owner == msg.sender - || getApproved(_tokenId) == msg.sender - || ownerToOperators[owner][msg.sender]) - ); - - _; - } - - /* - * @dev Sets if NFTokens are transferable or not. - * @param _isTransferable Transferable status. - */ - function setTransferable(bool _isTransferable) - external - onlyOwner - { - require(isTransferable != _isTransferable); - isTransferable = _isTransferable; - TransferStatusChange(_isTransferable); - } - -} \ No newline at end of file diff --git a/contracts/utils/Selector.sol b/contracts/utils/Selector.sol index 706188c..8752e61 100644 --- a/contracts/utils/Selector.sol +++ b/contracts/utils/Selector.sol @@ -2,7 +2,7 @@ pragma solidity ^0.4.19; import "../tokens/Xcert.sol"; import "../tokens/BurnableXcert.sol"; -import "../tokens/SettableTransferXcert.sol"; +import "../tokens/PausableXcert.sol"; import "../tokens/ChainableXcert.sol"; import "../protocol/Minter.sol"; import "../protocol/Trader.sol"; @@ -23,9 +23,9 @@ contract Selector { return i.burn.selector; } - function calculateSettableTransferXcertSelector() public pure returns (bytes4) { - SettableTransferXcert i; - return i.setTransferable.selector; + function calculatePausableXcertSelector() public pure returns (bytes4) { + PausableXcert i; + return i.setPause.selector; } function calculateChainableXcertSelector() public pure returns (bytes4) { diff --git a/test/mocks/XcertMock.sol b/test/mocks/XcertMock.sol deleted file mode 100644 index b722e58..0000000 --- a/test/mocks/XcertMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -pragma solidity ^0.4.19; - -import "../../contracts/tokens/BurnableXcert.sol"; -import "../../contracts/tokens/SettableTransferXcert.sol"; -import "../../contracts/tokens/ChainableXcert.sol"; - -contract XcertMock is BurnableXcert, SettableTransferXcert, ChainableXcert { - -function XcertMock(string _name, string _symbol) - BurnableXcert(_name, _symbol) - SettableTransferXcert(_name, _symbol) - ChainableXcert(_name, _symbol) - public - { - - } -} \ No newline at end of file diff --git a/test/tokens/PausableXcert.test.js b/test/tokens/PausableXcert.test.js new file mode 100644 index 0000000..78b54c7 --- /dev/null +++ b/test/tokens/PausableXcert.test.js @@ -0,0 +1,45 @@ +const PausableXcert = artifacts.require('PausableXcert'); +const util = require('ethjs-util'); +const assertRevert = require('../helpers/assertRevert'); + +contract('PausableXcert', (accounts) => { + let xcert; + let id1 = web3.sha3('test1'); + let id2 = web3.sha3('test2'); + let id3 = web3.sha3('test3'); + let id4 = web3.sha3('test4'); + let mockProof = "1e205550c271490347e5e2393a02e94d284bbe9903f023ba098355b8d75974c8"; + + beforeEach(async function () { + xcert = await PausableXcert.new('Foo', 'F'); + }); + + it('correctly sets pause state', async () => { + var { logs } = await xcert.setPause(true); + let isPausedEvent = logs.find(e => e.event === 'IsPaused'); + assert.notEqual(isPausedEvent, undefined); + var pauseState = await xcert.isPaused(); + assert.equal(pauseState, true); + }); + + it('reverts trying to set the same pause state', async () => { + await assertRevert(xcert.setPause(false)); + }); + + it('reverts when someone else then the owner tries to change pause state', async () => { + await assertRevert(xcert.setPause(true, {from: accounts[1]})); + }); + + it('succefully transfers when token is not paused', async () => { + await xcert.mint(accounts[0], id1, mockProof, 'url1'); + await xcert.transferFrom(accounts[0], accounts[1], id1); + var owner = await xcert.ownerOf(id1); + assert.equal(owner, accounts[1]); + }); + + it('reverts trying to transfer when token is paused', async () => { + await xcert.mint(accounts[0], id1, mockProof, 'url1'); + await xcert.setPause(true); + await assertRevert(xcert.transferFrom(accounts[0], accounts[1], id1)); + }); +}); diff --git a/test/tokens/SettableTransferXcert.test.js b/test/tokens/SettableTransferXcert.test.js deleted file mode 100644 index 36a823a..0000000 --- a/test/tokens/SettableTransferXcert.test.js +++ /dev/null @@ -1,45 +0,0 @@ -const SettableTransferXcert = artifacts.require('SettableTransferXcert'); -const util = require('ethjs-util'); -const assertRevert = require('../helpers/assertRevert'); - -contract('SettableTransferXcert', (accounts) => { - let xcert; - let id1 = web3.sha3('test1'); - let id2 = web3.sha3('test2'); - let id3 = web3.sha3('test3'); - let id4 = web3.sha3('test4'); - let mockProof = "1e205550c271490347e5e2393a02e94d284bbe9903f023ba098355b8d75974c8"; - - beforeEach(async function () { - xcert = await SettableTransferXcert.new('Foo', 'F'); - }); - - it('correctly sets transfer status', async () => { - var { logs } = await xcert.setTransferable(false); - let transferStatusChangeEvent = logs.find(e => e.event === 'TransferStatusChange'); - assert.notEqual(transferStatusChangeEvent, undefined); - var transferState = await xcert.isTransferable(); - assert.equal(transferState, false); - }); - - it('reverts trying to set the same transferState', async () => { - await assertRevert(xcert.setTransferable(true)); - }); - - it('reverts when someone else then the owner tries to change transfer state', async () => { - await assertRevert(xcert.setTransferable(false, {from: accounts[1]})); - }); - - it('succefully transfers when transfers are enabled', async () => { - await xcert.mint(accounts[0], id1, mockProof, 'url1'); - await xcert.transferFrom(accounts[0], accounts[1], id1); - var owner = await xcert.ownerOf(id1); - assert.equal(owner, accounts[1]); - }); - - it('reverts trying to transfer when transfers are disabled', async () => { - await xcert.mint(accounts[0], id1, mockProof, 'url1'); - await xcert.setTransferable(false); - await assertRevert(xcert.transferFrom(accounts[0], accounts[1], id1)); - }); -}); diff --git a/test/tokens/XcertMock.test.js b/test/tokens/XcertMock.test.js index 500f6ea..7ec3b94 100644 --- a/test/tokens/XcertMock.test.js +++ b/test/tokens/XcertMock.test.js @@ -23,7 +23,7 @@ contract('XcertMock', (accounts) => { }); it('reverts trying to transfer when transfers are disabled', async () => { - await xcert.setTransferable(false); + await xcert.setPause(true); await assertRevert(xcert.transferFrom(accounts[0], accounts[1], id1)); }); diff --git a/test/utils/Selector.test.js b/test/utils/Selector.test.js index f986679..0b164bb 100644 --- a/test/utils/Selector.test.js +++ b/test/utils/Selector.test.js @@ -1,7 +1,7 @@ const Xcert = artifacts.require('Xcert'); const BurnableXcert = artifacts.require('BurnableXcert'); const ChainableXcert = artifacts.require('ChainableXcert'); -const SettableTransferXcert = artifacts.require('SettableTransferXcert'); +const PausableXcert = artifacts.require('PausableXcert'); const Minter = artifacts.require('Minter'); const Trader = artifacts.require('Trader'); const Swapper = artifacts.require('Swapper'); @@ -29,9 +29,9 @@ contract('Selector', (accounts) => { assert.equal(supports, true); }); - it('Checks SettableTransferXcert selector', async () => { - var xcert = await SettableTransferXcert.new('Foo', 'F'); - var bytes = await selector.calculateSettableTransferXcertSelector(); + it('Checks PausableXcert selector', async () => { + var xcert = await PausableXcert.new('Foo', 'F'); + var bytes = await selector.calculatePausableXcertSelector(); var supports = await xcert.supportsInterface(bytes); assert.equal(supports, true); });