@skalenetwork/upgrade-tools 3.0.0-skale-contracts.5 → 3.0.0-skale-contracts.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,25 +1,2 @@
1
- import { ethers } from "ethers";
2
- import { HardhatEthersHelpers } from "@nomiclabs/hardhat-ethers/types";
3
- type Ethers = typeof ethers & HardhatEthersHelpers;
4
- interface SafeMultisigTransaction {
5
- safe: string;
6
- to: string;
7
- value: number;
8
- data?: string;
9
- operation: number;
10
- gasToken?: string;
11
- safeTxGas: number;
12
- baseGas: number;
13
- gasPrice: number;
14
- refundReceiver?: string;
15
- nonce: number;
16
- contractTransactionHash: string;
17
- sender: string;
18
- signature?: string;
19
- origin?: string;
20
- }
21
- export declare function getSafeTransactionUrl(chainId: number): string;
22
- export declare function getSafeRelayUrl(chainId: number): string;
23
- export declare function createMultiSendTransaction(ethers: Ethers, safeAddress: string, privateKey: string, transactions: string[], chainId: number, nonce?: number): Promise<SafeMultisigTransaction>;
24
- export declare function sendSafeTransaction(safe: string, chainId: number, safeTx: SafeMultisigTransaction): Promise<void>;
25
- export {};
1
+ import { UnsignedTransaction } from "ethers";
2
+ export declare function createMultiSendTransaction(safeAddress: string, transactions: UnsignedTransaction[]): Promise<void>;
@@ -26,227 +26,106 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.sendSafeTransaction = exports.createMultiSendTransaction = exports.getSafeRelayUrl = exports.getSafeTransactionUrl = void 0;
30
- const axios_1 = __importDefault(require("axios"));
31
- const ethUtil = __importStar(require("ethereumjs-util"));
29
+ exports.createMultiSendTransaction = void 0;
32
30
  const chalk_1 = __importDefault(require("chalk"));
33
- const ethers_1 = require("ethers");
31
+ const hardhat_1 = require("hardhat");
32
+ const api_kit_1 = __importDefault(require("@safe-global/api-kit"));
33
+ const protocol_kit_1 = __importStar(require("@safe-global/protocol-kit"));
34
34
  var Network;
35
35
  (function (Network) {
36
36
  Network[Network["MAINNET"] = 1] = "MAINNET";
37
- Network[Network["RINKEBY"] = 4] = "RINKEBY";
38
37
  Network[Network["GOERLI"] = 5] = "GOERLI";
39
38
  Network[Network["GANACHE"] = 1337] = "GANACHE";
40
39
  Network[Network["HARDHAT"] = 31337] = "HARDHAT";
41
40
  })(Network || (Network = {}));
42
41
  // constants
43
- const ADDRESSES = {
44
- multiSend: {
45
- [Network.MAINNET]: "0x8D29bE29923b68abfDD21e541b9374737B49cdAD",
46
- [Network.RINKEBY]: "0x8D29bE29923b68abfDD21e541b9374737B49cdAD",
47
- [Network.GOERLI]: "0x8D29bE29923b68abfDD21e541b9374737B49cdAD",
48
- },
49
- };
50
42
  const URLS = {
51
43
  safe_transaction: {
52
- [Network.MAINNET]: "https://safe-transaction.mainnet.gnosis.io",
53
- [Network.RINKEBY]: "https://safe-transaction.rinkeby.gnosis.io",
54
- [Network.GOERLI]: "https://safe-transaction.goerli.gnosis.io",
55
- },
56
- safe_relay: {
57
- [Network.MAINNET]: "https://safe-relay.mainnet.gnosis.io",
58
- [Network.RINKEBY]: "https://safe-relay.rinkeby.gnosis.io",
59
- [Network.GOERLI]: "https://safe-relay.goerli.gnosis.io",
44
+ [Network.MAINNET]: "https://safe-transaction-mainnet.safe.global",
45
+ [Network.GOERLI]: "https://safe-transaction-goerli.safe.global",
60
46
  }
61
47
  };
62
48
  // public functions
