Heritable.test.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. const { increaseTime } = require('./helpers/increaseTime');
  2. const { expectThrow } = require('./helpers/expectThrow');
  3. const { assertRevert } = require('./helpers/assertRevert');
  4. const NULL_ADDRESS = '0x0000000000000000000000000000000000000000';
  5. const Heritable = artifacts.require('Heritable');
  6. const BigNumber = web3.BigNumber;
  7. require('chai')
  8. .use(require('chai-bignumber')(BigNumber))
  9. .should();
  10. contract('Heritable', function ([_, owner, heir, anyone]) {
  11. const heartbeatTimeout = 4141;
  12. let heritable;
  13. beforeEach(async function () {
  14. heritable = await Heritable.new(heartbeatTimeout, { from: owner });
  15. });
  16. it('should start off with an owner, but without heir', async function () {
  17. const heir = await heritable.heir();
  18. owner.should.be.a('string').that.is.not.equal(NULL_ADDRESS);
  19. heir.should.be.a('string').that.is.equal(NULL_ADDRESS);
  20. });
  21. it('only owner should set heir', async function () {
  22. await heritable.setHeir(heir, { from: owner });
  23. await expectThrow(heritable.setHeir(heir, { from: anyone }));
  24. });
  25. it('owner can\'t be heir', async function () {
  26. await assertRevert(heritable.setHeir(owner, { from: owner }));
  27. });
  28. it('owner can remove heir', async function () {
  29. await heritable.setHeir(heir, { from: owner });
  30. (await heritable.heir()).should.eq(heir);
  31. await heritable.removeHeir({ from: owner });
  32. (await heritable.heir()).should.eq(NULL_ADDRESS);
  33. });
  34. it('heir can claim ownership only if owner is dead and timeout was reached', async function () {
  35. await heritable.setHeir(heir, { from: owner });
  36. await expectThrow(heritable.claimHeirOwnership({ from: heir }));
  37. await heritable.proclaimDeath({ from: heir });
  38. await increaseTime(1);
  39. await expectThrow(heritable.claimHeirOwnership({ from: heir }));
  40. await increaseTime(heartbeatTimeout);
  41. await heritable.claimHeirOwnership({ from: heir });
  42. (await heritable.heir()).should.eq(heir);
  43. });
  44. it('only heir can proclaim death', async function () {
  45. await assertRevert(heritable.proclaimDeath({ from: owner }));
  46. await assertRevert(heritable.proclaimDeath({ from: anyone }));
  47. });
  48. it('heir can\'t proclaim death if owner is death', async function () {
  49. await heritable.setHeir(heir, { from: owner });
  50. await heritable.proclaimDeath({ from: heir });
  51. await assertRevert(heritable.proclaimDeath({ from: heir }));
  52. });
  53. it('heir can\'t claim ownership if owner heartbeats', async function () {
  54. await heritable.setHeir(heir, { from: owner });
  55. await heritable.proclaimDeath({ from: heir });
  56. await heritable.heartbeat({ from: owner });
  57. await expectThrow(heritable.claimHeirOwnership({ from: heir }));
  58. await heritable.proclaimDeath({ from: heir });
  59. await increaseTime(heartbeatTimeout);
  60. await heritable.heartbeat({ from: owner });
  61. await expectThrow(heritable.claimHeirOwnership({ from: heir }));
  62. });
  63. it('should log events appropriately', async function () {
  64. const setHeirLogs = (await heritable.setHeir(heir, { from: owner })).logs;
  65. const setHeirEvent = setHeirLogs.find(e => e.event === 'HeirChanged');
  66. setHeirEvent.args.owner.should.eq(owner);
  67. setHeirEvent.args.newHeir.should.eq(heir);
  68. const heartbeatLogs = (await heritable.heartbeat({ from: owner })).logs;
  69. const heartbeatEvent = heartbeatLogs.find(e => e.event === 'OwnerHeartbeated');
  70. heartbeatEvent.args.owner.should.eq(owner);
  71. const proclaimDeathLogs = (await heritable.proclaimDeath({ from: heir })).logs;
  72. const ownerDeadEvent = proclaimDeathLogs.find(e => e.event === 'OwnerProclaimedDead');
  73. ownerDeadEvent.args.owner.should.eq(owner);
  74. ownerDeadEvent.args.heir.should.eq(heir);
  75. await increaseTime(heartbeatTimeout);
  76. const claimHeirOwnershipLogs = (await heritable.claimHeirOwnership({ from: heir })).logs;
  77. const ownershipTransferredEvent = claimHeirOwnershipLogs.find(e => e.event === 'OwnershipTransferred');
  78. const heirOwnershipClaimedEvent = claimHeirOwnershipLogs.find(e => e.event === 'HeirOwnershipClaimed');
  79. ownershipTransferredEvent.args.previousOwner.should.eq(owner);
  80. ownershipTransferredEvent.args.newOwner.should.eq(heir);
  81. heirOwnershipClaimedEvent.args.previousOwner.should.eq(owner);
  82. heirOwnershipClaimedEvent.args.newOwner.should.eq(heir);
  83. });
  84. it('timeOfDeath can be queried', async function () {
  85. (await heritable.timeOfDeath()).should.be.bignumber.equal(0);
  86. });
  87. it('heartbeatTimeout can be queried', async function () {
  88. (await heritable.heartbeatTimeout()).should.be.bignumber.equal(heartbeatTimeout);
  89. });
  90. });