@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.
- package/artifacts/BLS.json +1 -1
- package/artifacts/Bank.json +2 -2
- 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 +2 -2
- package/artifacts/BridgeGovernanceParameters.json +1 -1
- package/artifacts/Deposit.json +1 -1
- package/artifacts/DepositSweep.json +1 -1
- package/artifacts/EcdsaDkgValidator.json +1 -1
- package/artifacts/EcdsaInactivity.json +1 -1
- package/artifacts/EcdsaSortitionPool.json +3 -3
- package/artifacts/Fraud.json +1 -1
- 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 +2 -2
- package/artifacts/MaintainerProxy.json +2 -2
- package/artifacts/MovingFunds.json +1 -1
- 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 +1 -1
- package/artifacts/ReimbursementPool.json +2 -2
- package/artifacts/T.json +2 -2
- package/artifacts/TBTC.json +2 -2
- package/artifacts/TBTCToken.json +2 -2
- package/artifacts/TBTCVault.json +2 -2
- package/artifacts/TokenStaking.json +1 -1
- package/artifacts/TokenholderGovernor.json +9 -9
- package/artifacts/TokenholderTimelock.json +8 -8
- package/artifacts/VendingMachine.json +2 -2
- 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 +1 -1
- package/deploy/06_deploy_bridge.ts +2 -1
- 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/package.json +3 -3
- 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.
|
|
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.
|
|
36
|
-
"@keep-network/random-beacon": "2.1.0-dev.
|
|
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",
|
package/tasks/test-utils.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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,
|