@keep-network/tbtc-v2 1.0.0-dev.3 → 1.0.0-dev.5

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 (105) 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 +11 -11
  10. package/artifacts/BridgeGovernanceParameters.json +12 -9
  11. package/artifacts/Deposit.json +2 -2
  12. package/artifacts/DepositSweep.json +2 -2
  13. package/artifacts/EcdsaDkgValidator.json +1 -1
  14. package/artifacts/EcdsaInactivity.json +1 -1
  15. package/artifacts/EcdsaSortitionPool.json +3 -3
  16. package/artifacts/Fraud.json +2 -2
  17. package/artifacts/KeepRegistry.json +1 -1
  18. package/artifacts/KeepStake.json +2 -2
  19. package/artifacts/KeepToken.json +2 -2
  20. package/artifacts/KeepTokenStaking.json +1 -1
  21. package/artifacts/LightRelay.json +18 -18
  22. package/artifacts/MaintainerProxy.json +19 -19
  23. package/artifacts/MovingFunds.json +2 -2
  24. package/artifacts/NuCypherStakingEscrow.json +1 -1
  25. package/artifacts/NuCypherToken.json +2 -2
  26. package/artifacts/RandomBeacon.json +2 -2
  27. package/artifacts/RandomBeaconChaosnet.json +2 -2
  28. package/artifacts/RandomBeaconGovernance.json +2 -2
  29. package/artifacts/Redemption.json +2 -2
  30. package/artifacts/ReimbursementPool.json +2 -2
  31. package/artifacts/T.json +2 -2
  32. package/artifacts/TBTC.json +3 -3
  33. package/artifacts/TBTCToken.json +3 -3
  34. package/artifacts/TBTCVault.json +23 -23
  35. package/artifacts/TokenStaking.json +1 -1
  36. package/artifacts/TokenholderGovernor.json +9 -9
  37. package/artifacts/TokenholderTimelock.json +8 -8
  38. package/artifacts/VendingMachine.json +10 -10
  39. package/artifacts/VendingMachineKeep.json +1 -1
  40. package/artifacts/VendingMachineNuCypher.json +1 -1
  41. package/artifacts/WalletRegistry.json +5 -5
  42. package/artifacts/WalletRegistryGovernance.json +2 -2
  43. package/artifacts/Wallets.json +2 -2
  44. package/artifacts/solcInputs/{e28c3bed541f57346a362a67f66ae471.json → b63dab89a2e89a0f54eb7f775a5bd516.json} +1 -1
  45. package/artifacts/solcInputs/{b448960fd13167193eb1e0994f1c8e1c.json → c88caf1374ff7ffc912d8c7e982bd645.json} +2 -2
  46. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  47. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  48. package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +1 -1
  49. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  50. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  51. package/build/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.dbg.json +1 -1
  52. package/build/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.json +136 -152
  53. package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.dbg.json +1 -1
  54. package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.json +2 -2
  55. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  56. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  57. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +1 -1
  58. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  59. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
  60. package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +1 -1
  61. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  62. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  63. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
  64. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
  65. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  66. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  67. package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.dbg.json +1 -1
  68. package/build/contracts/relay/LightRelay.sol/ILightRelay.dbg.json +1 -1
  69. package/build/contracts/relay/LightRelay.sol/LightRelay.dbg.json +1 -1
  70. package/build/contracts/relay/LightRelay.sol/RelayUtils.dbg.json +1 -1
  71. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  72. package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +1 -1
  73. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  74. package/build/contracts/vault/TBTCOptimisticMinting.sol/TBTCOptimisticMinting.dbg.json +1 -1
  75. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  76. package/contracts/bridge/BridgeGovernance.sol +150 -129
  77. package/contracts/bridge/BridgeGovernanceParameters.sol +0 -321
  78. package/deploy/06_deploy_bridge.ts +2 -1
  79. package/export/artifacts/contracts/bridge/Bridge.sol/Bridge.json +181 -181
  80. package/export/artifacts/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.json +2128 -2904
  81. package/export/artifacts/contracts/bridge/VendingMachine.sol/VendingMachine.json +67 -67
  82. package/export/artifacts/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.json +88 -88
  83. package/export/artifacts/contracts/relay/LightRelay.sol/LightRelay.json +57 -57
  84. package/export/artifacts/contracts/test/BankStub.sol/BankStub.json +2 -2
  85. package/export/artifacts/contracts/test/BridgeStub.sol/BridgeStub.json +217 -217
  86. package/export/artifacts/contracts/test/GoerliLightRelay.sol/GoerliLightRelay.json +57 -57
  87. package/export/artifacts/contracts/test/HeartbeatStub.sol/HeartbeatStub.json +4 -4
  88. package/export/artifacts/contracts/test/LightRelayStub.sol/LightRelayStub.json +59 -59
  89. package/export/artifacts/contracts/test/ReceiveApprovalStub.sol/ReceiveApprovalStub.json +7 -7
  90. package/export/artifacts/contracts/test/SystemTestRelay.sol/SystemTestRelay.json +14 -14
  91. package/export/artifacts/contracts/test/TestERC20.sol/TestERC20.json +6 -6
  92. package/export/artifacts/contracts/test/TestERC721.sol/TestERC721.json +8 -8
  93. package/export/artifacts/contracts/test/TestEcdsaLib.sol/TestEcdsaLib.json +4 -4
  94. package/export/artifacts/contracts/token/TBTC.sol/TBTC.json +2 -2
  95. package/export/artifacts/contracts/vault/DonationVault.sol/DonationVault.json +11 -11
  96. package/export/artifacts/contracts/vault/TBTCVault.sol/TBTCVault.json +133 -133
  97. package/export/deploy/06_deploy_bridge.js +2 -1
  98. package/export/tasks/test-utils.js +133 -43
  99. package/export/test/integration/data/bls.js +12 -0
  100. package/export/test/integration/data/integration.js +133 -0
  101. package/export/test/integration/utils/random-beacon.js +193 -0
  102. package/export/typechain/factories/BridgeGovernanceParameters__factory.js +1 -1
  103. package/export/typechain/factories/BridgeGovernance__factory.js +1 -1
  104. package/package.json +3 -3
  105. package/tasks/test-utils.ts +88 -4