63
- function getSafeTransactionUrl(chainId) {
64
- if (Object.keys(URLS.safe_transaction).includes(chainId.toString())) {
65
- return URLS.safe_transaction[chainId];
66
- }
67
- else {
68
- throw Error(`Can't get safe-transaction url at network with chainId = ${chainId}`);
69
- }
70
- }
71
- exports.getSafeTransactionUrl = getSafeTransactionUrl;
72
- function getSafeRelayUrl(chainId) {
73
- if (Object.keys(URLS.safe_relay).includes(chainId.toString())) {
74
- return URLS.safe_relay[chainId];
75
- }
76
- else {
77
- throw Error(`Can't get safe-relay url at network with chainId = ${chainId}`);
78
- }
79
- }
80
- exports.getSafeRelayUrl = getSafeRelayUrl;
81
- async function createMultiSendTransaction(ethers, safeAddress, privateKey, transactions, chainId, nonce) {
82
- const multiSendAddress = getMultiSendAddress(chainId);
83
- const multiSendAbi = [{ "constant": false, "inputs": [{ "internalType": "bytes", "name": "transactions", "type": "bytes" }], "name": "multiSend", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }];
84
- const multiSend = new ethers.Contract(multiSendAddress, new ethers.utils.Interface(multiSendAbi), ethers.provider);
85
- let nonceValue = 0;
86
- if (nonce === undefined) {
87
- try {
88
- if (process.env.NONCE) {
89
- // NONCE variable is set
90
- if (isNaN(Number.parseInt(process.env.NONCE))) {
91
- // NONCE variable is not a number
92
- if (process.env.NONCE.toLowerCase() === "pending") {
93
- nonceValue = await getSafeNonceWithPending(chainId, safeAddress);
94
- }
95
- else {
96
- nonceValue = await getSafeNonce(chainId, safeAddress);
97
- }
98
- }
99
- else {
100
- // NONCE variable is a number
101
- nonceValue = Number.parseInt(process.env.NONCE);
102
- }
103
- }
104
- else {
105
- // NONCE variable is not set
106
- nonceValue = await getSafeNonce(chainId, safeAddress);
107
- }
108
- }
109
- catch (e) {
110
- if (!(e instanceof Error) || !e.toString().startsWith("Error: Can't get safe-transaction url")) {
111
- throw e;
112
- }
113
- }
114
- }
115
- else {
116
- nonceValue = nonce;
49
+ async function createMultiSendTransaction(safeAddress, transactions) {
50
+ const safeTransactionData = [];
51
+ for (const transaction of transactions) {
52
+ safeTransactionData.push({
53
+ to: transaction.to ? transaction.to : hardhat_1.ethers.constants.AddressZero,
54
+ data: transaction.data ? transaction.data.toString() : "0x",
55
+ value: transaction.value ? transaction.value.toString() : "0",
56
+ operation: 0,
57
+ });
117
58
  }
118
- console.log("Will send tx to Gnosis with nonce", nonceValue);
119
- const tx = {
120
- "safe": safeAddress,
121
- "to": multiSend.address,
122
- "value": 0,
123
- "data": multiSend.interface.encodeFunctionData("multiSend", [concatTransactions(transactions)]),
124
- "operation": 1,
125
- "gasToken": ethers.constants.AddressZero,
126
- "safeTxGas": 0,
127
- "baseGas": 0,
128
- "gasPrice": 0,
129
- "refundReceiver": ethers.constants.AddressZero,
130
- "nonce": nonceValue, // Nonce of the Safe, transaction cannot be executed until Safe's nonce is not equal to this nonce
59
+ const safeService = await getSafeService();
60
+ const nonce = await safeService.getNextNonce(safeAddress);
61
+ console.log("Will send tx to Gnosis with nonce", nonce);
62
+ const options = {
63
+ safeTxGas: "0",
64
+ baseGas: "0",
65
+ gasPrice: "0",
66
+ gasToken: hardhat_1.ethers.constants.AddressZero,
67
+ refundReceiver: hardhat_1.ethers.constants.AddressZero,
68
+ nonce: nonce // Nonce of the Safe, transaction cannot be executed until Safe's nonce is not equal to this nonce
131
69
  };
132
- const digestHex = getTransactionHash(tx.to, tx.value, tx.data, tx.operation, tx.safeTxGas, tx.baseGas, tx.gasPrice, tx.gasToken, tx.refundReceiver, tx.nonce, safeAddress, chainId);
133
- const privateKeyBuffer = ethUtil.toBuffer(privateKey);
134
- const { r, s, v } = ethUtil.ecsign(ethUtil.toBuffer(digestHex), privateKeyBuffer);
135
- const signature = ethUtil.toRpcSig(v, r, s).toString();
136
- const txToSend = {
137
- ...tx,
138
- "contractTransactionHash": digestHex,
139
- // Owner of the Safe proposing the transaction. Must match one of the signatures
140
- "sender": ethers.utils.getAddress(ethUtil.bufferToHex(ethUtil.privateToAddress(privateKeyBuffer))),
141
- "signature": signature,
142
- "origin": "Upgrade skale-manager" // Give more information about the transaction, e.g. "My Custom Safe app"
143
- };
144
- return txToSend;
70
+ const ethAdapter = await getEthAdapter();
71
+ const safeSdk = await protocol_kit_1.default.create({ ethAdapter, safeAddress });
72
+ const safeTransaction = await safeSdk.createTransaction({ safeTransactionData, options });
73
+ await estimateSafeTransaction(safeAddress, safeTransactionData);
74
+ await proposeTransaction(safeAddress, safeTransaction);
145
75
  }
146
76
  exports.createMultiSendTransaction = createMultiSendTransaction;
147
- async function sendSafeTransaction(safe, chainId, safeTx) {
148
- try {
149
- console.log("Estimate gas");
150
- const estimateRequest = safeTx;
151
- try {
152
- const estimateResponse = await axios_1.default.post(`${getSafeRelayUrl(chainId)}/api/v2/safes/${safe}/transactions/estimate/`, estimateRequest);
153
- console.log(chalk_1.default.cyan(`Recommend to set gas limit to ${parseInt(estimateResponse.data.safeTxGas, 10) + parseInt(estimateResponse.data.baseGas, 10)}`));
154
- }
155
- catch (e) {
156
- console.log(chalk_1.default.red("Failed to estimate gas"));
157
- console.log(e);
158
- }
159
- console.log(chalk_1.default.green("Send transaction to gnosis safe"));
160
- await axios_1.default.post(`${getSafeTransactionUrl(chainId)}/api/v1/safes/${safe}/multisig-transactions/`, safeTx);
161
- }
162
- catch (e) {
163
- if (axios_1.default.isAxiosError(e)) {
164
- if (e.response) {
165
- console.log(JSON.stringify(e.response.data, null, 4));
166
- console.log(chalk_1.default.red(`Request failed with ${e.response.status} code`));
167
- }
168
- else {
169
- console.log(chalk_1.default.red("Request failed with unknown reason"));
170
- }
171
- }
172
- throw e;
173
- }
174
- }
175
- exports.sendSafeTransaction = sendSafeTransaction;
176
77
  // private functions
177
- function getMultiSendAddress(chainId) {
178
- if ([Network.GANACHE, Network.HARDHAT].includes(chainId)) {
179
- return ethers_1.ethers.constants.AddressZero;
180
- }
181
- else if (Object.keys(ADDRESSES.multiSend).includes(chainId.toString())) {
182
- return ADDRESSES.multiSend[chainId];
183
- }
184
- else {
185
- throw Error(`Can't get multiSend contract at network with chainId = ${chainId}`);
78
+ async function estimateSafeTransaction(safeAddress, safeTransactionData) {
79
+ console.log("Estimate gas");
80
+ const safeService = await getSafeService();
81
+ for (const transaction of safeTransactionData) {
82
+ const estimateResponse = await safeService.estimateSafeTransaction(safeAddress, {
83
+ to: transaction.to,
84
+ value: transaction.value,
85
+ data: transaction.data,
86
+ operation: transaction.operation || 0,
87
+ });
88
+ console.log(chalk_1.default.cyan(`Recommend to set gas limit to ${parseInt(estimateResponse.safeTxGas, 10)}`));
186
89
  }
90
+ console.log(chalk_1.default.green("Send transaction to gnosis safe"));
91
+ }
92
+ async function proposeTransaction(safeAddress, safeTransaction) {
93
+ const [safeOwner] = await hardhat_1.ethers.getSigners();
94
+ const ethAdapter = await getEthAdapter();
95
+ const safeSdk = await protocol_kit_1.default.create({ ethAdapter, safeAddress });
96
+ const safeTxHash = await safeSdk.getTransactionHash(safeTransaction);
97
+ const senderSignature = await safeSdk.signTransactionHash(safeTxHash);
98
+ const safeService = await getSafeService();
99
+ await safeService.proposeTransaction({
100
+ safeAddress,
101
+ safeTransactionData: safeTransaction.data,
102
+ safeTxHash,
103
+ senderAddress: safeOwner.address,
104
+ senderSignature: senderSignature.data
105
+ });
187
106
  }
188
- function concatTransactions(transactions) {
189
- return "0x" + transactions.map((transaction) => {
190
- if (transaction.startsWith("0x")) {
191
- return transaction.slice(2);
192
- }
193
- else {
194
- return transaction;
195
- }
196
- }).join("");
107
+ async function getEthAdapter() {
108
+ const [safeOwner] = await hardhat_1.ethers.getSigners();
109
+ const ethAdapter = new protocol_kit_1.EthersAdapter({
110
+ ethers: hardhat_1.ethers,
111
+ signerOrProvider: safeOwner
112
+ });
113
+ return ethAdapter;
197
114
  }
198
- async function getSafeNonce(chainId, safeAddress) {
199
- const safeInfo = await axios_1.default.get(`${getSafeTransactionUrl(chainId)}/api/v1/safes/${safeAddress}/`);
200
- return safeInfo.data.nonce;
115
+ async function getSafeService() {
116
+ const chainId = (await hardhat_1.ethers.provider.getNetwork()).chainId;
117
+ const ethAdapter = await getEthAdapter();
118
+ const safeService = new api_kit_1.default({
119
+ txServiceUrl: getSafeTransactionUrl(chainId),
120
+ ethAdapter
121
+ });
122
+ return safeService;
201
123
  }
202
- async function getSafeNonceWithPending(chainId, safeAddress) {
203
- const allTransactions = await axios_1.default.get(`${getSafeTransactionUrl(chainId)}/api/v1/safes/${safeAddress}/all-transactions/?executed=false&queued=true&trusted=true`);
204
- if (allTransactions.data.results.length > 0) {
205
- return allTransactions.data.results[0].nonce + 1;
124
+ function getSafeTransactionUrl(chainId) {
125
+ if (Object.keys(URLS.safe_transaction).includes(chainId.toString())) {
126
+ return URLS.safe_transaction[chainId];
206
127
  }
207
128
  else {
208
- return 0;
129
+ throw Error(`Can't get safe-transaction url at network with chainId = ${chainId}`);
209
130
  }
210
131
  }
211
- function getDomainSeparator(safeAddress, chainId) {
212
- const DOMAIN_SEPARATOR_TYPEHASH = "0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218";
213
- return ethers_1.ethers.utils.solidityKeccak256(["bytes"], [
214
- ethers_1.ethers.utils.defaultAbiCoder.encode(["bytes32", "uint256", "address"], [DOMAIN_SEPARATOR_TYPEHASH, chainId, safeAddress])
215
- ]);
216
- }
217
- function encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce, safeAddress, chainId) {
218
- const dataHash = ethers_1.ethers.utils.solidityKeccak256(["bytes"], [data]);
219
- const SAFE_TX_TYPEHASH = "0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8";
220
- const encoded = ethers_1.ethers.utils.defaultAbiCoder.encode([
221
- "bytes32",
222
- "address",
223
- "uint256",
224
- "bytes32",
225
- "uint256",
226
- "uint256",
227
- "uint256",
228
- "uint256",
229
- "address",
230
- "address",
231
- "uint256"
232
- ], [
233
- SAFE_TX_TYPEHASH,
234
- to,
235
- value,
236
- dataHash,
237
- operation,
238
- safeTxGas,
239
- baseGas,
240
- gasPrice,
241
- gasToken,
242
- refundReceiver,
243
- _nonce
244
- ]);
245
- const encodedHash = ethers_1.ethers.utils.solidityKeccak256(["bytes"], [encoded]);
246
- return ethers_1.ethers.utils.solidityPack(["bytes1", "bytes1", "bytes32", "bytes32"], ["0x19", "0x01", getDomainSeparator(safeAddress, chainId), encodedHash]);
247
- }
248
- function getTransactionHash(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce, safeAddress, chainId) {
249
- return ethers_1.ethers.utils.solidityKeccak256(["bytes"], [
250
- encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce, safeAddress, chainId)
251
- ]);
252
- }
@@ -1,10 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SafeSubmitter = void 0;
4
- const ethers_1 = require("ethers");
5
4
  const hardhat_1 = require("hardhat");
6
5
  const gnosis_safe_1 = require("../gnosis-safe");
7
- const multiSend_1 = require("../multiSend");
8
6
  const submitter_1 = require("./submitter");
9
7
  class SafeSubmitter extends submitter_1.Submitter {
10
8
  constructor(safeAddress, chainId) {
@@ -13,21 +11,10 @@ class SafeSubmitter extends submitter_1.Submitter {
13
11
  this.chainId = chainId;
14
12
  }
15
13
  async submit(transactions) {
16
- const safeTransactions = [];
17
- for (const transaction of transactions) {
18
- safeTransactions.push((0, multiSend_1.encodeTransaction)(0, transaction.to ? transaction.to : hardhat_1.ethers.constants.AddressZero, transaction.value ? ethers_1.BigNumber.from(transaction.value) : 0, transaction.data ? transaction.data.toString() : "0x"));
19
- }
20
- let privateKey = hardhat_1.network.config.accounts[0];
21
- if (hardhat_1.network.config.accounts === "remote") {
22
- // Don't have an information about private key
23
- // Use random one because we most probable run tests
24
- privateKey = hardhat_1.ethers.Wallet.createRandom().privateKey;
25
- }
26
14
  if (!this.chainId) {
27
15
  this.chainId = (await hardhat_1.ethers.provider.getNetwork()).chainId;
28
16
  }
29
- const safeTx = await (0, gnosis_safe_1.createMultiSendTransaction)(hardhat_1.ethers, this.safeAddress, privateKey, safeTransactions, this.chainId);
30
- await (0, gnosis_safe_1.sendSafeTransaction)(this.safeAddress, this.chainId, safeTx);
17
+ await (0, gnosis_safe_1.createMultiSendTransaction)(this.safeAddress, transactions);
31
18
  }
32
19
  }
33
20
  exports.SafeSubmitter = SafeSubmitter;
@@ -14,7 +14,7 @@ export declare class SafeMock__factory extends ContractFactory {
14
14
  connect(signer: Signer): SafeMock__factory;
15
15
  static readonly contractName: "SafeMock";
16
16
  readonly contractName: "SafeMock";
17
- static readonly bytecode = "0x60806040523480156200001157600080fd5b50600054610100900460ff1615808015620000335750600054600160ff909116105b8062000063575062000050306200016d60201b620003301760201c565b15801562000063575060005460ff166001145b620000cc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620000f0576000805461ff0019166101001790555b620001056200017c60201b6200033f1760201c565b6040805160208101909152600081526200011f90620001e4565b801562000166576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5062000326565b6001600160a01b03163b151590565b600054610100900460ff16620001d85760405162461bcd60e51b815260206004820152602b602482015260008051602062000c1283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c3565b620001e262000273565b565b805160205b818110156200026e578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811462000232576001811462000243576200024e565b6000808585888a5af191506200024e565b6000808585895af491505b50806200025a57600080fd5b5050806055018501945050505050620001e9565b505050565b600054610100900460ff16620002cf5760405162461bcd60e51b815260206004820152602b602482015260008051602062000c1283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c3565b620001e233603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6108dc80620003366000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638d80ff0a116100665780638d80ff0a146101075780638da5cb5b1461011a578063d8d11f7814610135578063f2fde38b14610148578063f5dcb7bb1461015b57600080fd5b806312cc533f146100985780632bf613a5146100ad578063715018a6146100e757806388f8bae1146100ef575b600080fd5b6100ab6100a6366004610599565b610182565b005b6100d47fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d881565b6040519081526020015b60405180910390f35b6100ab6101e9565b6100f7600181565b60405190151581526020016100de565b6100ab6101153660046105e8565b6101fd565b6033546040516001600160a01b0390911681526020016100de565b6100d46101433660046106a8565b610285565b6100ab610156366004610792565b6102b2565b6100d47f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921881565b61018a61036e565b60405163f2fde38b60e01b81526001600160a01b03828116600483015283169063f2fde38b90602401600060405180830381600087803b1580156101cd57600080fd5b505af11580156101e1573d6000803e3d6000fd5b505050505050565b6101f161036e565b6101fb60006103c8565b565b805160205b81811015610280578083015160f81c6001820184015160601c601583018501516035840186015160558501870160008560008114610247576001811461025757610262565b6000808585888a5af19150610262565b6000808585895af491505b508061026d57600080fd5b5050806055018501945050505050610202565b505050565b600061029a8c8c8c8c8c8c8c8c8c8c8c61041a565b8051906020012090509b9a5050505050505050505050565b6102ba61036e565b6001600160a01b0381166103245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61032d816103c8565b50565b6001600160a01b03163b151590565b600054610100900460ff166103665760405162461bcd60e51b815260040161031b906107b6565b6101fb610544565b6033546001600160a01b031633146101fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161031b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d88d8d8d8d604051610451929190610801565b604051908190038120610477949392918e908e908e908e908e908e908e90602001610811565b60408051601f1981840301815291905280516020909101209050601960f81b600160f81b6104f7604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b600054610100900460ff1661056b5760405162461bcd60e51b815260040161031b906107b6565b6101fb336103c8565b6001600160a01b038116811461032d57600080fd5b803561059481610574565b919050565b600080604083850312156105ac57600080fd5b82356105b781610574565b915060208301356105c781610574565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156105fa57600080fd5b813567ffffffffffffffff8082111561061257600080fd5b818401915084601f83011261062657600080fd5b813581811115610638576106386105d2565b604051601f8201601f19908116603f01168101908382118183101715610660576106606105d2565b8160405282815287602084870101111561067957600080fd5b826020860160208301376000928101602001929092525095945050505050565b80356002811061059457600080fd5b60008060008060008060008060008060006101408c8e0312156106ca57600080fd5b8b356106d581610574565b9a5060208c0135995060408c013567ffffffffffffffff808211156106f957600080fd5b818e0191508e601f83011261070d57600080fd5b81358181111561071c57600080fd5b8f602082850101111561072e57600080fd5b602083019b50809a5050505061074660608d01610699565b965060808c0135955060a08c0135945060c08c0135935061076960e08d01610589565b92506107786101008d01610589565b91506101208c013590509295989b509295989b9093969950565b6000602082840312156107a457600080fd5b81356107af81610574565b9392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8183823760009101908152919050565b8b81526001600160a01b038b166020820152604081018a90526060810189905261016081016002891061085457634e487b7160e01b600052602160045260246000fd5b8860808301528760a08301528660c08301528560e08301526108826101008301866001600160a01b03169052565b6001600160a01b03939093166101208201526101400152999850505050505050505056fea26469706673582212202ff0141edaf3f76ff4bf691522a740076b0763d16b29f9b28057904188aeb98c64736f6c634300080b0033496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069";
17
+ static readonly bytecode = "0x60806040523480156200001157600080fd5b50600054610100900460ff1615808015620000335750600054600160ff909116105b8062000063575062000050306200016d60201b620003301760201c565b15801562000063575060005460ff166001145b620000cc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620000f0576000805461ff0019166101001790555b620001056200017c60201b6200033f1760201c565b6040805160208101909152600081526200011f90620001e4565b801562000166576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5062000326565b6001600160a01b03163b151590565b600054610100900460ff16620001d85760405162461bcd60e51b815260206004820152602b602482015260008051602062000c1283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c3565b620001e262000273565b565b805160205b818110156200026e578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811462000232576001811462000243576200024e565b6000808585888a5af191506200024e565b6000808585895af491505b50806200025a57600080fd5b5050806055018501945050505050620001e9565b505050565b600054610100900460ff16620002cf5760405162461bcd60e51b815260206004820152602b602482015260008051602062000c1283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c3565b620001e233603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6108dc80620003366000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638d80ff0a116100665780638d80ff0a146101075780638da5cb5b1461011a578063d8d11f7814610135578063f2fde38b14610148578063f5dcb7bb1461015b57600080fd5b806312cc533f146100985780632bf613a5146100ad578063715018a6146100e757806388f8bae1146100ef575b600080fd5b6100ab6100a6366004610599565b610182565b005b6100d47fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d881565b6040519081526020015b60405180910390f35b6100ab6101e9565b6100f7600181565b60405190151581526020016100de565b6100ab6101153660046105e8565b6101fd565b6033546040516001600160a01b0390911681526020016100de565b6100d46101433660046106a8565b610285565b6100ab610156366004610792565b6102b2565b6100d47f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921881565b61018a61036e565b60405163f2fde38b60e01b81526001600160a01b03828116600483015283169063f2fde38b90602401600060405180830381600087803b1580156101cd57600080fd5b505af11580156101e1573d6000803e3d6000fd5b505050505050565b6101f161036e565b6101fb60006103c8565b565b805160205b81811015610280578083015160f81c6001820184015160601c601583018501516035840186015160558501870160008560008114610247576001811461025757610262565b6000808585888a5af19150610262565b6000808585895af491505b508061026d57600080fd5b5050806055018501945050505050610202565b505050565b600061029a8c8c8c8c8c8c8c8c8c8c8c61041a565b8051906020012090509b9a5050505050505050505050565b6102ba61036e565b6001600160a01b0381166103245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61032d816103c8565b50565b6001600160a01b03163b151590565b600054610100900460ff166103665760405162461bcd60e51b815260040161031b906107b6565b6101fb610544565b6033546001600160a01b031633146101fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161031b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d88d8d8d8d604051610451929190610801565b604051908190038120610477949392918e908e908e908e908e908e908e90602001610811565b60408051601f1981840301815291905280516020909101209050601960f81b600160f81b6104f7604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b600054610100900460ff1661056b5760405162461bcd60e51b815260040161031b906107b6565b6101fb336103c8565b6001600160a01b038116811461032d57600080fd5b803561059481610574565b919050565b600080604083850312156105ac57600080fd5b82356105b781610574565b915060208301356105c781610574565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156105fa57600080fd5b813567ffffffffffffffff8082111561061257600080fd5b818401915084601f83011261062657600080fd5b813581811115610638576106386105d2565b604051601f8201601f19908116603f01168101908382118183101715610660576106606105d2565b8160405282815287602084870101111561067957600080fd5b826020860160208301376000928101602001929092525095945050505050565b80356002811061059457600080fd5b60008060008060008060008060008060006101408c8e0312156106ca57600080fd5b8b356106d581610574565b9a5060208c0135995060408c013567ffffffffffffffff808211156106f957600080fd5b818e0191508e601f83011261070d57600080fd5b81358181111561071c57600080fd5b8f602082850101111561072e57600080fd5b602083019b50809a5050505061074660608d01610699565b965060808c0135955060a08c0135945060c08c0135935061076960e08d01610589565b92506107786101008d01610589565b91506101208c013590509295989b509295989b9093969950565b6000602082840312156107a457600080fd5b81356107af81610574565b9392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8183823760009101908152919050565b8b81526001600160a01b038b166020820152604081018a90526060810189905261016081016002891061085457634e487b7160e01b600052602160045260246000fd5b8860808301528760a08301528660c08301528560e08301526108826101008301866001600160a01b03169052565b6001600160a01b03939093166101208201526101400152999850505050505050505056fea2646970667358221220d091f04727a2cb4359f71bc8a6cae926af5999c47b5b4ac4683524db6eae355f64736f6c634300080b0033496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069";
18
18
  static readonly abi: ({
19
19
  inputs: never[];
20
20
  stateMutability: string;
@@ -211,7 +211,7 @@ const _abi = [
211
211
  type: "function",
212
212
  },
213
213
  ];
214
- const _bytecode = "0x60806040523480156200001157600080fd5b50600054610100900460ff1615808015620000335750600054600160ff909116105b8062000063575062000050306200016d60201b620003301760201c565b15801562000063575060005460ff166001145b620000cc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620000f0576000805461ff0019166101001790555b620001056200017c60201b6200033f1760201c565b6040805160208101909152600081526200011f90620001e4565b801562000166576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5062000326565b6001600160a01b03163b151590565b600054610100900460ff16620001d85760405162461bcd60e51b815260206004820152602b602482015260008051602062000c1283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c3565b620001e262000273565b565b805160205b818110156200026e578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811462000232576001811462000243576200024e565b6000808585888a5af191506200024e565b6000808585895af491505b50806200025a57600080fd5b5050806055018501945050505050620001e9565b505050565b600054610100900460ff16620002cf5760405162461bcd60e51b815260206004820152602b602482015260008051602062000c1283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c3565b620001e233603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6108dc80620003366000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638d80ff0a116100665780638d80ff0a146101075780638da5cb5b1461011a578063d8d11f7814610135578063f2fde38b14610148578063f5dcb7bb1461015b57600080fd5b806312cc533f146100985780632bf613a5146100ad578063715018a6146100e757806388f8bae1146100ef575b600080fd5b6100ab6100a6366004610599565b610182565b005b6100d47fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d881565b6040519081526020015b60405180910390f35b6100ab6101e9565b6100f7600181565b60405190151581526020016100de565b6100ab6101153660046105e8565b6101fd565b6033546040516001600160a01b0390911681526020016100de565b6100d46101433660046106a8565b610285565b6100ab610156366004610792565b6102b2565b6100d47f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921881565b61018a61036e565b60405163f2fde38b60e01b81526001600160a01b03828116600483015283169063f2fde38b90602401600060405180830381600087803b1580156101cd57600080fd5b505af11580156101e1573d6000803e3d6000fd5b505050505050565b6101f161036e565b6101fb60006103c8565b565b805160205b81811015610280578083015160f81c6001820184015160601c601583018501516035840186015160558501870160008560008114610247576001811461025757610262565b6000808585888a5af19150610262565b6000808585895af491505b508061026d57600080fd5b5050806055018501945050505050610202565b505050565b600061029a8c8c8c8c8c8c8c8c8c8c8c61041a565b8051906020012090509b9a5050505050505050505050565b6102ba61036e565b6001600160a01b0381166103245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61032d816103c8565b50565b6001600160a01b03163b151590565b600054610100900460ff166103665760405162461bcd60e51b815260040161031b906107b6565b6101fb610544565b6033546001600160a01b031633146101fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161031b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d88d8d8d8d604051610451929190610801565b604051908190038120610477949392918e908e908e908e908e908e908e90602001610811565b60408051601f1981840301815291905280516020909101209050601960f81b600160f81b6104f7604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b600054610100900460ff1661056b5760405162461bcd60e51b815260040161031b906107b6565b6101fb336103c8565b6001600160a01b038116811461032d57600080fd5b803561059481610574565b919050565b600080604083850312156105ac57600080fd5b82356105b781610574565b915060208301356105c781610574565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156105fa57600080fd5b813567ffffffffffffffff8082111561061257600080fd5b818401915084601f83011261062657600080fd5b813581811115610638576106386105d2565b604051601f8201601f19908116603f01168101908382118183101715610660576106606105d2565b8160405282815287602084870101111561067957600080fd5b826020860160208301376000928101602001929092525095945050505050565b80356002811061059457600080fd5b60008060008060008060008060008060006101408c8e0312156106ca57600080fd5b8b356106d581610574565b9a5060208c0135995060408c013567ffffffffffffffff808211156106f957600080fd5b818e0191508e601f83011261070d57600080fd5b81358181111561071c57600080fd5b8f602082850101111561072e57600080fd5b602083019b50809a5050505061074660608d01610699565b965060808c0135955060a08c0135945060c08c0135935061076960e08d01610589565b92506107786101008d01610589565b91506101208c013590509295989b509295989b9093969950565b6000602082840312156107a457600080fd5b81356107af81610574565b9392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8183823760009101908152919050565b8b81526001600160a01b038b166020820152604081018a90526060810189905261016081016002891061085457634e487b7160e01b600052602160045260246000fd5b8860808301528760a08301528660c08301528560e08301526108826101008301866001600160a01b03169052565b6001600160a01b03939093166101208201526101400152999850505050505050505056fea26469706673582212202ff0141edaf3f76ff4bf691522a740076b0763d16b29f9b28057904188aeb98c64736f6c634300080b0033496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069";
214
+ const _bytecode = "0x60806040523480156200001157600080fd5b50600054610100900460ff1615808015620000335750600054600160ff909116105b8062000063575062000050306200016d60201b620003301760201c565b15801562000063575060005460ff166001145b620000cc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620000f0576000805461ff0019166101001790555b620001056200017c60201b6200033f1760201c565b6040805160208101909152600081526200011f90620001e4565b801562000166576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5062000326565b6001600160a01b03163b151590565b600054610100900460ff16620001d85760405162461bcd60e51b815260206004820152602b602482015260008051602062000c1283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c3565b620001e262000273565b565b805160205b818110156200026e578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811462000232576001811462000243576200024e565b6000808585888a5af191506200024e565b6000808585895af491505b50806200025a57600080fd5b5050806055018501945050505050620001e9565b505050565b600054610100900460ff16620002cf5760405162461bcd60e51b815260206004820152602b602482015260008051602062000c1283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c3565b620001e233603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6108dc80620003366000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638d80ff0a116100665780638d80ff0a146101075780638da5cb5b1461011a578063d8d11f7814610135578063f2fde38b14610148578063f5dcb7bb1461015b57600080fd5b806312cc533f146100985780632bf613a5146100ad578063715018a6146100e757806388f8bae1146100ef575b600080fd5b6100ab6100a6366004610599565b610182565b005b6100d47fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d881565b6040519081526020015b60405180910390f35b6100ab6101e9565b6100f7600181565b60405190151581526020016100de565b6100ab6101153660046105e8565b6101fd565b6033546040516001600160a01b0390911681526020016100de565b6100d46101433660046106a8565b610285565b6100ab610156366004610792565b6102b2565b6100d47f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921881565b61018a61036e565b60405163f2fde38b60e01b81526001600160a01b03828116600483015283169063f2fde38b90602401600060405180830381600087803b1580156101cd57600080fd5b505af11580156101e1573d6000803e3d6000fd5b505050505050565b6101f161036e565b6101fb60006103c8565b565b805160205b81811015610280578083015160f81c6001820184015160601c601583018501516035840186015160558501870160008560008114610247576001811461025757610262565b6000808585888a5af19150610262565b6000808585895af491505b508061026d57600080fd5b5050806055018501945050505050610202565b505050565b600061029a8c8c8c8c8c8c8c8c8c8c8c61041a565b8051906020012090509b9a5050505050505050505050565b6102ba61036e565b6001600160a01b0381166103245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61032d816103c8565b50565b6001600160a01b03163b151590565b600054610100900460ff166103665760405162461bcd60e51b815260040161031b906107b6565b6101fb610544565b6033546001600160a01b031633146101fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161031b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d88d8d8d8d604051610451929190610801565b604051908190038120610477949392918e908e908e908e908e908e908e90602001610811565b60408051601f1981840301815291905280516020909101209050601960f81b600160f81b6104f7604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b600054610100900460ff1661056b5760405162461bcd60e51b815260040161031b906107b6565b6101fb336103c8565b6001600160a01b038116811461032d57600080fd5b803561059481610574565b919050565b600080604083850312156105ac57600080fd5b82356105b781610574565b915060208301356105c781610574565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156105fa57600080fd5b813567ffffffffffffffff8082111561061257600080fd5b818401915084601f83011261062657600080fd5b813581811115610638576106386105d2565b604051601f8201601f19908116603f01168101908382118183101715610660576106606105d2565b8160405282815287602084870101111561067957600080fd5b826020860160208301376000928101602001929092525095945050505050565b80356002811061059457600080fd5b60008060008060008060008060008060006101408c8e0312156106ca57600080fd5b8b356106d581610574565b9a5060208c0135995060408c013567ffffffffffffffff808211156106f957600080fd5b818e0191508e601f83011261070d57600080fd5b81358181111561071c57600080fd5b8f602082850101111561072e57600080fd5b602083019b50809a5050505061074660608d01610699565b965060808c0135955060a08c0135945060c08c0135935061076960e08d01610589565b92506107786101008d01610589565b91506101208c013590509295989b509295989b9093969950565b6000602082840312156107a457600080fd5b81356107af81610574565b9392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8183823760009101908152919050565b8b81526001600160a01b038b166020820152604081018a90526060810189905261016081016002891061085457634e487b7160e01b600052602160045260246000fd5b8860808301528760a08301528660c08301528560e08301526108826101008301866001600160a01b03169052565b6001600160a01b03939093166101208201526101400152999850505050505050505056fea2646970667358221220d091f04727a2cb4359f71bc8a6cae926af5999c47b5b4ac4683524db6eae355f64736f6c634300080b0033496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069";
215
215
  const isSuperArgs = (xs) => xs.length > 1;
216
216
  class SafeMock__factory extends ethers_1.ContractFactory {
217
217
  constructor(...args) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skalenetwork/upgrade-tools",
3
- "version": "3.0.0-skale-contracts.5",
3
+ "version": "3.0.0-skale-contracts.7",
4
4
  "description": "Scripts to support upgrades of smart contracts",
5
5
  "files": [
6
6
  "dist/**/*"
@@ -30,18 +30,21 @@
30
30
  "@typechain/hardhat": "^8.0.0",
31
31
  "@typescript-eslint/eslint-plugin": "^5.23.0",
32
32
  "@typescript-eslint/parser": "^5.23.0",
33
- "cspell": "^5.20.0",
33
+ "cspell": "^7.0.0",
34
34
  "eslint": "^8.15.0",
35
35
  "install-peers-cli": "^2.2.0",
36
36
  "solhint": "^3.3.7",
37
37
  "ts-node": "^10.5.0",
38
38
  "typechain": "^8.2.0",
39
- "typescript": "^5.1.3"
39
+ "typescript": "^5.1.6"
40
40
  },
41
41
  "dependencies": {
42
42
  "@openzeppelin/contracts-upgradeable": "^4.4.2",
43
- "@skalenetwork/skale-contracts": "^0.0.1-main.19",
44
- "axios": "^0.27.2",
43
+ "@safe-global/api-kit": "^1.3.0",
44
+ "@safe-global/protocol-kit": "^1.2.0",
45
+ "@safe-global/safe-core-sdk-types": "^2.2.0",
46
+ "@skalenetwork/skale-contracts": "^0.0.1-main.20",
47
+ "axios": "^1.4.0",
45
48
  "ethereumjs-util": "^7.1.4"
46
49
  },
47
50
  "peerDependencies": {
@@ -49,7 +52,7 @@
49
52
  "@openzeppelin/hardhat-upgrades": "^1.14.0",
50
53
  "@openzeppelin/upgrades-core": "^1.27.1",
51
54
  "@types/mocha": "^9.1.0",
52
- "ethers": "^5.5.4",
53
- "hardhat": "^2.16.0"
55
+ "ethers": "^5.7.2",
56
+ "hardhat": "2.8.3 - 2.16.1"
54
57
  }
55
58
  }