@keep-network/tbtc-v2 1.3.0-dev.6 → 1.3.0-dev.7

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 (111) hide show
  1. package/artifacts/BLS.json +1 -1
  2. package/artifacts/Bank.json +3 -3
  3. package/artifacts/BeaconAuthorization.json +1 -1
  4. package/artifacts/BeaconDkg.json +1 -1
  5. package/artifacts/BeaconDkgValidator.json +1 -1
  6. package/artifacts/BeaconInactivity.json +1 -1
  7. package/artifacts/BeaconSortitionPool.json +3 -3
  8. package/artifacts/Bridge.json +5 -5
  9. package/artifacts/BridgeGovernance.json +2 -2
  10. package/artifacts/BridgeGovernanceParameters.json +2 -2
  11. package/artifacts/Deposit.json +2 -2
  12. package/artifacts/DepositSweep.json +2 -2
  13. package/artifacts/DonationVault.json +3 -3
  14. package/artifacts/EcdsaDkgValidator.json +1 -1
  15. package/artifacts/EcdsaInactivity.json +1 -1
  16. package/artifacts/EcdsaSortitionPool.json +3 -3
  17. package/artifacts/Fraud.json +2 -2
  18. package/artifacts/KeepRegistry.json +1 -1
  19. package/artifacts/KeepStake.json +2 -2
  20. package/artifacts/KeepToken.json +2 -2
  21. package/artifacts/KeepTokenStaking.json +1 -1
  22. package/artifacts/LightRelay.json +18 -18
  23. package/artifacts/LightRelayMaintainerProxy.json +8 -8
  24. package/artifacts/MaintainerProxy.json +19 -19
  25. package/artifacts/MovingFunds.json +2 -2
  26. package/artifacts/NuCypherStakingEscrow.json +1 -1
  27. package/artifacts/NuCypherToken.json +2 -2
  28. package/artifacts/RandomBeacon.json +2 -2
  29. package/artifacts/RandomBeaconChaosnet.json +2 -2
  30. package/artifacts/RandomBeaconGovernance.json +2 -2
  31. package/artifacts/Redemption.json +2 -2
  32. package/artifacts/ReimbursementPool.json +2 -2
  33. package/artifacts/T.json +2 -2
  34. package/artifacts/TBTC.json +3 -3
  35. package/artifacts/TBTCToken.json +3 -3
  36. package/artifacts/TBTCVault.json +23 -23
  37. package/artifacts/TokenStaking.json +1 -1
  38. package/artifacts/TokenholderGovernor.json +9 -9
  39. package/artifacts/TokenholderTimelock.json +8 -8
  40. package/artifacts/VendingMachine.json +3 -3
  41. package/artifacts/VendingMachineKeep.json +1 -1
  42. package/artifacts/VendingMachineNuCypher.json +1 -1
  43. package/artifacts/VendingMachineV2.json +3 -3
  44. package/artifacts/VendingMachineV3.json +3 -3
  45. package/artifacts/WalletCoordinator.json +128 -70
  46. package/artifacts/WalletRegistry.json +5 -5
  47. package/artifacts/WalletRegistryGovernance.json +2 -2
  48. package/artifacts/Wallets.json +2 -2
  49. package/artifacts/solcInputs/{7da6b4ef582799bac2eaf0403f4eac81.json → 113b54a69049e9a4de4a520973971e13.json} +1 -1
  50. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  51. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  52. package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +1 -1
  53. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  54. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  55. package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.dbg.json +1 -1
  56. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  57. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  58. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +1 -1
  59. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  60. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
  61. package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +1 -1
  62. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  63. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  64. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
  65. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
  66. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  67. package/build/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.dbg.json +1 -1
  68. package/build/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.dbg.json +1 -1
  69. package/build/contracts/bridge/WalletCoordinator.sol/WalletCoordinator.dbg.json +1 -1
  70. package/build/contracts/bridge/WalletCoordinator.sol/WalletCoordinator.json +117 -59
  71. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  72. package/build/contracts/l2/L2TBTC.sol/L2TBTC.dbg.json +1 -1
  73. package/build/contracts/l2/L2WormholeGateway.sol/IWormholeTokenBridge.dbg.json +1 -1
  74. package/build/contracts/l2/L2WormholeGateway.sol/L2WormholeGateway.dbg.json +1 -1
  75. package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.dbg.json +1 -1
  76. package/build/contracts/relay/LightRelay.sol/ILightRelay.dbg.json +1 -1
  77. package/build/contracts/relay/LightRelay.sol/LightRelay.dbg.json +1 -1
  78. package/build/contracts/relay/LightRelay.sol/RelayUtils.dbg.json +1 -1
  79. package/build/contracts/relay/LightRelayMaintainerProxy.sol/LightRelayMaintainerProxy.dbg.json +1 -1
  80. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  81. package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +1 -1
  82. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  83. package/build/contracts/vault/TBTCOptimisticMinting.sol/TBTCOptimisticMinting.dbg.json +1 -1
  84. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  85. package/contracts/bridge/WalletCoordinator.sol +106 -51
  86. package/export/artifacts/contracts/bridge/Bridge.sol/Bridge.json +22 -22
  87. package/export/artifacts/contracts/bridge/VendingMachine.sol/VendingMachine.json +6 -6
  88. package/export/artifacts/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.json +6 -6
  89. package/export/artifacts/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.json +6 -6
  90. package/export/artifacts/contracts/bridge/WalletCoordinator.sol/WalletCoordinator.json +7763 -5424
  91. package/export/artifacts/contracts/l2/L2TBTC.sol/L2TBTC.json +40 -40
  92. package/export/artifacts/contracts/l2/L2WormholeGateway.sol/L2WormholeGateway.json +47 -47
  93. package/export/artifacts/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.json +88 -88
  94. package/export/artifacts/contracts/relay/LightRelay.sol/LightRelay.json +57 -57
  95. package/export/artifacts/contracts/relay/LightRelayMaintainerProxy.sol/LightRelayMaintainerProxy.json +31 -31
  96. package/export/artifacts/contracts/test/BankStub.sol/BankStub.json +2 -2
  97. package/export/artifacts/contracts/test/BridgeStub.sol/BridgeStub.json +58 -58
  98. package/export/artifacts/contracts/test/GoerliLightRelay.sol/GoerliLightRelay.json +57 -57
  99. package/export/artifacts/contracts/test/HeartbeatStub.sol/HeartbeatStub.json +2 -2
  100. package/export/artifacts/contracts/test/LightRelayStub.sol/LightRelayStub.json +59 -59
  101. package/export/artifacts/contracts/test/ReceiveApprovalStub.sol/ReceiveApprovalStub.json +7 -7
  102. package/export/artifacts/contracts/test/SystemTestRelay.sol/SystemTestRelay.json +14 -14
  103. package/export/artifacts/contracts/test/TestERC20.sol/TestERC20.json +6 -6
  104. package/export/artifacts/contracts/test/TestERC721.sol/TestERC721.json +8 -8
  105. package/export/artifacts/contracts/test/TestEcdsaLib.sol/TestEcdsaLib.json +2 -2
  106. package/export/artifacts/contracts/test/WormholeBridgeStub.sol/WormholeBridgeStub.json +37 -37
  107. package/export/artifacts/contracts/token/TBTC.sol/TBTC.json +2 -2
  108. package/export/artifacts/contracts/vault/DonationVault.sol/DonationVault.json +11 -11
  109. package/export/artifacts/contracts/vault/TBTCVault.sol/TBTCVault.json +135 -135
  110. package/export/typechain/factories/WalletCoordinator__factory.js +110 -52
  111. package/package.json +1 -1
