@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.
- package/artifacts/BLS.json +1 -1
- package/artifacts/Bank.json +3 -3
- package/artifacts/BeaconAuthorization.json +1 -1
- package/artifacts/BeaconDkg.json +1 -1
- package/artifacts/BeaconDkgValidator.json +1 -1
- package/artifacts/BeaconInactivity.json +1 -1
- package/artifacts/BeaconSortitionPool.json +3 -3
- package/artifacts/Bridge.json +5 -5
- package/artifacts/BridgeGovernance.json +11 -11
- package/artifacts/BridgeGovernanceParameters.json +12 -9
- package/artifacts/Deposit.json +2 -2
- package/artifacts/DepositSweep.json +2 -2
- package/artifacts/EcdsaDkgValidator.json +1 -1
- package/artifacts/EcdsaInactivity.json +1 -1
- package/artifacts/EcdsaSortitionPool.json +3 -3
- package/artifacts/Fraud.json +2 -2
- package/artifacts/KeepRegistry.json +1 -1
- package/artifacts/KeepStake.json +2 -2
- package/artifacts/KeepToken.json +2 -2
- package/artifacts/KeepTokenStaking.json +1 -1
- package/artifacts/LightRelay.json +18 -18
- package/artifacts/MaintainerProxy.json +19 -19
- package/artifacts/MovingFunds.json +2 -2
- package/artifacts/NuCypherStakingEscrow.json +1 -1
- package/artifacts/NuCypherToken.json +2 -2
- package/artifacts/RandomBeacon.json +2 -2
- package/artifacts/RandomBeaconChaosnet.json +2 -2
- package/artifacts/RandomBeaconGovernance.json +2 -2
- package/artifacts/Redemption.json +2 -2
- package/artifacts/ReimbursementPool.json +2 -2
- package/artifacts/T.json +2 -2
- package/artifacts/TBTC.json +3 -3
- package/artifacts/TBTCToken.json +3 -3
- package/artifacts/TBTCVault.json +23 -23
- package/artifacts/TokenStaking.json +1 -1
- package/artifacts/TokenholderGovernor.json +9 -9
- package/artifacts/TokenholderTimelock.json +8 -8
- package/artifacts/VendingMachine.json +10 -10
- package/artifacts/VendingMachineKeep.json +1 -1
- package/artifacts/VendingMachineNuCypher.json +1 -1
- package/artifacts/WalletRegistry.json +5 -5
- package/artifacts/WalletRegistryGovernance.json +2 -2
- package/artifacts/Wallets.json +2 -2
- package/artifacts/solcInputs/{e28c3bed541f57346a362a67f66ae471.json → b63dab89a2e89a0f54eb7f775a5bd516.json} +1 -1
- package/artifacts/solcInputs/{b448960fd13167193eb1e0994f1c8e1c.json → c88caf1374ff7ffc912d8c7e982bd645.json} +2 -2
- package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
- package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
- package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +1 -1
- package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
- package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
- package/build/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.dbg.json +1 -1
- package/build/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.json +136 -152
- package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.dbg.json +1 -1
- package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.json +2 -2
- package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
- package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
- package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +1 -1
- package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
- package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
- package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +1 -1
- package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
- package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
- package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
- package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
- package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
- package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
- package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.dbg.json +1 -1
- package/build/contracts/relay/LightRelay.sol/ILightRelay.dbg.json +1 -1
- package/build/contracts/relay/LightRelay.sol/LightRelay.dbg.json +1 -1
- package/build/contracts/relay/LightRelay.sol/RelayUtils.dbg.json +1 -1
- package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
- package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +1 -1
- package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
- package/build/contracts/vault/TBTCOptimisticMinting.sol/TBTCOptimisticMinting.dbg.json +1 -1
- package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
- package/contracts/bridge/BridgeGovernance.sol +150 -129
- package/contracts/bridge/BridgeGovernanceParameters.sol +0 -321
- package/deploy/06_deploy_bridge.ts +2 -1
- package/export/artifacts/contracts/bridge/Bridge.sol/Bridge.json +181 -181
- package/export/artifacts/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.json +2128 -2904
- package/export/artifacts/contracts/bridge/VendingMachine.sol/VendingMachine.json +67 -67
- package/export/artifacts/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.json +88 -88
- package/export/artifacts/contracts/relay/LightRelay.sol/LightRelay.json +57 -57
- package/export/artifacts/contracts/test/BankStub.sol/BankStub.json +2 -2
- package/export/artifacts/contracts/test/BridgeStub.sol/BridgeStub.json +217 -217
- package/export/artifacts/contracts/test/GoerliLightRelay.sol/GoerliLightRelay.json +57 -57
- package/export/artifacts/contracts/test/HeartbeatStub.sol/HeartbeatStub.json +4 -4
- package/export/artifacts/contracts/test/LightRelayStub.sol/LightRelayStub.json +59 -59
- package/export/artifacts/contracts/test/ReceiveApprovalStub.sol/ReceiveApprovalStub.json +7 -7
- package/export/artifacts/contracts/test/SystemTestRelay.sol/SystemTestRelay.json +14 -14
- package/export/artifacts/contracts/test/TestERC20.sol/TestERC20.json +6 -6
- package/export/artifacts/contracts/test/TestERC721.sol/TestERC721.json +8 -8
- package/export/artifacts/contracts/test/TestEcdsaLib.sol/TestEcdsaLib.json +4 -4
- package/export/artifacts/contracts/token/TBTC.sol/TBTC.json +2 -2
- package/export/artifacts/contracts/vault/DonationVault.sol/DonationVault.json +11 -11
- package/export/artifacts/contracts/vault/TBTCVault.sol/TBTCVault.json +133 -133
- package/export/deploy/06_deploy_bridge.js +2 -1
- package/export/tasks/test-utils.js +133 -43
- package/export/test/integration/data/bls.js +12 -0
- package/export/test/integration/data/integration.js +133 -0
- package/export/test/integration/utils/random-beacon.js +193 -0
- package/export/typechain/factories/BridgeGovernanceParameters__factory.js +1 -1
- package/export/typechain/factories/BridgeGovernance__factory.js +1 -1
- package/package.json +3 -3
- 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
|
-
|
|
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,
|
|
79
|
-
return __generator(this, function (
|
|
80
|
-
switch (
|
|
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.
|
|
89
|
+
return [4 /*yield*/, helpers.signers.getNamedSigners()];
|
|
84
90
|
case 1:
|
|
85
|
-
|
|
86
|
-
return [4 /*yield*/, helpers.contracts.getContract("
|
|
91
|
+
chaosnetOwner = (_c.sent()).chaosnetOwner;
|
|
92
|
+
return [4 /*yield*/, helpers.contracts.getContract("WalletRegistry")];
|
|
87
93
|
case 2:
|
|
88
|
-
|
|
89
|
-
return [4 /*yield*/, helpers.contracts.getContract("
|
|
94
|
+
walletRegistry = _c.sent();
|
|
95
|
+
return [4 /*yield*/, helpers.contracts.getContract("EcdsaSortitionPool")];
|
|
90
96
|
case 3:
|
|
91
|
-
|
|
92
|
-
return [4 /*yield*/, helpers.contracts.getContract("
|
|
97
|
+
ecdsaSortitionPool = _c.sent();
|
|
98
|
+
return [4 /*yield*/, helpers.contracts.getContract("T")];
|
|
93
99
|
case 4:
|
|
94
|
-
|
|
95
|
-
return [4 /*yield*/, helpers.
|
|
100
|
+
t = _c.sent();
|
|
101
|
+
return [4 /*yield*/, helpers.contracts.getContract("TokenStaking")];
|
|
96
102
|
case 5:
|
|
97
|
-
|
|
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
|
-
|
|
105
|
-
case
|
|
106
|
-
if (!(i < numberOfOperators)) return [3 /*break*/,
|
|
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
|
|
115
|
-
|
|
143
|
+
case 16:
|
|
144
|
+
_c.sent();
|
|
116
145
|
return [4 /*yield*/, (0, staking_1.authorizeApplication)(staking, walletRegistry.address, authorizer, stakingProvider.address, stakeAmount)];
|
|
117
|
-
case
|
|
118
|
-
|
|
119
|
-
return [4 /*yield*/, (0,
|
|
120
|
-
case
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
case
|
|
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*/,
|
|
126
|
-
case
|
|
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 (
|
|
137
|
-
switch (
|
|
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 = (
|
|
184
|
+
governance = (_b.sent()).governance;
|
|
143
185
|
return [4 /*yield*/, helpers.contracts.getContract("Bridge")];
|
|
144
186
|
case 2:
|
|
145
|
-
bridge =
|
|
187
|
+
bridge = _b.sent();
|
|
146
188
|
return [4 /*yield*/, helpers.contracts.getContract("WalletRegistry")];
|
|
147
189
|
case 3:
|
|
148
|
-
walletRegistry =
|
|
190
|
+
walletRegistry = _b.sent();
|
|
149
191
|
return [4 /*yield*/, helpers.contracts.getContract("WalletRegistryGovernance")];
|
|
150
192
|
case 4:
|
|
151
|
-
walletRegistryGovernance =
|
|
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
|
|
162
|
-
requestNewWalletTx =
|
|
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
|
|
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
|
-
|
|
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
|
|
270
|
+
case 19:
|
|
181
271
|
// eslint-disable-next-line no-underscore-dangle
|
|
182
|
-
|
|
272
|
+
_b.sent();
|
|
183
273
|
return [4 /*yield*/, (0, ecdsa_wallet_registry_1.performEcdsaDkg)(hre, walletRegistry, walletPublicKey, requestNewWalletTx.blockNumber)];
|
|
184
|
-
case
|
|
185
|
-
|
|
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;
|