@@ -90,7 +90,8 @@ var func = function (hre) {
90
90
  case 5:
91
91
  ReimbursementPool = _h.sent();
92
92
  txProofDifficultyFactor = deployments.getNetworkName() === "hardhat" ||
93
- deployments.getNetworkName() === "development"
93
+ deployments.getNetworkName() === "development" ||
94
+ deployments.getNetworkName() === "system_tests"
94
95
  ? 1
95
96
  : 6;
96
97
  deployOptions = {
@@ -37,11 +37,17 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
38
38
  }
39
39
  };
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
40
43
  Object.defineProperty(exports, "__esModule", { value: true });
41
44
  var config_1 = require("hardhat/config");
42
45
  var staking_1 = require("../test/integration/utils/staking");
43
46
  var ecdsa_wallet_registry_1 = require("../test/integration/utils/ecdsa-wallet-registry");
44
- (0, config_1.task)("test-utils:register-operators", "Registers operators in the sortition pool")
47
+ var integration_1 = require("../test/integration/data/integration");
48
+ var bls_1 = __importDefault(require("../test/integration/data/bls"));
49
+ var random_beacon_1 = require("../test/integration/utils/random-beacon");
50
+ (0, config_1.task)("test-utils:register-operators", "Registers operators in the sortition pools")
45
51
  .addOptionalParam("numberOfOperators", "Number of operators to register", 110, config_1.types.int)
46
52
  .addOptionalParam("unnamedSignersOffset", "Offset indicating the unnamed signers", 0, config_1.types.int)
47
53
  .addOptionalParam("stakeAmount", "Amount of each operator's stake", "40000000000000000000000", config_1.types.string)
@@ -75,35 +81,58 @@ var ecdsa_wallet_registry_1 = require("../test/integration/utils/ecdsa-wallet-re
75
81
  }); });