@@ -48,6 +48,8 @@ contract WalletCoordinator is OwnableUpgradeable, Reimbursable {
48
48
  enum WalletAction {
49
49
  /// @dev The wallet does not perform any action.
50
50
  Idle,
51
+ /// @dev The wallet is executing heartbeat.
52
+ Heartbeat,
51
53
  /// @dev The wallet is handling a deposit sweep action.
52
54
  DepositSweep,
53
55
  /// @dev The wallet is handling a redemption action.
@@ -119,6 +121,21 @@ contract WalletCoordinator is OwnableUpgradeable, Reimbursable {
119
121
  /// @notice Handle to the Bridge contract.
120
122
  Bridge public bridge;
121
123
 
124
+ /// @notice Determines the wallet heartbeat request validity time. In other
125
+ /// words, this is the worst-case time for a wallet heartbeat
126
+ /// during which the wallet is busy and canot take other actions.
127
+ /// This is also the duration of the time lock applied to the wallet
128
+ /// once a new heartbeat request is submitted.
129
+ ///
130
+ /// For example, if a deposit sweep proposal was submitted at
131
+ /// 2 pm and heartbeatRequestValidity is 1 hour, the next request or
132
+ /// proposal (of any type) can be submitted after 3 pm.
133
+ uint32 public heartbeatRequestValidity;
134
+
135
+ /// @notice Gas that is meant to balance the heartbeat request overall cost.
136
+ /// Can be updated by the owner based on the current conditions.
137
+ uint32 public heartbeatRequestGasOffset;
138
+
122
139
  /// @notice Determines the deposit sweep proposal validity time. In other
123
140
  /// words, this is the worst-case time for a deposit sweep during
124
141
  /// which the wallet is busy and cannot take another actions. This
@@ -165,7 +182,7 @@ contract WalletCoordinator is OwnableUpgradeable, Reimbursable {
165
182
 
166
183
  /// @notice Gas that is meant to balance the deposit sweep proposal
167
184
  /// submission overall cost. Can be updated by the owner based on
168
- /// the current market conditions.
185
+ /// the current conditions.
169
186
  uint32 public depositSweepProposalSubmissionGasOffset;
170
187
 
171
188
  event CoordinatorAdded(address indexed coordinator);
@@ -174,17 +191,18 @@ contract WalletCoordinator is OwnableUpgradeable, Reimbursable {
174
191
 
175
192
  event WalletManuallyUnlocked(bytes20 indexed walletPubKeyHash);
176
193
 
177
- event DepositSweepProposalValidityUpdated(
178
- uint32 depositSweepProposalValidity
194
+ event HeartbeatRequestParametersUpdated(
195
+ uint32 heartbeatRequestValidity,
196
+ uint32 heartbeatRequestGasOffset
179
197
  );
180
198
 
181
- event DepositMinAgeUpdated(uint32 depositMinAge);
182
-
183
- event DepositRefundSafetyMarginUpdated(uint32 depositRefundSafetyMargin);
184
-
185
- event DepositSweepMaxSizeUpdated(uint16 depositSweepMaxSize);
199
+ event HeartbeatRequestSubmitted(bytes20 walletPubKeyHash, bytes message);
186
200
 
187
- event DepositSweepProposalSubmissionGasOffsetUpdated(
201
+ event DepositSweepProposalParametersUpdated(
202
+ uint32 depositSweepProposalValidity,
203
+ uint32 depositMinAge,
204
+ uint32 depositRefundSafetyMargin,
205
+ uint16 depositSweepMaxSize,
188
206
  uint32 depositSweepProposalSubmissionGasOffset
189
207
  );
190
208
 
@@ -195,7 +213,6 @@ contract WalletCoordinator is OwnableUpgradeable, Reimbursable {
195
213
 
196
214
  modifier onlyCoordinator() {
197
215
  require(isCoordinator[msg.sender], "Caller is not a coordinator");
198
-
199
216
  _;
200
217
  }
201
218
 
@@ -220,11 +237,14 @@ contract WalletCoordinator is OwnableUpgradeable, Reimbursable {
220
237
  // Pre-fetch addresses to save gas later.
221
238
  (, , , reimbursementPool) = _bridge.contractReferences();
222
239
 
240
+ heartbeatRequestValidity = 1 hours;
241
+ heartbeatRequestGasOffset = 5_000;
242
+
223
243
  depositSweepProposalValidity = 4 hours;
224
244
  depositMinAge = 2 hours;
225
245
  depositRefundSafetyMargin = 24 hours;
226
246
  depositSweepMaxSize = 5;
227
- depositSweepProposalSubmissionGasOffset = 25000;
247
+ depositSweepProposalSubmissionGasOffset = 5_000;
228
248
  }
229
249
 
230
250
  /// @notice Adds the given address to the set of coordinator addresses.
@@ -268,61 +288,96 @@ contract WalletCoordinator is OwnableUpgradeable, Reimbursable {
268
288
  emit WalletManuallyUnlocked(walletPubKeyHash);
269
289
  }
270
290
 
271
- /// @notice Updates the value of the depositSweepProposalValidity parameter.
272
- /// @param _depositSweepProposalValidity New value.
291
+ /// @notice Updates parameters related to heartbeat request.
292
+ /// @param _heartbeatRequestValidity The new value of `heartbeatRequestValidity`.
293
+ /// @param _heartbeatRequestGasOffset The new value of `heartbeatRequestGasOffset`.
273
294
  /// @dev Requirements:
274
295
  /// - The caller must be the owner.
275
- function updateDepositSweepProposalValidity(
276
- uint32 _depositSweepProposalValidity
296
+ function updateHeartbeatRequestParameters(
297
+ uint32 _heartbeatRequestValidity,
298
+ uint32 _heartbeatRequestGasOffset
277
299
  ) external onlyOwner {
278
- depositSweepProposalValidity = _depositSweepProposalValidity;
279
- emit DepositSweepProposalValidityUpdated(_depositSweepProposalValidity);
300
+ heartbeatRequestValidity = _heartbeatRequestValidity;
301
+ heartbeatRequestGasOffset = _heartbeatRequestGasOffset;
302
+ emit HeartbeatRequestParametersUpdated(
303
+ _heartbeatRequestValidity,
304
+ _heartbeatRequestGasOffset
305
+ );
280
306
  }
281
307
 
282
- /// @notice Updates the value of the depositMinAge parameter.
283
- /// @param _depositMinAge New value.
308
+ /// @notice Updates parameters related to deposit sweep proposal.
309
+ /// @param _depositSweepProposalValidity The new value of `depositSweepProposalValidity`.
310
+ /// @param _depositMinAge The new value of `depositMinAge`.
311
+ /// @param _depositRefundSafetyMargin The new value of `depositRefundSafetyMargin`.
312
+ /// @param _depositSweepMaxSize The new value of `depositSweepMaxSize`.
284
313
  /// @dev Requirements:
285
314
  /// - The caller must be the owner.
286
- function updateDepositMinAge(uint32 _depositMinAge) external onlyOwner {
315
+ function updateDepositSweepProposalParameters(
316
+ uint32 _depositSweepProposalValidity,
317
+ uint32 _depositMinAge,
318
+ uint32 _depositRefundSafetyMargin,
319
+ uint16 _depositSweepMaxSize,
320
+ uint32 _depositSweepProposalSubmissionGasOffset
321
+ ) external onlyOwner {
322
+ depositSweepProposalValidity = _depositSweepProposalValidity;
287
323
  depositMinAge = _depositMinAge;
288
- emit DepositMinAgeUpdated(_depositMinAge);
289
- }
290
-
291
- /// @notice Updates the value of the depositRefundSafetyMargin parameter.
292
- /// @param _depositRefundSafetyMargin New value.
293
- /// @dev Requirements:
294
- /// - The caller must be the owner.
295
- function updateDepositRefundSafetyMargin(uint32 _depositRefundSafetyMargin)
296
- external
297
- onlyOwner
298
- {
299
324
  depositRefundSafetyMargin = _depositRefundSafetyMargin;
300
- emit DepositRefundSafetyMarginUpdated(_depositRefundSafetyMargin);
325
+ depositSweepMaxSize = _depositSweepMaxSize;
326
+ depositSweepProposalSubmissionGasOffset = _depositSweepProposalSubmissionGasOffset;
327
+
328
+ emit DepositSweepProposalParametersUpdated(
329
+ _depositSweepProposalValidity,
330
+ _depositMinAge,
331
+ _depositRefundSafetyMargin,
332
+ _depositSweepMaxSize,
333
+ _depositSweepProposalSubmissionGasOffset
334
+ );
301
335
  }
302
336
 
303
- /// @notice Updates the value of the depositSweepMaxSize parameter.
304
- /// @param _depositSweepMaxSize New value.
337
+ /// @notice Submits a heartbeat request from the wallet. Locks the wallet
338
+ /// for a specific time, equal to the request validity period.
339
+ /// This function validates the proposed heartbeat messge to see
340
+ /// if it matches the heartbeat format expected by the Bridge.
341
+ /// @param walletPubKeyHash 20-byte public key hash of the wallet that is
342
+ /// supposed to execute the heartbeat.
343
+ /// @param message The proposed heartbeat message for the wallet to sign.
305
344
  /// @dev Requirements:
306
- /// - The caller must be the owner.
307
- function updateDepositSweepMaxSize(uint16 _depositSweepMaxSize)
308
- external
309
- onlyOwner
345
+ /// - The caller is a coordinator,
346
+ /// - The wallet is not time-locked,
347
+ /// - The message to sign is a valid heartbeat message.
348
+ function requestHeartbeat(bytes20 walletPubKeyHash, bytes calldata message)
349
+ public
350
+ onlyCoordinator
351
+ onlyAfterWalletLock(walletPubKeyHash)
310
352
  {
311
- depositSweepMaxSize = _depositSweepMaxSize;
312
- emit DepositSweepMaxSizeUpdated(_depositSweepMaxSize);
353
+ require(
354
+ Heartbeat.isValidHeartbeatMessage(message),
355
+ "Not a valid heartbeat message"
356
+ );
357
+
358
+ walletLock[walletPubKeyHash] = WalletLock(
359
+ /* solhint-disable-next-line not-rely-on-time */
360
+ uint32(block.timestamp) + heartbeatRequestValidity,
361
+ WalletAction.Heartbeat
362
+ );
363
+
364
+ emit HeartbeatRequestSubmitted(walletPubKeyHash, message);
313
365
  }
314
366
 
315
- /// @notice Updates the value of the depositSweepProposalSubmissionGasOffset
316
- /// parameter.
317
- /// @param _depositSweepProposalSubmissionGasOffset New value.
318
- /// @dev Requirements:
319
- /// - The caller must be the owner.
320
- function updateDepositSweepProposalSubmissionGasOffset(
321
- uint32 _depositSweepProposalSubmissionGasOffset
322
- ) external onlyOwner {
323
- depositSweepProposalSubmissionGasOffset = _depositSweepProposalSubmissionGasOffset;
324
- emit DepositSweepProposalSubmissionGasOffsetUpdated(
325
- _depositSweepProposalSubmissionGasOffset
367
+ /// @notice Wraps `requestHeartbeat` call and reimburses the caller's
368
+ /// transaction cost.
369
+ /// @dev See `requestHeartbeat` function documentation.
370
+ function requestHeartbeatWithReimbursement(
371
+ bytes20 walletPubKeyHash,
372
+ bytes calldata message
373
+ ) external {
374
+ uint256 gasStart = gasleft();
375
+
376
+ requestHeartbeat(walletPubKeyHash, message);
377
+
378
+ reimbursementPool.refund(
379
+ (gasStart - gasleft()) + heartbeatRequestGasOffset,
380
+ msg.sender
326
381
  );
327
382
  }
328
383