@keep-network/tbtc-v2 0.1.0 → 0.1.1-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/README.adoc +12 -0
  2. package/artifacts/.chainId +1 -1
  3. package/artifacts/Bank.json +807 -0
  4. package/artifacts/Bridge.json +2300 -0
  5. package/artifacts/Deposit.json +117 -0
  6. package/artifacts/DepositSweep.json +77 -0
  7. package/artifacts/EcdsaDkgValidator.json +532 -0
  8. package/artifacts/EcdsaInactivity.json +156 -0
  9. package/artifacts/EcdsaSortitionPool.json +1004 -0
  10. package/artifacts/Fraud.json +164 -0
  11. package/artifacts/KeepRegistry.json +99 -0
  12. package/artifacts/KeepStake.json +286 -0
  13. package/artifacts/KeepToken.json +711 -0
  14. package/artifacts/KeepTokenStaking.json +483 -0
  15. package/artifacts/MovingFunds.json +249 -0
  16. package/artifacts/NuCypherStakingEscrow.json +256 -0
  17. package/artifacts/NuCypherToken.json +711 -0
  18. package/artifacts/RandomBeaconStub.json +141 -0
  19. package/artifacts/Redemption.json +174 -0
  20. package/artifacts/ReimbursementPool.json +509 -0
  21. package/artifacts/Relay.json +123 -0
  22. package/artifacts/T.json +1148 -0
  23. package/artifacts/TBTC.json +36 -35
  24. package/artifacts/TBTCToken.json +738 -0
  25. package/artifacts/TBTCVault.json +691 -0
  26. package/artifacts/TokenStaking.json +2288 -0
  27. package/artifacts/TokenholderGovernor.json +1795 -0
  28. package/artifacts/TokenholderTimelock.json +1058 -0
  29. package/artifacts/VendingMachine.json +34 -33
  30. package/artifacts/VendingMachineKeep.json +400 -0
  31. package/artifacts/VendingMachineNuCypher.json +400 -0
  32. package/artifacts/WalletRegistry.json +1843 -0
  33. package/artifacts/WalletRegistryGovernance.json +2754 -0
  34. package/artifacts/Wallets.json +186 -0
  35. package/artifacts/solcInputs/5e62cff1ead0900b07facca4b559e818.json +314 -0
  36. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  37. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.json +2 -2
  38. package/build/contracts/bank/Bank.sol/Bank.dbg.json +4 -0
  39. package/build/contracts/bank/Bank.sol/Bank.json +542 -0
  40. package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +4 -0
  41. package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.json +34 -0
  42. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +4 -0
  43. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.json +10 -0
  44. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +4 -0
  45. package/build/contracts/bridge/Bridge.sol/Bridge.json +2686 -0
  46. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +4 -0
  47. package/build/contracts/bridge/BridgeState.sol/BridgeState.json +226 -0
  48. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +4 -0
  49. package/build/contracts/bridge/Deposit.sol/Deposit.json +72 -0
  50. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +4 -0
  51. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.json +30 -0
  52. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +4 -0
  53. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.json +10 -0
  54. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +4 -0
  55. package/build/contracts/bridge/Fraud.sol/Fraud.json +86 -0
  56. package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +4 -0
  57. package/build/contracts/bridge/Heartbeat.sol/Heartbeat.json +10 -0
  58. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +4 -0
  59. package/build/contracts/bridge/IRelay.sol/IRelay.json +37 -0
  60. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +4 -0
  61. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.json +138 -0
  62. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +4 -0
  63. package/build/contracts/bridge/Redemption.sol/OutboundTx.json +10 -0
  64. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +4 -0
  65. package/build/contracts/bridge/Redemption.sol/Redemption.json +92 -0
  66. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  67. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.json +2 -2
  68. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +4 -0
  69. package/build/contracts/bridge/Wallets.sol/Wallets.json +112 -0
  70. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  71. package/build/contracts/token/TBTC.sol/TBTC.json +4 -4
  72. package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +4 -0
  73. package/build/contracts/vault/DonationVault.sol/DonationVault.json +108 -0
  74. package/build/contracts/vault/IVault.sol/IVault.dbg.json +4 -0
  75. package/build/contracts/vault/IVault.sol/IVault.json +52 -0
  76. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +4 -0
  77. package/build/contracts/vault/TBTCVault.sol/TBTCVault.json +449 -0
  78. package/contracts/GovernanceUtils.sol +4 -4
  79. package/contracts/bank/Bank.sol +436 -0
  80. package/contracts/bank/IReceiveBalanceApproval.sol +45 -0
  81. package/contracts/bridge/BitcoinTx.sol +326 -0
  82. package/contracts/bridge/Bridge.sol +1793 -0
  83. package/contracts/bridge/BridgeState.sol +739 -0
  84. package/contracts/bridge/Deposit.sol +269 -0
  85. package/contracts/bridge/DepositSweep.sol +574 -0
  86. package/contracts/bridge/EcdsaLib.sol +45 -0
  87. package/contracts/bridge/Fraud.sol +579 -0
  88. package/contracts/bridge/Heartbeat.sol +112 -0
  89. package/contracts/bridge/IRelay.sol +28 -0
  90. package/contracts/bridge/MovingFunds.sol +1077 -0
  91. package/contracts/bridge/Redemption.sol +1020 -0
  92. package/contracts/bridge/VendingMachine.sol +2 -2
  93. package/contracts/bridge/Wallets.sol +719 -0
  94. package/contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler +1 -0
  95. package/contracts/hardhat-dependency-compiler/@keep-network/ecdsa/contracts/WalletRegistry.sol +3 -0
  96. package/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol +3 -0
  97. package/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol +3 -0
  98. package/contracts/token/TBTC.sol +1 -1
  99. package/contracts/vault/DonationVault.sol +125 -0
  100. package/contracts/vault/IVault.sol +44 -0
  101. package/contracts/vault/TBTCVault.sol +305 -0
  102. package/deploy/00_resolve_relay.ts +28 -0
  103. package/deploy/00_resolve_tbtc_v1_token.ts +1 -1
  104. package/deploy/01_deploy_tbtc_v2_token.ts +8 -1
  105. package/deploy/02_deploy_vending_machine.ts +7 -0
  106. package/deploy/{03_transfer_roles.ts → 03_transfer_vending_machine_roles.ts} +1 -1
  107. package/deploy/04_deploy_bank.ts +27 -0
  108. package/deploy/05_deploy_bridge.ts +80 -0
  109. package/deploy/06_deploy_tbtc_vault.ts +30 -0
  110. package/deploy/07_bank_update_bridge.ts +19 -0
  111. package/deploy/08_transfer_bank_ownership.ts +15 -0
  112. package/deploy/09_transfer_tbtc_vault_ownership.ts +15 -0
  113. package/deploy/10_transfer_bridge_governance.ts +20 -0
  114. package/deploy/11_initialize_wallet_owner.ts +18 -0
  115. package/deploy/11_transfer_proxy_admin_ownership.ts +30 -0
  116. package/deploy/12_deploy_proxy_admin_with_deputy.ts +33 -0
  117. package/export/deploy/00_resolve_relay.js +24 -0
  118. package/export/deploy/00_resolve_tbtc_v1_token.js +24 -0
  119. package/export/deploy/01_deploy_tbtc_v2_token.js +19 -0
  120. package/export/deploy/02_deploy_vending_machine.js +25 -0
  121. package/export/deploy/03_transfer_vending_machine_roles.js +19 -0
  122. package/export/deploy/04_deploy_bank.js +21 -0
  123. package/export/deploy/05_deploy_bridge.js +69 -0
  124. package/export/deploy/06_deploy_tbtc_vault.js +24 -0
  125. package/export/deploy/07_bank_update_bridge.js +13 -0
  126. package/export/deploy/08_transfer_bank_ownership.js +11 -0
  127. package/export/deploy/09_transfer_tbtc_vault_ownership.js +11 -0
  128. package/export/deploy/10_transfer_bridge_governance.js +11 -0
  129. package/export/deploy/11_initialize_wallet_owner.js +14 -0
  130. package/export/deploy/11_transfer_proxy_admin_ownership.js +23 -0
  131. package/export/deploy/12_deploy_proxy_admin_with_deputy.js +22 -0
  132. package/export/hardhat.config.js +169 -0
  133. package/export/test/bank/Bank.test.js +1012 -0
  134. package/export/test/bridge/Bridge.Deployment.test.js +76 -0
  135. package/export/test/bridge/Bridge.Deposit.test.js +1834 -0
  136. package/export/test/bridge/Bridge.Frauds.test.js +1349 -0
  137. package/export/test/bridge/Bridge.MovingFunds.test.js +2437 -0
  138. package/export/test/bridge/Bridge.Parameters.test.js +400 -0
  139. package/export/test/bridge/Bridge.Redemption.test.js +2523 -0
  140. package/export/test/bridge/Bridge.Vaults.test.js +74 -0
  141. package/export/test/bridge/Bridge.Wallets.test.js +1017 -0
  142. package/export/test/bridge/EcdsaLib.test.js +46 -0
  143. package/export/test/bridge/Heartbeat.test.js +77 -0
  144. package/export/test/bridge/VendingMachine.Upgrade.test.js +160 -0
  145. package/export/test/bridge/VendingMachine.test.js +762 -0
  146. package/export/test/data/deposit-sweep.js +655 -0
  147. package/export/test/data/ecdsa.js +18 -0
  148. package/export/test/data/fraud.js +158 -0
  149. package/export/test/data/moving-funds.js +815 -0
  150. package/export/test/data/redemption.js +1011 -0
  151. package/export/test/fixtures/bridge.js +54 -0
  152. package/export/test/fixtures/index.js +57 -0
  153. package/export/test/helpers/contract-test-helpers.js +18 -0
  154. package/export/test/integration/Slashing.test.js +279 -0
  155. package/export/test/integration/WalleCreation.test.js +66 -0
  156. package/export/test/integration/utils/ecdsa-wallet-registry.js +137 -0
  157. package/export/test/integration/utils/fixture.js +77 -0
  158. package/export/test/integration/utils/gas.js +36 -0
  159. package/export/test/integration/utils/random-beacon.js +26 -0
  160. package/export/test/integration/utils/staking.js +19 -0
  161. package/export/test/vault/DonationVault.test.js +202 -0
  162. package/export/test/vault/TBTCVault.Redemption.test.js +357 -0
  163. package/export/test/vault/TBTCVault.test.js +768 -0
  164. package/export/typechain/BTCUtils.js +2 -0
  165. package/export/typechain/Bank.js +2 -0
  166. package/export/typechain/BankStub.js +2 -0
  167. package/export/typechain/Bridge.js +2 -0
  168. package/export/typechain/BridgeState.js +2 -0
  169. package/export/typechain/BridgeStub.js +2 -0
  170. package/export/typechain/Deposit.js +2 -0
  171. package/export/typechain/DepositSweep.js +2 -0
  172. package/export/typechain/DonationVault.js +2 -0
  173. package/export/typechain/ERC165.js +2 -0
  174. package/export/typechain/ERC1967Proxy.js +2 -0
  175. package/export/typechain/ERC1967Upgrade.js +2 -0
  176. package/export/typechain/ERC20WithPermit.js +2 -0
  177. package/export/typechain/ERC721.js +2 -0
  178. package/export/typechain/EcdsaAuthorization.js +2 -0
  179. package/export/typechain/EcdsaDkg.js +2 -0
  180. package/export/typechain/EcdsaDkgValidator.js +2 -0
  181. package/export/typechain/EcdsaInactivity.js +2 -0
  182. package/export/typechain/Fraud.js +2 -0
  183. package/export/typechain/Governable.js +2 -0
  184. package/export/typechain/HeartbeatStub.js +2 -0
  185. package/export/typechain/IApplication.js +2 -0
  186. package/export/typechain/IApproveAndCall.js +2 -0
  187. package/export/typechain/IBeacon.js +2 -0
  188. package/export/typechain/IERC165.js +2 -0
  189. package/export/typechain/IERC1822Proxiable.js +2 -0
  190. package/export/typechain/IERC20.js +2 -0
  191. package/export/typechain/IERC20Metadata.js +2 -0
  192. package/export/typechain/IERC20WithPermit.js +2 -0
  193. package/export/typechain/IERC721.js +2 -0
  194. package/export/typechain/IERC721Metadata.js +2 -0
  195. package/export/typechain/IERC721Receiver.js +2 -0
  196. package/export/typechain/IRandomBeacon.js +2 -0
  197. package/export/typechain/IRandomBeaconConsumer.js +2 -0
  198. package/export/typechain/IReceiveApproval.js +2 -0
  199. package/export/typechain/IReceiveBalanceApproval.js +2 -0
  200. package/export/typechain/IRelay.js +2 -0
  201. package/export/typechain/IStaking.js +2 -0
  202. package/export/typechain/IVault.js +2 -0
  203. package/export/typechain/IWalletOwner.js +2 -0
  204. package/export/typechain/IWalletRegistry.js +2 -0
  205. package/export/typechain/Initializable.js +2 -0
  206. package/export/typechain/MisfundRecovery.js +2 -0
  207. package/export/typechain/MovingFunds.js +2 -0
  208. package/export/typechain/Ownable.js +2 -0
  209. package/export/typechain/Proxy.js +2 -0
  210. package/export/typechain/ProxyAdmin.js +2 -0
  211. package/export/typechain/ReceiveApprovalStub.js +2 -0
  212. package/export/typechain/Redemption.js +2 -0
  213. package/export/typechain/Reimbursable.js +2 -0
  214. package/export/typechain/ReimbursementPool.js +2 -0
  215. package/export/typechain/Rewards.js +2 -0
  216. package/export/typechain/SortitionPool.js +2 -0
  217. package/export/typechain/SortitionTree.js +2 -0
  218. package/export/typechain/TBTC.js +2 -0
  219. package/export/typechain/TBTCVault.js +2 -0
  220. package/export/typechain/TestERC20.js +2 -0
  221. package/export/typechain/TestERC721.js +2 -0
  222. package/export/typechain/TestEcdsaLib.js +2 -0
  223. package/export/typechain/TestRelay.js +2 -0
  224. package/export/typechain/TransparentUpgradeableProxy.js +2 -0
  225. package/export/typechain/VendingMachine.js +2 -0
  226. package/export/typechain/WalletRegistry.js +2 -0
  227. package/export/typechain/Wallets.js +2 -0
  228. package/export/typechain/common.js +2 -0
  229. package/export/typechain/factories/BTCUtils__factory.js +94 -0
  230. package/export/typechain/factories/BankStub__factory.js +586 -0
  231. package/export/typechain/factories/Bank__factory.js +573 -0
  232. package/export/typechain/factories/BridgeState__factory.js +257 -0
  233. package/export/typechain/factories/BridgeStub__factory.js +2912 -0
  234. package/export/typechain/factories/Bridge__factory.js +2526 -0
  235. package/export/typechain/factories/DepositSweep__factory.js +61 -0
  236. package/export/typechain/factories/Deposit__factory.js +103 -0
  237. package/export/typechain/factories/DonationVault__factory.js +139 -0
  238. package/export/typechain/factories/ERC165__factory.js +38 -0
  239. package/export/typechain/factories/ERC1967Proxy__factory.js +111 -0
  240. package/export/typechain/factories/ERC1967Upgrade__factory.js +64 -0
  241. package/export/typechain/factories/ERC20WithPermit__factory.js +524 -0
  242. package/export/typechain/factories/ERC721__factory.js +388 -0
  243. package/export/typechain/factories/EcdsaAuthorization__factory.js +211 -0
  244. package/export/typechain/factories/EcdsaDkgValidator__factory.js +441 -0
  245. package/export/typechain/factories/EcdsaDkg__factory.js +192 -0
  246. package/export/typechain/factories/EcdsaInactivity__factory.js +134 -0
  247. package/export/typechain/factories/Fraud__factory.js +117 -0
  248. package/export/typechain/factories/Governable__factory.js +64 -0
  249. package/export/typechain/factories/HeartbeatStub__factory.js +61 -0
  250. package/export/typechain/factories/IApplication__factory.js +152 -0
  251. package/export/typechain/factories/IApproveAndCall__factory.js +48 -0
  252. package/export/typechain/factories/IBeacon__factory.js +32 -0
  253. package/export/typechain/factories/IERC165__factory.js +38 -0
  254. package/export/typechain/factories/IERC1822Proxiable__factory.js +32 -0
  255. package/export/typechain/factories/IERC20Metadata__factory.js +241 -0
  256. package/export/typechain/factories/IERC20WithPermit__factory.js +389 -0
  257. package/export/typechain/factories/IERC20__factory.js +202 -0
  258. package/export/typechain/factories/IERC721Metadata__factory.js +349 -0
  259. package/export/typechain/factories/IERC721Receiver__factory.js +53 -0
  260. package/export/typechain/factories/IERC721__factory.js +304 -0
  261. package/export/typechain/factories/IRandomBeaconConsumer__factory.js +37 -0
  262. package/export/typechain/factories/IRandomBeacon__factory.js +32 -0
  263. package/export/typechain/factories/IReceiveApproval__factory.js +47 -0
  264. package/export/typechain/factories/IReceiveBalanceApproval__factory.js +42 -0
  265. package/export/typechain/factories/IRelay__factory.js +45 -0
  266. package/export/typechain/factories/IStaking__factory.js +722 -0
  267. package/export/typechain/factories/IVault__factory.js +60 -0
  268. package/export/typechain/factories/IWalletOwner__factory.js +65 -0
  269. package/export/typechain/factories/IWalletRegistry__factory.js +138 -0
  270. package/export/typechain/factories/Initializable__factory.js +32 -0
  271. package/export/typechain/factories/MisfundRecovery__factory.js +145 -0
  272. package/export/typechain/factories/MovingFunds__factory.js +169 -0
  273. package/export/typechain/factories/Ownable__factory.js +71 -0
  274. package/export/typechain/factories/ProxyAdmin__factory.js +191 -0
  275. package/export/typechain/factories/Proxy__factory.js +27 -0
  276. package/export/typechain/factories/ReceiveApprovalStub__factory.js +127 -0
  277. package/export/typechain/factories/Redemption__factory.js +123 -0
  278. package/export/typechain/factories/Reimbursable__factory.js +58 -0
  279. package/export/typechain/factories/ReimbursementPool__factory.js +350 -0
  280. package/export/typechain/factories/Rewards__factory.js +117 -0
  281. package/export/typechain/factories/SortitionPool__factory.js +610 -0
  282. package/export/typechain/factories/SortitionTree__factory.js +149 -0
  283. package/export/typechain/factories/TBTCVault__factory.js +480 -0
  284. package/export/typechain/factories/TBTC__factory.js +564 -0
  285. package/export/typechain/factories/TestERC20__factory.js +539 -0
  286. package/export/typechain/factories/TestERC721__factory.js +421 -0
  287. package/export/typechain/factories/TestEcdsaLib__factory.js +66 -0
  288. package/export/typechain/factories/TestRelay__factory.js +94 -0
  289. package/export/typechain/factories/TransparentUpgradeableProxy__factory.js +186 -0
  290. package/export/typechain/factories/VendingMachine__factory.js +549 -0
  291. package/export/typechain/factories/WalletRegistry__factory.js +1919 -0
  292. package/export/typechain/factories/Wallets__factory.js +143 -0
  293. package/export/typechain/index.js +132 -0
  294. package/export.json +15932 -503
  295. package/package.json +47 -26
  296. package/artifacts/solcInputs/7cc3eda3cb3ff2522d18b5e7b31ea228.json +0 -104
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const chai_1 = require("chai");
4
+ const hardhat_1 = require("hardhat");
5
+ describe("EcdsaLib", () => {
6
+ let ecdsaLib;
7
+ before(async () => {
8
+ const EcdsaLib = await hardhat_1.ethers.getContractFactory("TestEcdsaLib");
9
+ ecdsaLib = await EcdsaLib.deploy();
10
+ });
11
+ describe("compressPublicKey", async () => {
12
+ context("with valid uncompressed public key", async () => {
13
+ const testData = [
14
+ {
15
+ testName: "with even Y",
16
+ publicKeyX: "0x50863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352",
17
+ publicKeyY: "0x2cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6",
18
+ expectedCompressedPublicKey: "0x0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352",
19
+ },
20
+ {
21
+ testName: "with odd Y",
22
+ publicKeyX: "0x2a574ea59cae80b09d6ba415746e9b031abfbe83f149b43b37be035b87164872",
23
+ publicKeyY: "0x0336c5eb647e891c98261c57c13098fa6ae68221363c68ff15841b86dad60241",
24
+ expectedCompressedPublicKey: "0x032a574ea59cae80b09d6ba415746e9b031abfbe83f149b43b37be035b87164872",
25
+ },
26
+ {
27
+ testName: "with leading zeros",
28
+ publicKeyX: "0x00003ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352",
29
+ publicKeyY: "0x000070243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6",
30
+ expectedCompressedPublicKey: "0x0200003ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352",
31
+ },
32
+ {
33
+ testName: "with trailing zeros",
34
+ publicKeyX: "0x50863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b0000",
35
+ publicKeyY: "0x2cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c580000",
36
+ expectedCompressedPublicKey: "0x0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b0000",
37
+ },
38
+ ];
39
+ testData.forEach((test) => {
40
+ it(test.testName, async () => {
41
+ (0, chai_1.expect)(await ecdsaLib.compressPublicKey(test.publicKeyX, test.publicKeyY)).to.be.equal(test.expectedCompressedPublicKey);
42
+ });
43
+ });
44
+ });
45
+ });
46
+ });
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const chai_1 = require("chai");
5
+ const hardhat_1 = require("hardhat");
6
+ describe("Heartbeat", () => {
7
+ let heartbeat;
8
+ before(async () => {
9
+ const HeartbeatStub = await hardhat_1.ethers.getContractFactory("HeartbeatStub");
10
+ heartbeat = await HeartbeatStub.deploy();
11
+ });
12
+ context("when the message is empty", () => {
13
+ it("should return false", async () => {
14
+ const message = "0x";
15
+ (0, chai_1.expect)(await heartbeat.isValidHeartbeatMessage(message)).to.be.false;
16
+ });
17
+ });
18
+ context("when the message has less than 16 bytes", () => {
19
+ it("should return false", async () => {
20
+ // 15 bytes
21
+ const message = "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
22
+ (0, chai_1.expect)(await heartbeat.isValidHeartbeatMessage(message)).to.be.false;
23
+ });
24
+ });
25
+ context("when the message has more than 16 bytes", () => {
26
+ it("should return false", async () => {
27
+ // 17 bytes
28
+ const message = "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
29
+ (0, chai_1.expect)(await heartbeat.isValidHeartbeatMessage(message)).to.be.false;
30
+ });
31
+ });
32
+ context("when the message has 16 bytes", () => {
33
+ context("when the message does not have the required prefix", () => {
34
+ it("should return false", async () => {
35
+ const messages = [
36
+ "0x00000000000000000000000000000000",
37
+ "0xFF000000000000000000000000000000",
38
+ "0xFFFF0000000000000000000000000000",
39
+ "0xFFFFFF00000000000000000000000000",
40
+ "0xFFFFFFFF000000000000000000000000",
41
+ "0xFFFFFFFFFF0000000000000000000000",
42
+ "0xFFFFFFFFFFFF00000000000000000000",
43
+ "0xFFFFFFFFFFFFFF000000000000000000",
44
+ "0x11111111111111111111111111111111",
45
+ "0xFF111111111111111111111111111111",
46
+ "0xFFFF1111111111111111111111111111",
47
+ "0xFFFFFF11111111111111111111111111",
48
+ "0xFFFFFFFF111111111111111111111111",
49
+ "0xFFFFFFFFFF1111111111111111111111",
50
+ "0xFFFFFFFFFFFF11111111111111111111",
51
+ "0xFFFFFFFFFFFFFF111111111111111111",
52
+ "0xFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFF",
53
+ "0x0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
54
+ ];
55
+ for (let i = 0; i < messages.length; i++) {
56
+ // eslint-disable-next-line no-await-in-loop
57
+ (0, chai_1.expect)(await heartbeat.isValidHeartbeatMessage(messages[i])).to.be
58
+ .false;
59
+ }
60
+ });
61
+ });
62
+ context("when the message has the required prefix", () => {
63
+ it("should return true", async () => {
64
+ const messages = [
65
+ "0xFFFFFFFFFFFFFFFF0000000000000000",
66
+ "0xFFFFFFFFFFFFFFFF1111111111111111",
67
+ "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
68
+ ];
69
+ for (let i = 0; i < messages.length; i++) {
70
+ // eslint-disable-next-line no-await-in-loop
71
+ (0, chai_1.expect)(await heartbeat.isValidHeartbeatMessage(messages[i])).to.be
72
+ .true;
73
+ }
74
+ });
75
+ });
76
+ });
77
+ });
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const hardhat_1 = require("hardhat");
7
+ const chai_1 = require("chai");
8
+ const fixtures_1 = require("../fixtures");
9
+ const bridge_1 = __importDefault(require("../fixtures/bridge"));
10
+ const deposit_sweep_1 = require("../data/deposit-sweep");
11
+ const { to1e18 } = hardhat_1.helpers.number;
12
+ const { increaseTime, lastBlockTime } = hardhat_1.helpers.time;
13
+ // Test covering `VendingMachine` -> `TBTCVault` upgrade process.
14
+ //
15
+ // Step #1 - TBTC v1 transfer
16
+ // TBTC v1 is transferred from `VendingMachine` to `TBTCVault` along with
17
+ // TBTC v2 token ownership.
18
+ //
19
+ // Step #2 - TBTC v1 withdrawal
20
+ // Governance withdraws TBTC v1 from `VendingMachine` *somewhere*.
21
+ // Governance unmints TBTC v1 to BTC *somehow*.
22
+ //
23
+ // Step #3 - BTC deposits
24
+ // Governance deposits BTC to `TBTCVault`.
25
+ //
26
+ // Step #4 - functioning system
27
+ // The system works. Users can mint and unmint TBTC v2.
28
+ describe("VendingMachine - Upgrade", () => {
29
+ let deployer;
30
+ let governance;
31
+ let account1;
32
+ let account2;
33
+ let tbtcV1;
34
+ let tbtc;
35
+ let tbtcVault;
36
+ let bridge;
37
+ let bank;
38
+ let vendingMachine;
39
+ let relay;
40
+ before(async () => {
41
+ // eslint-disable-next-line @typescript-eslint/no-extra-semi
42
+ ;
43
+ ({ deployer, governance } = await hardhat_1.helpers.signers.getNamedSigners());
44
+ [account1, account2] = await hardhat_1.helpers.signers.getUnnamedSigners();
45
+ ({ tbtcVault, tbtc, vendingMachine, bank, bridge, relay } =
46
+ await hardhat_1.waffle.loadFixture(bridge_1.default));
47
+ // Set the deposit dust threshold to 0.0001 BTC, i.e. 100x smaller than
48
+ // the initial value in the Bridge in order to save test Bitcoins.
49
+ await bridge.setDepositDustThreshold(10000);
50
+ await bridge.connect(governance).setVaultStatus(tbtcVault.address, true);
51
+ tbtcV1 = await hardhat_1.helpers.contracts.getContract("TBTCToken");
52
+ // Two accounts with 10 TBTC v1 each wrap their holdings to TBTC v2.
53
+ const initialTbtcBalance = to1e18(10);
54
+ await tbtcV1.connect(deployer).mint(account1.address, initialTbtcBalance);
55
+ await tbtcV1.connect(deployer).mint(account2.address, initialTbtcBalance);
56
+ await tbtcV1
57
+ .connect(account1)
58
+ .approveAndCall(vendingMachine.address, initialTbtcBalance, []);
59
+ await tbtcV1
60
+ .connect(account2)
61
+ .approveAndCall(vendingMachine.address, initialTbtcBalance, []);
62
+ // Deployment scripts deploy both `VendingMachine` and `TBTCVault` but they
63
+ // do not transfer the ownership of `TBTC` token to `TBTCVault`.
64
+ // We need to do it manually in tests covering `TBTCVault` behavior.
65
+ // Also, please note that `03_transfer_roles.ts` assigning `VendingMachine`
66
+ // upgrade initiator role to Keep Technical Wallet is skipped for Hardhat
67
+ // env deployment. That's why the upgrade initiator and `VendingMachine`
68
+ // owner is the deployer.
69
+ await vendingMachine
70
+ .connect(deployer)
71
+ .initiateVendingMachineUpgrade(tbtcVault.address);
72
+ await increaseTime(await vendingMachine.GOVERNANCE_DELAY());
73
+ await vendingMachine.connect(deployer).finalizeVendingMachineUpgrade();
74
+ });
75
+ describe("upgrade process", () => {
76
+ // Two accounts with 10 TBTC v1 each wrap their holdings to TBTC v2.
77
+ // See the main `before`.
78
+ const totalTbtcV1Balance = to1e18(20);
79
+ describe("step#1 - TBTC v1 transfer", () => {
80
+ it("should transfer all TBTC v1 to TBTCVault", async () => {
81
+ (0, chai_1.expect)(await tbtcV1.balanceOf(vendingMachine.address)).to.equal(to1e18(0));
82
+ (0, chai_1.expect)(await tbtcV1.balanceOf(tbtcVault.address)).to.equal(totalTbtcV1Balance);
83
+ });
84
+ });
85
+ describe("step#2 - TBTC v1 withdrawal", () => {
86
+ it("should let the governance withdraw TBTC v1 from TBTCVault", async () => {
87
+ await tbtcVault
88
+ .connect(governance)
89
+ .recoverERC20(tbtcV1.address, governance.address, totalTbtcV1Balance);
90
+ (0, chai_1.expect)(await tbtcV1.balanceOf(tbtcVault.address)).to.equal(0);
91
+ (0, chai_1.expect)(await tbtcV1.balanceOf(governance.address)).to.equal(totalTbtcV1Balance);
92
+ });
93
+ });
94
+ describe("step#3 - BTC deposit", () => {
95
+ before(async () => {
96
+ const data = JSON.parse(JSON.stringify(deposit_sweep_1.SingleP2SHDeposit));
97
+ const { fundingTx, reveal } = data.deposits[0]; // it's a single deposit
98
+ reveal.vault = tbtcVault.address;
99
+ // Simulate the wallet is a Live one and is known in the system.
100
+ await bridge.setWallet(reveal.walletPubKeyHash, {
101
+ ecdsaWalletID: hardhat_1.ethers.constants.HashZero,
102
+ mainUtxoHash: hardhat_1.ethers.constants.HashZero,
103
+ pendingRedemptionsValue: 0,
104
+ createdAt: await lastBlockTime(),
105
+ movingFundsRequestedAt: 0,
106
+ closingStartedAt: 0,
107
+ pendingMovedFundsSweepRequestsCount: 0,
108
+ state: fixtures_1.walletState.Live,
109
+ movingFundsTargetWalletsCommitmentHash: hardhat_1.ethers.constants.HashZero,
110
+ });
111
+ await bridge.revealDeposit(fundingTx, reveal);
112
+ relay.getCurrentEpochDifficulty.returns(data.chainDifficulty);
113
+ relay.getPrevEpochDifficulty.returns(data.chainDifficulty);
114
+ await bridge.submitDepositSweepProof(data.sweepTx, data.sweepProof, data.mainUtxo, tbtcVault.address);
115
+ });
116
+ it("should let the governance donate TBTCVault", async () => {
117
+ // The sum of sweep tx inputs is 20000 satoshi. The output
118
+ // value is 18500 so the transaction fee is 1500. There is
119
+ // only one deposit so it incurs the entire transaction fee.
120
+ // The deposit should also incur the treasury fee whose
121
+ // initial value is 0.05% of the deposited amount so the
122
+ // final depositor balance should be cut by 10 satoshi.
123
+ const totalWalletBtcBalance = 18490;
124
+ (0, chai_1.expect)(await bank.balanceOf(tbtcVault.address)).to.equal(totalWalletBtcBalance);
125
+ });
126
+ });
127
+ describe("step#4 - functioning system", () => {
128
+ it("should let TBTC v2 holders unmint their tokens", async () => {
129
+ const initialWalletBtcBalance = 18490;
130
+ const unmintedAmount1 = 7000;
131
+ const unmintedAmount2 = 1000;
132
+ await tbtc.connect(account1).approve(tbtcVault.address, unmintedAmount1);
133
+ await tbtcVault.connect(account1).unmint(unmintedAmount1);
134
+ await tbtc.connect(account2).approve(tbtcVault.address, unmintedAmount2);
135
+ await tbtcVault.connect(account2).unmint(unmintedAmount2);
136
+ (0, chai_1.expect)(await bank.balanceOf(account1.address)).to.equal(unmintedAmount1);
137
+ (0, chai_1.expect)(await bank.balanceOf(account2.address)).to.equal(unmintedAmount2);
138
+ (0, chai_1.expect)(await bank.balanceOf(tbtcVault.address)).to.equal(initialWalletBtcBalance - unmintedAmount1 - unmintedAmount2);
139
+ });
140
+ it("should let Bank balance holders mint TBTC v2", async () => {
141
+ const initialWalletBtcBalance = 10490; // 18490 - 7000 - 1000
142
+ const mintedAmount1 = 600;
143
+ const mintedAmount2 = 100;
144
+ const initialTbtcBalance1 = await tbtc.balanceOf(account1.address);
145
+ const initialTbtcBalance2 = await tbtc.balanceOf(account2.address);
146
+ await bank
147
+ .connect(account1)
148
+ .approveBalance(tbtcVault.address, mintedAmount1);
149
+ await tbtcVault.connect(account1).mint(mintedAmount1);
150
+ await bank
151
+ .connect(account2)
152
+ .approveBalance(tbtcVault.address, mintedAmount2);
153
+ await tbtcVault.connect(account2).mint(mintedAmount2);
154
+ (0, chai_1.expect)(await tbtc.balanceOf(account1.address)).to.equal(initialTbtcBalance1.add(mintedAmount1));
155
+ (0, chai_1.expect)(await tbtc.balanceOf(account2.address)).to.equal(initialTbtcBalance2.add(mintedAmount2));
156
+ (0, chai_1.expect)(await bank.balanceOf(tbtcVault.address)).to.equal(initialWalletBtcBalance + mintedAmount1 + mintedAmount2);
157
+ });
158
+ });
159
+ });
160
+ });