wormhole.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. const Schnorr = artifacts.require("Schnorr");
  2. const Wormhole = artifacts.require("Wormhole");
  3. const WrappedAsset = artifacts.require("WrappedAsset");
  4. const ERC20 = artifacts.require("ERC20PresetMinterPauser");
  5. advanceTimeAndBlock = async (time) => {
  6. await advanceTime(time);
  7. await advanceBlock();
  8. return Promise.resolve(web3.eth.getBlock('latest'));
  9. }
  10. advanceTime = (time) => {
  11. return new Promise((resolve, reject) => {
  12. web3.currentProvider.send({
  13. jsonrpc: "2.0",
  14. method: "evm_increaseTime",
  15. params: [time],
  16. id: new Date().getTime()
  17. }, (err, result) => {
  18. if (err) {
  19. return reject(err);
  20. }
  21. return resolve(result);
  22. });
  23. });
  24. }
  25. advanceBlock = () => {
  26. return new Promise((resolve, reject) => {
  27. web3.currentProvider.send({
  28. jsonrpc: "2.0",
  29. method: "evm_mine",
  30. id: new Date().getTime()
  31. }, (err, result) => {
  32. if (err) {
  33. return reject(err);
  34. }
  35. const newBlockHash = web3.eth.getBlock('latest').hash;
  36. return resolve(newBlockHash)
  37. });
  38. });
  39. }
  40. contract("Wormhole", function () {
  41. it("should use master wrapped asset", async function () {
  42. let bridge = await Wormhole.deployed();
  43. let wa = await bridge.wrappedAssetMaster.call();
  44. assert.equal(wa, WrappedAsset.address)
  45. });
  46. it("should transfer tokens in on valid VAA", async function () {
  47. let bridge = await Wormhole.deployed();
  48. await bridge.submitVAA("0x0100000000008df1ef2b367213cf591e6f6a8de37dd5a4ca771590f6f964a2c4a63b44c1e8532c0e595f4e6e0e784314724c85038af6576de0000007d01087000000330102020104000000000000000000000000000000000000000000000000000000000000000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1010000000000000000000000000347ef34687bdc9f189e87a9200658d9c40e99880000000000000000000000000000000000000000000000004563918244f40000")
  49. // Expect user to have a balance of a new wrapped asset
  50. let wa = new WrappedAsset("0x79183957Be84C0F4dA451E534d5bA5BA3FB9c696");
  51. assert.equal(await wa.assetChain(), 1)
  52. assert.equal(await wa.assetAddress(), "0x0000000000000000000000000347ef34687bdc9f189e87a9200658d9c40e9988")
  53. let balance = await wa.balanceOf("0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1");
  54. assert.equal(balance, "5000000000000000000");
  55. });
  56. it("should not accept the same VAA twice", async function () {
  57. let bridge = await Wormhole.deployed();
  58. try {
  59. await bridge.submitVAA("0x0100000000008df1ef2b367213cf591e6f6a8de37dd5a4ca771590f6f964a2c4a63b44c1e8532c0e595f4e6e0e784314724c85038af6576de0000007d01087000000330102020104000000000000000000000000000000000000000000000000000000000000000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1010000000000000000000000000347ef34687bdc9f189e87a9200658d9c40e99880000000000000000000000000000000000000000000000004563918244f40000");
  60. } catch (e) {
  61. return
  62. }
  63. assert.fail("did not fail")
  64. });
  65. it("should burn tokens on lock", async function () {
  66. let bridge = await Wormhole.deployed();
  67. // Expect user to have a balance
  68. let wa = new WrappedAsset("0x79183957Be84C0F4dA451E534d5bA5BA3FB9c696")
  69. await bridge.lockAssets(wa.address, "4000000000000000000", "0x0", 2);
  70. let balance = await wa.balanceOf("0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1");
  71. // Expect user balance to decrease
  72. assert.equal(balance, "1000000000000000000");
  73. // Expect contract balance to be 0 since tokens have been burned
  74. balance = await wa.balanceOf(bridge.address);
  75. assert.equal(balance, "0");
  76. });
  77. it("should transfer tokens in and out", async function () {
  78. let bridge = await Wormhole.deployed();
  79. let token = await ERC20.new("Test Token", "TKN");
  80. await token.mint("0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1", "1000000000000000000");
  81. // Expect user to have a balance
  82. assert.equal(await token.balanceOf("0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1"), "1000000000000000000");
  83. // Approve bridge
  84. await token.approve(bridge.address, "1000000000000000000");
  85. // Transfer of that token out of the contract should not work
  86. let threw = false;
  87. try {
  88. await bridge.submitVAA("0x0100000000636e71c9cb08d64b6388a39d28779fab9dd42edad20331d022c9e90a43b78b1bfc737f2973136230a9e323fbd5d2f7d6cb599c2bfffff82f1087000000310102020104000000000000000000000000000000000000000000000000000000000000000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1020000000000000000000000009561c133dd8580860b6b7e504bc5aa500f0f06a70000000000000000000000000000000000000000000000000de0b6b3a7640000");
  89. } catch (e) {
  90. threw = true;
  91. }
  92. assert.isTrue(threw);
  93. // Lock assets
  94. let ev = await bridge.lockAssets(token.address, "1000000000000000000", "0x1230000000000000000000000000000000000000000000000000000000000000", 3);
  95. // Check that the lock event was emitted correctly
  96. assert.lengthOf(ev.logs, 1)
  97. assert.equal(ev.logs[0].event, "LogTokensLocked")
  98. assert.equal(ev.logs[0].args.target_chain, "3")
  99. assert.equal(ev.logs[0].args.token_chain, "2")
  100. assert.equal(ev.logs[0].args.token, "0x0000000000000000000000009561c133dd8580860b6b7e504bc5aa500f0f06a7")
  101. assert.equal(ev.logs[0].args.sender, "0x00000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1")
  102. assert.equal(ev.logs[0].args.recipient, "0x1230000000000000000000000000000000000000000000000000000000000000")
  103. assert.equal(ev.logs[0].args.amount, "1000000000000000000")
  104. // Check that the tokens were transferred to the bridge
  105. assert.equal(await token.balanceOf("0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1"), "0");
  106. assert.equal(await token.balanceOf(bridge.address), "1000000000000000000");
  107. // Transfer this token back
  108. await bridge.submitVAA("0x0100000000636e71c9cb08d64b6388a39d28779fab9dd42edad20331d022c9e90a43b78b1bfc737f2973136230a9e323fbd5d2f7d6cb599c2bfffff82f1087000000310102020104000000000000000000000000000000000000000000000000000000000000000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1020000000000000000000000009561c133dd8580860b6b7e504bc5aa500f0f06a70000000000000000000000000000000000000000000000000de0b6b3a7640000");
  109. assert.equal(await token.balanceOf("0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1"), "1000000000000000000");
  110. assert.equal(await token.balanceOf(bridge.address), "0");
  111. });
  112. it("should accept validator set change", async function () {
  113. let bridge = await Wormhole.deployed();
  114. // Push time by 1000
  115. await advanceTimeAndBlock(1000);
  116. await bridge.submitVAA("0x0100000000fe60d5766a84300effedd5362dcf6ff8f4ed75ab3dbe4c1ae07151ab48bc8cbf767b4aa42cf768477dc5bb45367044bd2de6d6b3000003e801253e2f87d126ef42ac22d284de7619d2c87437198a32887efeddb4debfd016747f0000000001")
  117. // Expect user to have a balance of a new wrapped asset
  118. assert.equal(await bridge.guardian_set_index(), 1);
  119. assert.equal((await bridge.guardian_sets(1)).x, "28127375798693063422362909717576839343810687066240716944661469189277081826431");
  120. // Test VAA from guardian set 0; timestamp 1000
  121. await bridge.submitVAA("0x01000000004f871da18c25af540bf7ea0ef28df13ff8945903fa1b82aa5d11ff749f33dba57b6064666dfe07b627e5e1da1f4bf620f92c15c2000003e81087000000340102020104000000000000000000000000000000000000000000000000000000000000000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1010000000000000000000000000347ef34687bdc9f189e87a9200658d9c40e99880000000000000000000000000000000000000000000000004563918244f40000")
  122. await advanceTimeAndBlock(1000);
  123. // Test VAA from guardian set 0; timestamp 2000 - should not work anymore
  124. let threw = false;
  125. try {
  126. await bridge.submitVAA("0x01000000004629dc39ea4b284d31f9c7d5350013aeed4b1c38a80fc65fb21e6c7da5ebd0eb13b46039f40a0ddd7c94c3e974b51cacf9eaa1bb000007d01087000000340102020104000000000000000000000000000000000000000000000000000000000000000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1010000000000000000000000000347ef34687bdc9f189e87a9200658d9c40e99880000000000000000000000000000000000000000000000004563918244f40000")
  127. } catch (e) {
  128. threw = true;
  129. assert.equal(e.reason, "guardian set has expired")
  130. }
  131. assert.isTrue(threw, "guardian set did not expire")
  132. // Test same transaction with guardian set 1; timestamp 2000
  133. await bridge.submitVAA("0x01000000011322402df3ec812a145aa2d9b0f627ff3654c9b3ca471622a1439e81da62ec384ad14db65ae4bee55a23b8082628590902e3d778000007d01087000000340102020104000000000000000000000000000000000000000000000000000000000000000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1010000000000000000000000000347ef34687bdc9f189e87a9200658d9c40e99880000000000000000000000000000000000000000000000004563918244f40000")
  134. });
  135. it("should expire VAA", async function () {
  136. let bridge = await Wormhole.deployed();
  137. // Push time by 1000
  138. await advanceTimeAndBlock(1000);
  139. // Test same transaction with guardian set 1; timestamp 2000
  140. let threw = false;
  141. try {
  142. await bridge.submitVAA("0x01000000013faebdc02d6427d1e8d33919fbaa519ca402323723922c772e4e2da7fedc820c15b24aa5e4c99bec6a9f4c9b612970590ea3acd1000007d01087000000350102020104000000000000000000000000000000000000000000000000000000000000000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1010000000000000000000000000347ef34687bdc9f189e87a9200658d9c40e99880000000000000000000000000000000000000000000000004563918244f40000")
  143. } catch (e) {
  144. threw = true;
  145. assert.equal(e.reason, "VAA has expired")
  146. }
  147. assert.isTrue(threw, "VAA did not expire")
  148. });
  149. });