@keep-network/tbtc-v2 1.0.0-dev.4 → 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 (51) hide show
  1. package/artifacts/BLS.json +1 -1
  2. package/artifacts/Bank.json +2 -2
  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 +1 -1
  11. package/artifacts/Deposit.json +1 -1
  12. package/artifacts/DepositSweep.json +1 -1
  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 +1 -1
  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 +2 -2
  22. package/artifacts/MaintainerProxy.json +2 -2
  23. package/artifacts/MovingFunds.json +1 -1
  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 +1 -1
  30. package/artifacts/ReimbursementPool.json +2 -2
  31. package/artifacts/T.json +2 -2
  32. package/artifacts/TBTC.json +2 -2
  33. package/artifacts/TBTCToken.json +2 -2
  34. package/artifacts/TBTCVault.json +2 -2
  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 +2 -2
  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 +1 -1
  44. package/deploy/06_deploy_bridge.ts +2 -1
  45. package/export/deploy/06_deploy_bridge.js +2 -1
  46. package/export/tasks/test-utils.js +133 -43
  47. package/export/test/integration/data/bls.js +12 -0
  48. package/export/test/integration/data/integration.js +133 -0
  49. package/export/test/integration/utils/random-beacon.js +193 -0
  50. package/package.json +3 -3
  51. package/tasks/test-utils.ts +88 -4
@@ -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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keep-network/tbtc-v2",
3
- "version": "1.0.0-dev.4+main.fff35b9f4374c6fb28abf679501640c2f14e32bf",
3
+ "version": "1.0.0-dev.5+main.a2e8a5df0cd75b762f8f5b371e27de976578bc03",
4
4
  "license": "GPL-3.0-only",
