RefundEscrow.test.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. const { expectThrow } = require('../helpers/expectThrow');
  2. const { EVMRevert } = require('../helpers/EVMRevert');
  3. const expectEvent = require('../helpers/expectEvent');
  4. const { ethGetBalance } = require('../helpers/web3');
  5. const BigNumber = web3.BigNumber;
  6. require('chai')
  7. .use(require('chai-bignumber')(BigNumber))
  8. .should();
  9. const RefundEscrow = artifacts.require('RefundEscrow');
  10. contract('RefundEscrow', function ([_, owner, beneficiary, refundee1, refundee2]) {
  11. const amount = web3.toWei(54.0, 'ether');
  12. const refundees = [refundee1, refundee2];
  13. beforeEach(async function () {
  14. this.escrow = await RefundEscrow.new(beneficiary, { from: owner });
  15. });
  16. context('active state', function () {
  17. it('accepts deposits', async function () {
  18. await this.escrow.deposit(refundee1, { from: owner, value: amount });
  19. const deposit = await this.escrow.depositsOf(refundee1);
  20. deposit.should.be.bignumber.equal(amount);
  21. });
  22. it('does not refund refundees', async function () {
  23. await this.escrow.deposit(refundee1, { from: owner, value: amount });
  24. await expectThrow(this.escrow.withdraw(refundee1), EVMRevert);
  25. });
  26. it('does not allow beneficiary withdrawal', async function () {
  27. await this.escrow.deposit(refundee1, { from: owner, value: amount });
  28. await expectThrow(this.escrow.beneficiaryWithdraw(), EVMRevert);
  29. });
  30. });
  31. it('only owner can enter closed state', async function () {
  32. await expectThrow(this.escrow.close({ from: beneficiary }), EVMRevert);
  33. const receipt = await this.escrow.close({ from: owner });
  34. expectEvent.inLogs(receipt.logs, 'Closed');
  35. });
  36. context('closed state', function () {
  37. beforeEach(async function () {
  38. await Promise.all(refundees.map(refundee => this.escrow.deposit(refundee, { from: owner, value: amount })));
  39. await this.escrow.close({ from: owner });
  40. });
  41. it('rejects deposits', async function () {
  42. await expectThrow(this.escrow.deposit(refundee1, { from: owner, value: amount }), EVMRevert);
  43. });
  44. it('does not refund refundees', async function () {
  45. await expectThrow(this.escrow.withdraw(refundee1), EVMRevert);
  46. });
  47. it('allows beneficiary withdrawal', async function () {
  48. const beneficiaryInitialBalance = await ethGetBalance(beneficiary);
  49. await this.escrow.beneficiaryWithdraw();
  50. const beneficiaryFinalBalance = await ethGetBalance(beneficiary);
  51. beneficiaryFinalBalance.sub(beneficiaryInitialBalance).should.be.bignumber.equal(amount * refundees.length);
  52. });
  53. });
  54. it('only owner can enter refund state', async function () {
  55. await expectThrow(this.escrow.enableRefunds({ from: beneficiary }), EVMRevert);
  56. const receipt = await this.escrow.enableRefunds({ from: owner });
  57. expectEvent.inLogs(receipt.logs, 'RefundsEnabled');
  58. });
  59. context('refund state', function () {
  60. beforeEach(async function () {
  61. await Promise.all(refundees.map(refundee => this.escrow.deposit(refundee, { from: owner, value: amount })));
  62. await this.escrow.enableRefunds({ from: owner });
  63. });
  64. it('rejects deposits', async function () {
  65. await expectThrow(this.escrow.deposit(refundee1, { from: owner, value: amount }), EVMRevert);
  66. });
  67. it('refunds refundees', async function () {
  68. for (const refundee of [refundee1, refundee2]) {
  69. const refundeeInitialBalance = await ethGetBalance(refundee);
  70. await this.escrow.withdraw(refundee, { from: owner });
  71. const refundeeFinalBalance = await ethGetBalance(refundee);
  72. refundeeFinalBalance.sub(refundeeInitialBalance).should.be.bignumber.equal(amount);
  73. }
  74. });
  75. it('does not allow beneficiary withdrawal', async function () {
  76. await expectThrow(this.escrow.beneficiaryWithdraw(), EVMRevert);
  77. });
  78. });
  79. });