ERC827Token.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. import EVMRevert from './helpers/EVMRevert';
  2. var Message = artifacts.require('./mock/MessageHelper.sol');
  3. var ERC827TokenMock = artifacts.require('./mock/ERC827TokenMock.sol');
  4. var BigNumber = web3.BigNumber;
  5. require('chai')
  6. .use(require('chai-as-promised'))
  7. .use(require('chai-bignumber')(BigNumber))
  8. .should();
  9. contract('ERC827 Token', function (accounts) {
  10. let token;
  11. beforeEach(async function () {
  12. token = await ERC827TokenMock.new(accounts[0], 100);
  13. });
  14. it('should return the correct totalSupply after construction', async function () {
  15. let totalSupply = await token.totalSupply();
  16. assert.equal(totalSupply, 100);
  17. });
  18. it('should return the correct allowance amount after approval', async function () {
  19. let token = await ERC827TokenMock.new();
  20. await token.approve(accounts[1], 100);
  21. let allowance = await token.allowance(accounts[0], accounts[1]);
  22. assert.equal(allowance, 100);
  23. });
  24. it('should return correct balances after transfer', async function () {
  25. await token.transfer(accounts[1], 100);
  26. let balance0 = await token.balanceOf(accounts[0]);
  27. assert.equal(balance0, 0);
  28. let balance1 = await token.balanceOf(accounts[1]);
  29. assert.equal(balance1, 100);
  30. });
  31. it('should throw an error when trying to transfer more than balance', async function () {
  32. await token.transfer(accounts[1], 101).should.be.rejectedWith(EVMRevert);
  33. });
  34. it('should return correct balances after transfering from another account', async function () {
  35. await token.approve(accounts[1], 100);
  36. await token.transferFrom(accounts[0], accounts[2], 100, { from: accounts[1] });
  37. let balance0 = await token.balanceOf(accounts[0]);
  38. assert.equal(balance0, 0);
  39. let balance1 = await token.balanceOf(accounts[2]);
  40. assert.equal(balance1, 100);
  41. let balance2 = await token.balanceOf(accounts[1]);
  42. assert.equal(balance2, 0);
  43. });
  44. it('should throw an error when trying to transfer more than allowed', async function () {
  45. await token.approve(accounts[1], 99);
  46. await token.transferFrom(
  47. accounts[0], accounts[2], 100,
  48. { from: accounts[1] }
  49. ).should.be.rejectedWith(EVMRevert);
  50. });
  51. it('should throw an error when trying to transferFrom more than _from has', async function () {
  52. let balance0 = await token.balanceOf(accounts[0]);
  53. await token.approve(accounts[1], 99);
  54. await token.transferFrom(
  55. accounts[0], accounts[2], balance0 + 1,
  56. { from: accounts[1] }
  57. ).should.be.rejectedWith(EVMRevert);
  58. });
  59. describe('validating allowance updates to spender', function () {
  60. let preApproved;
  61. it('should start with zero', async function () {
  62. preApproved = await token.allowance(accounts[0], accounts[1]);
  63. assert.equal(preApproved, 0);
  64. });
  65. it('should increase by 50 then decrease by 10', async function () {
  66. await token.increaseApproval(accounts[1], 50);
  67. let postIncrease = await token.allowance(accounts[0], accounts[1]);
  68. preApproved.plus(50).should.be.bignumber.equal(postIncrease);
  69. await token.decreaseApproval(accounts[1], 10);
  70. let postDecrease = await token.allowance(accounts[0], accounts[1]);
  71. postIncrease.minus(10).should.be.bignumber.equal(postDecrease);
  72. });
  73. });
  74. it('should increase by 50 then set to 0 when decreasing by more than 50', async function () {
  75. await token.approve(accounts[1], 50);
  76. await token.decreaseApproval(accounts[1], 60);
  77. let postDecrease = await token.allowance(accounts[0], accounts[1]);
  78. postDecrease.should.be.bignumber.equal(0);
  79. });
  80. it('should throw an error when trying to transfer to 0x0', async function () {
  81. await token.transfer(0x0, 100).should.be.rejectedWith(EVMRevert);
  82. });
  83. it('should throw an error when trying to transferFrom to 0x0', async function () {
  84. await token.approve(accounts[1], 100);
  85. await token.transferFrom(accounts[0], 0x0, 100, { from: accounts[1] })
  86. .should.be.rejectedWith(EVMRevert);
  87. });
  88. it('should return correct balances after approve and show the event on receiver contract', async function () {
  89. let message = await Message.new();
  90. let data = message.contract.showMessage.getData(
  91. web3.toHex(123456), 666, 'Transfer Done'
  92. );
  93. let transaction = await token.approveData(
  94. message.contract.address, 100, data, { from: accounts[0] }
  95. );
  96. assert.equal(2, transaction.receipt.logs.length);
  97. new BigNumber(100).should.be.bignumber.equal(
  98. await token.allowance(accounts[0], message.contract.address)
  99. );
  100. });
  101. it('should return correct balances after transferData and show the event on receiver contract', async function () {
  102. let message = await Message.new();
  103. let data = message.contract.showMessage.getData(
  104. web3.toHex(123456), 666, 'Transfer Done'
  105. );
  106. let transaction = await token.transferData(
  107. message.contract.address, 100, data, { from: accounts[0] }
  108. );
  109. assert.equal(2, transaction.receipt.logs.length);
  110. new BigNumber(100).should.be.bignumber.equal(
  111. await token.balanceOf(message.contract.address)
  112. );
  113. });
  114. it('should return correct allowance after approveData and show the event on receiver contract', async function () {
  115. let message = await Message.new();
  116. let data = message.contract.showMessage.getData(
  117. web3.toHex(123456), 666, 'Transfer Done'
  118. );
  119. let transaction = await token.approveData(
  120. message.contract.address, 100, data, { from: accounts[0] }
  121. );
  122. assert.equal(2, transaction.receipt.logs.length);
  123. new BigNumber(100).should.be.bignumber.equal(
  124. await token.allowance(accounts[0], message.contract.address)
  125. );
  126. });
  127. it('should return correct balances after transferFrom and show the event on receiver contract', async function () {
  128. let message = await Message.new();
  129. let data = message.contract.showMessage.getData(
  130. web3.toHex(123456), 666, 'Transfer Done'
  131. );
  132. await token.approve(accounts[1], 100, { from: accounts[0] });
  133. new BigNumber(100).should.be.bignumber.equal(
  134. await token.allowance(accounts[0], accounts[1])
  135. );
  136. let transaction = await token.transferDataFrom(
  137. accounts[0], message.contract.address, 100, data, { from: accounts[1] }
  138. );
  139. assert.equal(2, transaction.receipt.logs.length);
  140. new BigNumber(100).should.be.bignumber.equal(
  141. await token.balanceOf(message.contract.address)
  142. );
  143. });
  144. it('should fail inside approveData', async function () {
  145. let message = await Message.new();
  146. let data = message.contract.fail.getData();
  147. await token.approveData(
  148. message.contract.address, 10, data,
  149. { from: accounts[1] }
  150. ).should.be.rejectedWith(EVMRevert);
  151. // approval should not have gone through so allowance is still 0
  152. new BigNumber(0).should.be.bignumber
  153. .equal(await token.allowance(accounts[1], message.contract.address));
  154. });
  155. it('should fail inside transferData', async function () {
  156. let message = await Message.new();
  157. let data = message.contract.fail.getData();
  158. await token.transferData(
  159. message.contract.address, 10, data,
  160. { from: accounts[0] }
  161. ).should.be.rejectedWith(EVMRevert);
  162. // transfer should not have gone through, so balance is still 0
  163. new BigNumber(0).should.be.bignumber
  164. .equal(await token.balanceOf(message.contract.address));
  165. });
  166. it('should fail inside transferDataFrom', async function () {
  167. let message = await Message.new();
  168. let data = message.contract.fail.getData();
  169. await token.approve(accounts[1], 10, { from: accounts[2] });
  170. await token.transferDataFrom(
  171. accounts[2], message.contract.address, 10, data,
  172. { from: accounts[1] }
  173. ).should.be.rejectedWith(EVMRevert);
  174. // transferDataFrom should have failed so balance is still 0 but allowance is 10
  175. new BigNumber(10).should.be.bignumber
  176. .equal(await token.allowance(accounts[2], accounts[1]));
  177. new BigNumber(0).should.be.bignumber
  178. .equal(await token.balanceOf(message.contract.address));
  179. });
  180. it('should fail approveData when using token contract address as receiver', async function () {
  181. let data = token.contract.approve.getData(accounts[5], 66);
  182. await token.approveData(
  183. token.contract.address, 100, data,
  184. { from: accounts[0] }
  185. ).should.be.rejectedWith(EVMRevert);
  186. });
  187. it('should fail transferData when using token contract address as receiver', async function () {
  188. await token.transferData(
  189. token.contract.address, 100, web3.toHex(0), { from: accounts[0] }
  190. ).should.be.rejectedWith(EVMRevert);
  191. });
  192. it('should fail transferDataFrom when using token contract address as receiver', async function () {
  193. await token.approve(accounts[1], 1, { from: accounts[0] });
  194. await token.transferDataFrom(
  195. accounts[0], token.contract.address, 1, web3.toHex(0), { from: accounts[1] }
  196. ).should.be.rejectedWith(EVMRevert);
  197. });
  198. });