76
82
  function registerOperators(hre, numberOfOperators, unnamedSignersOffset, stakeAmount) {
77
83
  return __awaiter(this, void 0, void 0, function () {
78
- var helpers, walletRegistry, sortitionPool, t, staking, signers, i, owner, stakingProvider, operator, beneficiary, authorizer;
79
- return __generator(this, function (_a) {
80
- switch (_a.label) {
84
+ var helpers, chaosnetOwner, walletRegistry, ecdsaSortitionPool, t, staking, randomBeacon, beaconSortitionPool, signers, i, owner, stakingProvider, operator, beneficiary, authorizer, _a, _b;
85
+ return __generator(this, function (_c) {
86
+ switch (_c.label) {
81
87
  case 0:
82
88
  helpers = hre.helpers;
83
- return [4 /*yield*/, helpers.contracts.getContract("WalletRegistry")];
89
+ return [4 /*yield*/, helpers.signers.getNamedSigners()];
84
90
  case 1:
85
- walletRegistry = _a.sent();
86
- return [4 /*yield*/, helpers.contracts.getContract("EcdsaSortitionPool")];
91
+ chaosnetOwner = (_c.sent()).chaosnetOwner;
92
+ return [4 /*yield*/, helpers.contracts.getContract("WalletRegistry")];
87
93
  case 2:
88
- sortitionPool = _a.sent();
89
- return [4 /*yield*/, helpers.contracts.getContract("T")];
94
+ walletRegistry = _c.sent();
95
+ return [4 /*yield*/, helpers.contracts.getContract("EcdsaSortitionPool")];
90
96
  case 3:
91
- t = _a.sent();
92
- return [4 /*yield*/, helpers.contracts.getContract("TokenStaking")];
97
+ ecdsaSortitionPool = _c.sent();
98
+ return [4 /*yield*/, helpers.contracts.getContract("T")];
93
99
  case 4:
94
- staking = _a.sent();
95
- return [4 /*yield*/, helpers.signers.getUnnamedSigners()];
100
+ t = _c.sent();
101
+ return [4 /*yield*/, helpers.contracts.getContract("TokenStaking")];
96
102
  case 5:
97
- signers = (_a.sent()).slice(unnamedSignersOffset);
103
+ staking = _c.sent();
104
+ return [4 /*yield*/, ecdsaSortitionPool.isChaosnetActive()];
105
+ case 6:
106
+ if (!_c.sent()) return [3 /*break*/, 8];
107
+ return [4 /*yield*/, ecdsaSortitionPool.connect(chaosnetOwner).deactivateChaosnet()];
108
+ case 7:
109
+ _c.sent();
110
+ _c.label = 8;
111
+ case 8: return [4 /*yield*/, helpers.contracts.getContract("RandomBeacon")];
112
+ case 9:
113
+ randomBeacon = _c.sent();
114
+ return [4 /*yield*/, helpers.contracts.getContract("BeaconSortitionPool")];
115
+ case 10:
116
+ beaconSortitionPool = _c.sent();
117
+ return [4 /*yield*/, beaconSortitionPool.isChaosnetActive()];
118
+ case 11:
119
+ if (!_c.sent()) return [3 /*break*/, 13];
120
+ return [4 /*yield*/, beaconSortitionPool.connect(chaosnetOwner).deactivateChaosnet()];
121
+ case 12:
122
+ _c.sent();
123
+ _c.label = 13;
124
+ case 13: return [4 /*yield*/, helpers.signers.getUnnamedSigners()];
125
+ case 14:
126
+ signers = (_c.sent()).slice(unnamedSignersOffset);
98
127
  // We use unique accounts for each staking role for each operator.
99
128
  if (signers.length < numberOfOperators * 5) {
100
129
  throw new Error("not enough unnamed signers; update hardhat network's configuration account count");
101
130
  }
102
131
  console.log("Starting registration of ".concat(numberOfOperators, " operators"));
103
132
  i = 0;
104
- _a.label = 6;
105
- case 6:
106
- if (!(i < numberOfOperators)) return [3 /*break*/, 11];
133
+ _c.label = 15;
134
+ case 15:
135
+ if (!(i < numberOfOperators)) return [3 /*break*/, 24];
107
136
  owner = signers[i];
108
137
  stakingProvider = signers[1 * numberOfOperators + i];
109
138
  operator = signers[2 * numberOfOperators + i];
@@ -111,19 +140,32 @@ function registerOperators(hre, numberOfOperators, unnamedSignersOffset, stakeAm
111
140
  authorizer = signers[4 * numberOfOperators + i];
112
141
  console.log("Registering operator ".concat(i, " with address ").concat(operator.address));
113
142
  return [4 /*yield*/, (0, staking_1.stake)(hre, t, staking, stakeAmount, owner, stakingProvider.address, beneficiary.address, authorizer.address)];
114
- case 7:
115
- _a.sent();
143
+ case 16:
144
+ _c.sent();
116
145
  return [4 /*yield*/, (0, staking_1.authorizeApplication)(staking, walletRegistry.address, authorizer, stakingProvider.address, stakeAmount)];
117
- case 8:
118
- _a.sent();
119
- return [4 /*yield*/, (0, ecdsa_wallet_registry_1.registerOperator)(walletRegistry, sortitionPool, stakingProvider, operator)];
120
- case 9:
121
- _a.sent();
122
- _a.label = 10;
123
- case 10:
146
+ case 17:
147
+ _c.sent();
148
+ return [4 /*yield*/, (0, staking_1.authorizeApplication)(staking, randomBeacon.address, authorizer, stakingProvider.address, stakeAmount)];
149
+ case 18:
150
+ _c.sent();
151
+ return [4 /*yield*/, (0, ecdsa_wallet_registry_1.registerOperator)(walletRegistry, ecdsaSortitionPool, stakingProvider, operator)];
152
+ case 19:
153
+ _c.sent();
154
+ _b = (_a = randomBeacon
155
+ .connect(stakingProvider))
156
+ .registerOperator;
157
+ return [4 /*yield*/, operator.getAddress()];
158
+ case 20: return [4 /*yield*/, _b.apply(_a, [_c.sent()])];
159
+ case 21:
160
+ _c.sent();
161
+ return [4 /*yield*/, randomBeacon.connect(operator).joinSortitionPool()];
162
+ case 22:
163
+ _c.sent();
164
+ _c.label = 23;
165
+ case 23:
124
166
  i++;
125
- return [3 /*break*/, 6];
126
- case 11:
167
+ return [3 /*break*/, 15];
168
+ case 24:
127
169
  console.log("Registered ".concat(numberOfOperators, " sortition pool operators"));
128
170
  return [2 /*return*/];
129
171
  }
@@ -132,23 +174,71 @@ function registerOperators(hre, numberOfOperators, unnamedSignersOffset, stakeAm
132
174
  }
133
175
  function createWallet(hre, walletPublicKey) {
134
176
  return __awaiter(this, void 0, void 0, function () {
135
- var ethers, helpers, governance, bridge, walletRegistry, walletRegistryGovernance, requestNewWalletTx;
136
- return __generator(this, function (_a) {
137
- switch (_a.label) {
177
+ var ethers, helpers, governance, bridge, walletRegistry, walletRegistryGovernance, randomBeacon, randomBeaconGovernance, genesisTx, genesisBlock, genesisSeed, sortitionPool, signers, _a, members, signingMembersIndices, signaturesBytes, membersHash, dkgResult, submitter, requestNewWalletTx;
178
+ return __generator(this, function (_b) {
179
+ switch (_b.label) {
138
180
  case 0:
139
181
  ethers = hre.ethers, helpers = hre.helpers;
140
182
  return [4 /*yield*/, helpers.signers.getNamedSigners()];
141
183
  case 1:
142
- governance = (_a.sent()).governance;
184
+ governance = (_b.sent()).governance;
143
185
  return [4 /*yield*/, helpers.contracts.getContract("Bridge")];
144
186
  case 2:
145
- bridge = _a.sent();
187
+ bridge = _b.sent();
146
188
  return [4 /*yield*/, helpers.contracts.getContract("WalletRegistry")];
147
189
  case 3:
148
- walletRegistry = _a.sent();
190
+ walletRegistry = _b.sent();
149
191
  return [4 /*yield*/, helpers.contracts.getContract("WalletRegistryGovernance")];
150
192
  case 4:
151
- walletRegistryGovernance = _a.sent();
193
+ walletRegistryGovernance = _b.sent();
194
+ return [4 /*yield*/, helpers.contracts.getContract("RandomBeacon")];
195
+ case 5:
196
+ randomBeacon = _b.sent();
197
+ return [4 /*yield*/, helpers.contracts.getContract("RandomBeaconGovernance")];
198
+ case 6:
199
+ randomBeaconGovernance = _b.sent();
200
+ return [4 /*yield*/, (0, random_beacon_1.updateDkgResultChallengePeriodLength)(hre, governance, randomBeaconGovernance)];
201
+ case 7:
202
+ _b.sent();
203
+ return [4 /*yield*/, randomBeacon.genesis()];
204
+ case 8:
205
+ genesisTx = _b.sent();
206
+ genesisBlock = genesisTx.blockNumber;
207
+ return [4 /*yield*/, (0, random_beacon_1.getGenesisSeed)(hre, genesisBlock)];
208
+ case 9:
209
+ genesisSeed = _b.sent();
210
+ return [4 /*yield*/, helpers.time.mineBlocksTo(genesisBlock + integration_1.offchainDkgTime + 1)];
211
+ case 10:
212
+ _b.sent();
213
+ return [4 /*yield*/, helpers.contracts.getContract("BeaconSortitionPool")];
214
+ case 11:
215
+ sortitionPool = _b.sent();
216
+ return [4 /*yield*/, (0, random_beacon_1.selectGroup)(hre, sortitionPool, genesisSeed)];
217
+ case 12:
218
+ signers = _b.sent();
219
+ return [4 /*yield*/, (0, random_beacon_1.signDkgResult)(hre, signers, bls_1.default.groupPubKey, [], genesisBlock, 33)];
220
+ case 13:
221
+ _a = _b.sent(), members = _a.members, signingMembersIndices = _a.signingMembersIndices, signaturesBytes = _a.signaturesBytes;
222
+ membersHash = (0, random_beacon_1.hashDKGMembers)(hre, members, []);
223
+ dkgResult = {
224
+ submitterMemberIndex: 1,
225
+ groupPubKey: bls_1.default.groupPubKey,
226
+ misbehavedMembersIndices: [],
227
+ signatures: signaturesBytes,
228
+ signingMembersIndices: signingMembersIndices,
229
+ members: members,
230
+ membersHash: membersHash,
231
+ };
232
+ submitter = signers[0].signer;
233
+ return [4 /*yield*/, randomBeacon.connect(submitter).submitDkgResult(dkgResult)];
234
+ case 14:
235
+ _b.sent();
236
+ return [4 /*yield*/, helpers.time.mineBlocks(integration_1.dkgResultChallengePeriodLength + 1)];
237
+ case 15:
238
+ _b.sent();
239
+ return [4 /*yield*/, randomBeacon.connect(submitter).approveDkgResult(dkgResult)];
240
+ case 16:
241
+ _b.sent();
152
242
  return [4 /*yield*/, bridge.requestNewWallet({
153
243
  txHash: ethers.constants.HashZero,
154
244
  txOutputIndex: 0,
@@ -158,8 +248,8 @@ function createWallet(hre, walletPublicKey) {
158
248
  // task environment. In order to provide a relay entry to the registry, we
159
249
  // set the governance as the random beacon and provide a relay entry as usual.
160
250
  ];
161
- case 5:
162
- requestNewWalletTx = _a.sent();
251
+ case 17:
252
+ requestNewWalletTx = _b.sent();
163
253
  // Using smock to make a fake RandomBeacon instance does not work in the
164
254
  // task environment. In order to provide a relay entry to the registry, we
165
255
  // set the governance as the random beacon and provide a relay entry as usual.
@@ -168,21 +258,21 @@ function createWallet(hre, walletPublicKey) {
168
258
  .upgradeRandomBeacon(governance.address)
169
259
  // eslint-disable-next-line no-underscore-dangle
170
260
  ];
171
- case 6:
261
+ case 18:
172
262
  // Using smock to make a fake RandomBeacon instance does not work in the
173
263
  // task environment. In order to provide a relay entry to the registry, we
174
264
  // set the governance as the random beacon and provide a relay entry as usual.
175
- _a.sent();
265
+ _b.sent();
176
266
  // eslint-disable-next-line no-underscore-dangle
177
267
  return [4 /*yield*/, walletRegistry
178
268
  .connect(governance)
179
269
  .__beaconCallback(ethers.utils.randomBytes(32), 0)];
180
- case 7:
270
+ case 19:
181
271
  // eslint-disable-next-line no-underscore-dangle
182
- _a.sent();
272
+ _b.sent();
183
273
  return [4 /*yield*/, (0, ecdsa_wallet_registry_1.performEcdsaDkg)(hre, walletRegistry, walletPublicKey, requestNewWalletTx.blockNumber)];
184
- case 8:
185
- _a.sent();
274
+ case 20:
275
+ _b.sent();
186
276
  console.log("Created wallet with public key ".concat(walletPublicKey));
187
277
  return [2 /*return*/];
188
278
  }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var blsData = {
4
+ // data generated using master secret key 123
5
+ secretKey: 123,
6
+ // altbn128 public key for secret key 123. For implementation details refer to bls_test.go
7
+ groupPubKey: "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de3" +
8
+ "8d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722" +
9
+ "ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908" +
10
+ "c7f475c5b3a7628ce26d696436eab0b0148034dfcd",
11
+ };
12
+ exports.default = blsData;
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.offchainDkgTime = exports.dkgResultChallengePeriodLength = exports.governanceDelay = exports.redemptionData = exports.depositSweepData = exports.revealDepositData = exports.NO_MAIN_UTXO = exports.walletPubKeyHash = exports.walletPublicKey = void 0;
4
+ /**
5
+ * Wallet public key as uncompressed and un-prefixed public key X and Y
6
+ * coordinates derived from the compressed public key
7
+ * 03989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d9
8
+ */
9
+ exports.walletPublicKey = "0x989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d9d218b65" +
10
+ "e7d91c752f7b22eaceb771a9af3a6f3d3f010a5d471a1aeef7d7713af";
11
+ /**
12
+ * Wallet public key hash calculated as HASH160 of compressed public key
13
+ * 03989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d9
14
+ */
15
+ exports.walletPubKeyHash = "0x8db50eb52063ea9d98b3eac91489a90f738986f6";
16
+ /**
17
+ * Data used to indicate that the wallet does not have the main UTXO set
18
+ */
19
+ exports.NO_MAIN_UTXO = {
20
+ txHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
21
+ txOutputIndex: 0,
22
+ txOutputValue: 0,
23
+ };
24
+ /**
25
+ * Test data based on a testnet deposit transaction:
26
+ * https://live.blockcypher.com/btc-testnet/tx/c872fb11bbca1241aced71c692e7d0b0cf46aadb390ce66ddfcf5fbd8e5bc26f/
27
+ */
28
+ exports.revealDepositData = {
29
+ fundingTx: {
30
+ version: "0x01000000",
31
+ inputVector: "0x0176f251d17d821b938e39b508cd3e02233d71d9b9bfe387a42a050023d3788edb01" +
32
+ "00000000ffffffff",
33
+ outputVector: "0x02a08601000000000022002086a303cdd2e2eab1d1679f1a813835dc5a1b65321077" +
34
+ "cdccaf08f98cbf04ca96ba2c0e0000000000160014e257eccafbc07c381642ce6e7e55" +
35
+ "120fb077fbed",
36
+ locktime: "0x00000000",
37
+ },
38
+ depositor: "0x934B98637cA318a4D6E7CA6ffd1690b8e77df637",
39
+ reveal: {
40
+ fundingOutputIndex: 0,
41
+ blindingFactor: "0xf9f0c90d00039523",
42
+ // HASH160 of 03989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d9.
43
+ walletPubKeyHash: "0x8db50eb52063ea9d98b3eac91489a90f738986f6",
44
+ // HASH160 of 0300d6f28a2f6bf9836f57fcda5d284c9a8f849316119779f0d6090830d97763a9.
45
+ refundPubKeyHash: "0xe257eccafbc07c381642ce6e7e55120fb077fbed",
46
+ refundLocktime: "0xe0250162",
47
+ vault: "0x0000000000000000000000000000000000000000",
48
+ },
49
+ };
50
+ /**
51
+ * Test data based on a deposit sweep transaction:
52
+ * https://live.blockcypher.com/btc-testnet/tx/0aa0af5a6de05a7be990ca47f7a523df872b29a0f3be3d54cd99a6a6d43a1366/
53
+ */
54
+ exports.depositSweepData = {
55
+ sweepTx: {
56
+ // little endian
57
+ hash: "0x66133ad4a6a699cd543dbef3a0292b87df23a5f747ca90e97b5ae06d5aafa00a",
58
+ version: "0x01000000",
59
+ inputVector: "0x016fc25b8ebd5fcfdf6de60c39dbaa46cfb0d0e792c671edac4112cabb11fb72c80" +
60
+ "000000000ffffffff",
61
+ outputVector: "0x0160800100000000001600148db50eb52063ea9d98b3eac91489a90f738986f6",
62
+ locktime: "0x00000000",
63
+ },
64
+ sweepProof: {
65
+ merkleProof: "0xd2d2ec32d817f4cba2834f129c14cf6a201cc6c7d117e996055ce03d891e6e01fc9" +
66
+ "9387d8210318ea8f0b1fd3b0b873f17098562dc81ca666587bc57fc656ad30f4093b0" +
67
+ "0c6e65abe9603552cd9b0ced0c896574f9ecc01297625d2951951e42ffde1c2fbad8e" +
68
+ "49d263870b9672ff2da607d310717a6e6fe5bc4d5a690da2417e20a39c76cffda21d3" +
69
+ "e0ce36c1b382e92b78cd09b5c63ba1d7b0098d88148190",
70
+ txIndexInBlock: 5,
71
+ bitcoinHeaders: "0x00e0ff3f0b7757387203041464703bb7d3ae57954c8a30003efd084eb3000000000" +
72
+ "000006c900bb840b7b4cce593dfff74567d5e933ce5f516359549d52c9c9e968a413d" +
73
+ "4afc8f628886021aff93302f00400020cd4746c5454705245006c0b45be789f6471a8" +
74
+ "e2078bb7fd637020000000000005bbffa9b6298c97ba38ed8dc3bd0391db26925f686" +
75
+ "f43a291e52966b780a387556fc8f628886021acfc87ec900008020ab51d62a13dbd5c" +
76
+ "a691b27ccc0d7e993533e0585ed9ed2a8c2010000000000007c36f5e45f083edc4b8a" +
77
+ "8219453b32900f601d5b5874004e94cfa99de2d6e2e158fc8f628886021a153aef4b0" +
78
+ "0a0c3219db742d6b771cc751b754d91b4979adf02e9515ba7fe263292000000000000" +
79
+ "003a267be82ccf921d65d7ad64bdf94b600de661cb8c5674a4123ef4fdd17b76a2a0f" +
80
+ "c8f628886021a61450f9600006020594a0c528455406b771150750d67cbc1c436386e" +
81
+ "2a02e4d933010000000000007c9ce5d550804761ebbc8d533d10f959eda17dc5497ba" +
82
+ "3dc59eda45c085c005015fd8f628886021a51e22cca00008020f5c97ab8177d24ed69" +
83
+ "c30e5f47a406b2f28bc4c55ecf7c2475010000000000009924355d4ead5123b9182df" +
84
+ "f31c16482081ab751ce4de58ab765513cf1ee30c76ffd8f628886021a9334731a0000" +
85
+ "0020a420df9e874f05566015e8b201a0988280e7affc4f93c2807b020000000000003" +
86
+ "efbfe9eca35bf2be96866779ae9bc3543587879d3b04cba026e3666c6b1e1280ffe8f" +
87
+ "628886021a3482464e",
88
+ },
89
+ mainUtxo: exports.NO_MAIN_UTXO,
90
+ chainDifficulty: 6642991,
91
+ };
92
+ /**
93
+ * Test data based on a testnet redemption transaction:
94
+ * https://live.blockcypher.com/btc-testnet/tx/14b6c9b70530ff0cabd1d28513bf82a7c2781da0ce3bc50df72e2a1b6745e36e/
95
+ */
96
+ exports.redemptionData = {
97
+ redemptionTx: {
98
+ // little endian
99
+ hash: "0x6ee345671b2a2ef70dc53bcea01d78c2a782bf1385d2d1ab0cff3005b7c9b614",
100
+ version: "0x01000000",
101
+ inputVector: "0x0166133ad4a6a699cd543dbef3a0292b87df23a5f747ca90e97b5ae06d5aafa00a00" +
102
+ "00000000ffffffff",
103
+ outputVector: "0x02279c00000000000017a91486884e6be1525dab5ae0b451bd2c72cee67dcf418729" +
104
+ "bd0000000000001600148db50eb52063ea9d98b3eac91489a90f738986f6",
105
+ locktime: "0x00000000",
106
+ },
107
+ redemptionProof: {
108
+ merkleProof: "0xbbd3856c4905b3ad333b0c983ec8054037f4aee063ebf11e616a5de184ebadcbb89b" +
109
+ "63b065209daf4a02c791569e3b8dd9b757ec3ca0987bb8350c4262a3cd23ac4914f3f6" +
110
+ "3b8662f63c74d4fb45c4d17321b62dfb963be7d86edba9ad0019070462084966bce982" +
111
+ "617181989be75de2a5d979ec5b9e464b965b32b073d9824d",
112
+ txIndexInBlock: 3,
113
+ bitcoinHeaders: "0x0020002075c389e96e3f51146e7721971c3475a9c6c34d65f0570c96040100000000" +
114
+ "0000b19c82d8511a85bd8ab761c3247b10359b4808a360f505834814a66ac9bc493532" +
115
+ "d490628886021ae4bc58ab0000e0205ba8b6dbc9549bada90b659462a297769da473b3" +
116
+ "716016c36a02000000000000bb1d2c391a063c6a7033737ef7aa0f527505dc1f1ad5e9" +
117
+ "e3a94dd742bf58b98381d490628886021a2f4bc8dd00200020cda405cc32aab0e33d7d" +
118
+ "44d0bf494288ad77a170ccf98d08820000000000000041e22ae5c9fbee788909afeccd" +
119
+ "d1afa3bf73e559af3fe54e581d12a1bf5a13ff84d490628886021ac33913c200c03f28" +
120
+ "67a0223297ab9988f8b0d0aa1b86dcb9d5148644f8fe7b523501000000000000729c46" +
121
+ "406357331e606a917f5e5bda15f52f279b80deb56ba9a82c5a2533b3e6b7d490628886" +
122
+ "021a76ee51250000262bed6a4dd34cb4f7dbe3d2635a1aeb53ec4a2e66254e060559ba" +
123
+ "010000000000007c91333dcdd3f36fbe2e984105046c4f44eafbbad83d1ed83d62c6c4" +
124
+ "f410b32ec2d490628886021a1bc0509d0000a0207bffc975d2f879018901c33f7c0994" +
125
+ "5b8456b0da414605ca0a00000000000000426a4dbc2b68663d750cf29e57b9e521895e" +
126
+ "ad57f73696be93e08d485e05d36fcfd490628886021a786a19ef008000209d30775f9f" +
127
+ "4f6452fcc83c6a1e54a9010c65b0af1791405989000000000000007b118930c4716d17" +
128
+ "ea8e5322cf029014be251ac968f38d8cdcfdcdf6cff8e4fdeed490628886021ab1663024",
129
+ },
130
+ };
131
+ exports.governanceDelay = 604800;
132
+ exports.dkgResultChallengePeriodLength = 100;
133
+ exports.offchainDkgTime = 72;
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ /* eslint-disable no-await-in-loop */
3
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
+ return new (P || (P = Promise))(function (resolve, reject) {
6
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
10
+ });
11
+ };
12
+ var __generator = (this && this.__generator) || function (thisArg, body) {
13
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
14
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
15
+ function verb(n) { return function (v) { return step([n, v]); }; }
16
+ function step(op) {
17
+ if (f) throw new TypeError("Generator is already executing.");
18
+ while (_) try {
19
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
20
+ if (y = 0, t) op = [op[0] & 2, t.value];
21
+ switch (op[0]) {
22
+ case 0: case 1: t = op; break;
23
+ case 4: _.label++; return { value: op[1], done: false };
24
+ case 5: _.label++; y = op[1]; op = [0]; continue;
25
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
26
+ default:
27
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
28
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
29
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
30
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
31
+ if (t[2]) _.ops.pop();
32
+ _.trys.pop(); continue;
33
+ }
34
+ op = body.call(thisArg, _);
35
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
36
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
37
+ }
38
+ };
39
+ var __read = (this && this.__read) || function (o, n) {
40
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
41
+ if (!m) return o;
42
+ var i = m.call(o), r, ar = [], e;
43
+ try {
44
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
45
+ }
46
+ catch (error) { e = { error: error }; }
47
+ finally {
48
+ try {
49
+ if (r && !r.done && (m = i["return"])) m.call(i);
50
+ }
51
+ finally { if (e) throw e.error; }
52
+ }
53
+ return ar;
54
+ };
55
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
56
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
57
+ if (ar || !(i in from)) {
58
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
59
+ ar[i] = from[i];
60
+ }
61
+ }
62
+ return to.concat(ar || Array.prototype.slice.call(from));
63
+ };
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ exports.hashDKGMembers = exports.signDkgResult = exports.selectGroup = exports.getGenesisSeed = exports.updateDkgResultChallengePeriodLength = void 0;
66
+ var integration_1 = require("../data/integration");
67
+ function updateDkgResultChallengePeriodLength(hre, governance, randomBeaconGovernance) {
68
+ return __awaiter(this, void 0, void 0, function () {
69
+ var helpers;
70
+ return __generator(this, function (_a) {
71
+ switch (_a.label) {
72
+ case 0:
73
+ helpers = hre.helpers;
74
+ return [4 /*yield*/, randomBeaconGovernance
75
+ .connect(governance)
76
+ .beginDkgResultChallengePeriodLengthUpdate(integration_1.dkgResultChallengePeriodLength)];
77
+ case 1:
78
+ _a.sent();
79
+ return [4 /*yield*/, helpers.time.increaseTime(integration_1.governanceDelay)];
80
+ case 2:
81
+ _a.sent();
82
+ return [4 /*yield*/, randomBeaconGovernance
83
+ .connect(governance)
84
+ .finalizeDkgResultChallengePeriodLengthUpdate()];
85
+ case 3:
86
+ _a.sent();
87
+ return [2 /*return*/];
88
+ }
89
+ });
90
+ });
91
+ }
92
+ exports.updateDkgResultChallengePeriodLength = updateDkgResultChallengePeriodLength;
93
+ function getGenesisSeed(hre, genesisBlock) {
94
+ return __awaiter(this, void 0, void 0, function () {
95
+ var ethers;
96
+ return __generator(this, function (_a) {
97
+ ethers = hre.ethers;
98
+ return [2 /*return*/, ethers.BigNumber.from(ethers.utils.keccak256(ethers.utils.solidityPack(["uint256", "uint256"], [
99
+ "31415926535897932384626433832795028841971693993751058209749445923078164062862",
100
+ genesisBlock,
101
+ ])))];
102
+ });
103
+ });
104
+ }
105
+ exports.getGenesisSeed = getGenesisSeed;
106
+ function selectGroup(hre, sortitionPool, seed) {
107
+ return __awaiter(this, void 0, void 0, function () {
108
+ var ethers, identifiers, addresses;
109
+ var _this = this;
110
+ return __generator(this, function (_a) {
111
+ switch (_a.label) {
112
+ case 0:
113
+ ethers = hre.ethers;
114
+ return [4 /*yield*/, sortitionPool.selectGroup(64, ethers.utils.hexZeroPad(seed.toHexString(), 32))];
115
+ case 1:
116
+ identifiers = _a.sent();
117
+ return [4 /*yield*/, sortitionPool.getIDOperators(identifiers)];
118
+ case 2:
119
+ addresses = _a.sent();
120
+ return [2 /*return*/, Promise.all(identifiers.map(function (identifier, i) { return __awaiter(_this, void 0, void 0, function () {
121
+ var _a;
122
+ return __generator(this, function (_b) {
123
+ switch (_b.label) {
124
+ case 0:
125
+ _a = {
126
+ id: identifier
127
+ };
128
+ return [4 /*yield*/, ethers.getSigner(addresses[i])];
129
+ case 1: return [2 /*return*/, (_a.signer = _b.sent(),
130
+ _a)];
131
+ }
132
+ });
133
+ }); }))];
134
+ }
135
+ });
136
+ });
137
+ }
138
+ exports.selectGroup = selectGroup;
139
+ function signDkgResult(hre, signers, groupPublicKey, misbehavedMembersIndices, startBlock, numberOfSignatures) {
140
+ return __awaiter(this, void 0, void 0, function () {
141
+ var ethers, hardhatNetworkId, resultHash, members, signingMembersIndices, signatures, i, _a, id, ethersSigner, signerIndex, signature, signaturesBytes;
142
+ return __generator(this, function (_b) {
143
+ switch (_b.label) {
144
+ case 0:
145
+ ethers = hre.ethers;
146
+ hardhatNetworkId = 31337;
147
+ resultHash = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(["uint256", "bytes", "uint8[]", "uint256"], [hardhatNetworkId, groupPublicKey, misbehavedMembersIndices, startBlock]));
148
+ members = [];
149
+ signingMembersIndices = [];
150
+ signatures = [];
151
+ i = 0;
152
+ _b.label = 1;
153
+ case 1:
154
+ if (!(i < signers.length)) return [3 /*break*/, 4];
155
+ _a = signers[i], id = _a.id, ethersSigner = _a.signer;
156
+ members.push(id);
157
+ if (signatures.length === numberOfSignatures) {
158
+ // eslint-disable-next-line no-continue
159
+ return [3 /*break*/, 3];
160
+ }
161
+ signerIndex = i + 1;
162
+ signingMembersIndices.push(signerIndex);
163
+ return [4 /*yield*/, ethersSigner.signMessage(ethers.utils.arrayify(resultHash))];
164
+ case 2:
165
+ signature = _b.sent();
166
+ signatures.push(signature);
167
+ _b.label = 3;
168
+ case 3:
169
+ i++;
170
+ return [3 /*break*/, 1];
171
+ case 4:
172
+ signaturesBytes = ethers.utils.hexConcat(signatures);
173
+ return [2 /*return*/, { members: members, signingMembersIndices: signingMembersIndices, signaturesBytes: signaturesBytes }];
174
+ }
175
+ });
176
+ });
177
+ }
178
+ exports.signDkgResult = signDkgResult;
179
+ // Creates a members hash that actively participated in dkg
180
+ function hashDKGMembers(hre, members, misbehavedMembersIndices) {
181
+ var ethers = hre.ethers;
182
+ if (misbehavedMembersIndices.length > 0) {
183
+ var activeDkgMembers = __spreadArray([], __read(members), false);
184
+ for (var i = 0; i < misbehavedMembersIndices.length; i++) {
185
+ if (misbehavedMembersIndices[i] !== 0) {
186
+ activeDkgMembers.splice(misbehavedMembersIndices[i] - i - 1, 1);
187
+ }
188
+ }
189
+ return ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(["uint32[]"], [activeDkgMembers]));
190
+ }
191
+ return ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(["uint32[]"], [members]));
192
+ }
193
+ exports.hashDKGMembers = hashDKGMembers;