5
5
  "files": [
6
6
  "artifacts/",
@@ -32,8 +32,8 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "@keep-network/bitcoin-spv-sol": "3.4.0-solc-0.8",
35
- "@keep-network/ecdsa": "2.1.0-dev.4",
36
- "@keep-network/random-beacon": "2.1.0-dev.4",
35
+ "@keep-network/ecdsa": "2.1.0-dev.5",
36
+ "@keep-network/random-beacon": "2.1.0-dev.5",
37
37
  "@keep-network/tbtc": "1.1.2-dev.1",
38
38
  "@openzeppelin/contracts": "^4.6.0",
39
39
  "@openzeppelin/contracts-upgradeable": "^4.6.0",
@@ -4,16 +4,32 @@
4
4
  import { task, types } from "hardhat/config"
5
5
  import type { HardhatRuntimeEnvironment } from "hardhat/types"
6
6
  import { BigNumberish, BytesLike } from "ethers"
7
+ import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"
7
8
  import { authorizeApplication, stake } from "../test/integration/utils/staking"
8
9
  import {
9
10
  performEcdsaDkg,
10
11
  registerOperator,
11
12
  } from "../test/integration/utils/ecdsa-wallet-registry"
12
13
  import type { Bridge, SortitionPool, WalletRegistry } from "../typechain"
14
+ import {
15
+ offchainDkgTime,
16
+ dkgResultChallengePeriodLength,
17
+ } from "../test/integration/data/integration"
18
+ import blsData from "../test/integration/data/bls"
19
+ import {
20
+ updateDkgResultChallengePeriodLength,
21
+ getGenesisSeed,
22
+ selectGroup,
23
+ signDkgResult,
24
+ hashDKGMembers,
25
+ } from "../test/integration/utils/random-beacon"
26
+
27
+ export type OperatorID = number
28
+ export type Operator = { id: OperatorID; signer: SignerWithAddress }
13
29
 
14
30
  task(
15
31
  "test-utils:register-operators",
16
- "Registers operators in the sortition pool"
32
+ "Registers operators in the sortition pools"
17
33
  )
18
34
  .addOptionalParam(
19
35
  "numberOfOperators",
@@ -66,15 +82,29 @@ async function registerOperators(
66
82
  ): Promise<void> {
67
83
  const { helpers } = hre
68
84
 
85
+ const { chaosnetOwner } = await helpers.signers.getNamedSigners()
86
+
69
87
  const walletRegistry = await helpers.contracts.getContract<WalletRegistry>(
70
88
  "WalletRegistry"
71
89
  )
72
- const sortitionPool = await helpers.contracts.getContract<SortitionPool>(
90
+ const ecdsaSortitionPool = await helpers.contracts.getContract<SortitionPool>(
73
91
  "EcdsaSortitionPool"
74
92
  )
75
93
  const t = await helpers.contracts.getContract("T")
76
94
  const staking = await helpers.contracts.getContract("TokenStaking")
77
95
 
96
+ if (await ecdsaSortitionPool.isChaosnetActive()) {
97
+ await ecdsaSortitionPool.connect(chaosnetOwner).deactivateChaosnet()
98
+ }
99
+
100
+ const randomBeacon = await helpers.contracts.getContract("RandomBeacon")
101
+ const beaconSortitionPool =
102
+ await helpers.contracts.getContract<SortitionPool>("BeaconSortitionPool")
103
+
104
+ if (await beaconSortitionPool.isChaosnetActive()) {
105
+ await beaconSortitionPool.connect(chaosnetOwner).deactivateChaosnet()
106
+ }
107
+
78
108
  const signers = (await helpers.signers.getUnnamedSigners()).slice(
79
109
  unnamedSignersOffset
80
110
  )
@@ -114,12 +144,24 @@ async function registerOperators(
114
144
  stakingProvider.address,
115
145
  stakeAmount
116
146
  )
147
+ await authorizeApplication(
148
+ staking,
149
+ randomBeacon.address,
150
+ authorizer,
151
+ stakingProvider.address,
152
+ stakeAmount
153
+ )
117
154
  await registerOperator(
118
155
  walletRegistry,
119
- sortitionPool,
156
+ ecdsaSortitionPool,
120
157
  stakingProvider,
121
158
  operator
122
159
  )
160
+ await randomBeacon
161
+ .connect(stakingProvider)
162
+ .registerOperator(await operator.getAddress())
163
+
164
+ await randomBeacon.connect(operator).joinSortitionPool()
123
165
  }
124
166
 
125
167
  console.log(`Registered ${numberOfOperators} sortition pool operators`)
@@ -128,7 +170,7 @@ async function registerOperators(
128
170
  async function createWallet(
129
171
  hre: HardhatRuntimeEnvironment,
130
172
  walletPublicKey: BytesLike
131
- ) {
173
+ ): Promise<void> {
132
174
  const { ethers, helpers } = hre
133
175
  const { governance } = await helpers.signers.getNamedSigners()
134
176
 
@@ -139,6 +181,48 @@ async function createWallet(
139
181
  const walletRegistryGovernance = await helpers.contracts.getContract(
140
182
  "WalletRegistryGovernance"
141
183
  )
184
+ const randomBeacon = await helpers.contracts.getContract("RandomBeacon")
185
+ const randomBeaconGovernance = await helpers.contracts.getContract(
186
+ "RandomBeaconGovernance"
187
+ )
188
+
189
+ await updateDkgResultChallengePeriodLength(
190
+ hre,
191
+ governance,
192
+ randomBeaconGovernance
193
+ )
194
+
195
+ const genesisTx = await randomBeacon.genesis()
196
+ const genesisBlock = genesisTx.blockNumber
197
+ const genesisSeed = await getGenesisSeed(hre, genesisBlock)
198
+
199
+ await helpers.time.mineBlocksTo(genesisBlock + offchainDkgTime + 1)
200
+
201
+ const sortitionPool = await helpers.contracts.getContract<SortitionPool>(
202
+ "BeaconSortitionPool"
203
+ )
204
+
205
+ const signers = await selectGroup(hre, sortitionPool, genesisSeed)
206
+ const { members, signingMembersIndices, signaturesBytes } =
207
+ await signDkgResult(hre, signers, blsData.groupPubKey, [], genesisBlock, 33)
208
+ const membersHash = hashDKGMembers(hre, members, [])
209
+
210
+ const dkgResult = {
211
+ submitterMemberIndex: 1,
212
+ groupPubKey: blsData.groupPubKey,
213
+ misbehavedMembersIndices: [],
214
+ signatures: signaturesBytes,
215
+ signingMembersIndices,
216
+ members,
217
+ membersHash,
218
+ }
219
+
220
+ const submitter = signers[0].signer
221
+ await randomBeacon.connect(submitter).submitDkgResult(dkgResult)
222
+
223
+ await helpers.time.mineBlocks(dkgResultChallengePeriodLength + 1)
224
+
225
+ await randomBeacon.connect(submitter).approveDkgResult(dkgResult)
142
226
 
143
227
  const requestNewWalletTx = await bridge.requestNewWallet({
144
228
  txHash: ethers.constants.HashZero,