@skalenetwork/upgrade-tools 0.0.1-custom.7 → 0.0.1-develop.0

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 (79) hide show
  1. package/dist/hardhat.config.d.ts +2 -0
  2. package/dist/hardhat.config.js +20 -1
  3. package/dist/{abi.d.ts → src/abi.d.ts} +0 -0
  4. package/dist/{abi.js → src/abi.js} +0 -0
  5. package/dist/src/deploy.d.ts +5 -0
  6. package/dist/{deploy.js → src/deploy.js} +3 -1
  7. package/dist/{gnosis-safe.d.ts → src/gnosis-safe.d.ts} +1 -1
  8. package/dist/{gnosis-safe.js → src/gnosis-safe.js} +12 -32
  9. package/dist/{index.d.ts → src/index.d.ts} +1 -0
  10. package/dist/{index.js → src/index.js} +6 -1
  11. package/dist/{multiSend.d.ts → src/multiSend.d.ts} +0 -0
  12. package/dist/{multiSend.js → src/multiSend.js} +0 -0
  13. package/dist/{types.d.ts → src/types.d.ts} +0 -0
  14. package/dist/{types.js → src/types.js} +0 -0
  15. package/dist/src/upgrade.d.ts +7 -0
  16. package/dist/src/upgrade.js +203 -0
  17. package/dist/{verification.d.ts → src/verification.d.ts} +0 -0
  18. package/dist/{verification.js → src/verification.js} +0 -0
  19. package/dist/{version.d.ts → src/version.d.ts} +0 -0
  20. package/dist/{version.js → src/version.js} +0 -0
  21. package/dist/typechain-types/AccessControlEnumerableUpgradeable.d.ts +183 -0
  22. package/dist/{upgrade.js → typechain-types/AccessControlEnumerableUpgradeable.js} +0 -1
  23. package/dist/typechain-types/AccessControlUpgradeable.d.ts +167 -0
  24. package/dist/typechain-types/AccessControlUpgradeable.js +2 -0
  25. package/dist/typechain-types/AdminUpgradeabilityProxy.d.ts +145 -0
  26. package/dist/typechain-types/AdminUpgradeabilityProxy.js +2 -0
  27. package/dist/typechain-types/ContextUpgradeable.d.ts +40 -0
  28. package/dist/typechain-types/ContextUpgradeable.js +2 -0
  29. package/dist/typechain-types/ERC165Upgradeable.d.ts +53 -0
  30. package/dist/typechain-types/ERC165Upgradeable.js +2 -0
  31. package/dist/typechain-types/IAccessControlEnumerableUpgradeable.d.ts +159 -0
  32. package/dist/typechain-types/IAccessControlEnumerableUpgradeable.js +2 -0
  33. package/dist/typechain-types/IAccessControlUpgradeable.d.ts +143 -0
  34. package/dist/typechain-types/IAccessControlUpgradeable.js +2 -0
  35. package/dist/typechain-types/IERC165Upgradeable.d.ts +43 -0
  36. package/dist/typechain-types/IERC165Upgradeable.js +2 -0
  37. package/dist/typechain-types/ISafeMock.d.ts +86 -0
  38. package/dist/typechain-types/ISafeMock.js +2 -0
  39. package/dist/typechain-types/Initializable.d.ts +40 -0
  40. package/dist/typechain-types/Initializable.js +2 -0
  41. package/dist/typechain-types/OwnableUpgradeable.d.ts +97 -0
  42. package/dist/typechain-types/OwnableUpgradeable.js +2 -0
  43. package/dist/typechain-types/ProxyAdmin.d.ts +153 -0
  44. package/dist/typechain-types/ProxyAdmin.js +2 -0
  45. package/dist/typechain-types/SafeMock.d.ts +172 -0
  46. package/dist/typechain-types/SafeMock.js +2 -0
  47. package/dist/typechain-types/common.d.ts +21 -0
  48. package/dist/typechain-types/common.js +2 -0
  49. package/dist/typechain-types/factories/AccessControlEnumerableUpgradeable__factory.d.ts +35 -0
  50. package/dist/typechain-types/factories/AccessControlEnumerableUpgradeable__factory.js +279 -0
  51. package/dist/typechain-types/factories/AccessControlUpgradeable__factory.d.ts +35 -0
  52. package/dist/typechain-types/factories/AccessControlUpgradeable__factory.js +236 -0
  53. package/dist/typechain-types/factories/AdminUpgradeabilityProxy__factory.d.ts +74 -0
  54. package/dist/typechain-types/factories/AdminUpgradeabilityProxy__factory.js +187 -0
  55. package/dist/typechain-types/factories/ContextUpgradeable__factory.d.ts +18 -0
  56. package/dist/typechain-types/factories/ContextUpgradeable__factory.js +32 -0
  57. package/dist/typechain-types/factories/ERC165Upgradeable__factory.d.ts +35 -0
  58. package/dist/typechain-types/factories/ERC165Upgradeable__factory.js +51 -0
  59. package/dist/typechain-types/factories/IAccessControlEnumerableUpgradeable__factory.d.ts +35 -0
  60. package/dist/typechain-types/factories/IAccessControlEnumerableUpgradeable__factory.js +234 -0
  61. package/dist/typechain-types/factories/IAccessControlUpgradeable__factory.d.ts +35 -0
  62. package/dist/typechain-types/factories/IAccessControlUpgradeable__factory.js +191 -0
  63. package/dist/typechain-types/factories/IERC165Upgradeable__factory.d.ts +22 -0
  64. package/dist/typechain-types/factories/IERC165Upgradeable__factory.js +38 -0
  65. package/dist/typechain-types/factories/ISafeMock__factory.d.ts +22 -0
  66. package/dist/typechain-types/factories/ISafeMock__factory.js +114 -0
  67. package/dist/typechain-types/factories/Initializable__factory.d.ts +18 -0
  68. package/dist/typechain-types/factories/Initializable__factory.js +32 -0
  69. package/dist/typechain-types/factories/OwnableUpgradeable__factory.d.ts +42 -0
  70. package/dist/typechain-types/factories/OwnableUpgradeable__factory.js +84 -0
  71. package/dist/typechain-types/factories/ProxyAdmin__factory.d.ts +49 -0
  72. package/dist/typechain-types/factories/ProxyAdmin__factory.js +192 -0
  73. package/dist/typechain-types/factories/SafeMock__factory.d.ts +56 -0
  74. package/dist/typechain-types/factories/SafeMock__factory.js +247 -0
  75. package/dist/typechain-types/index.d.ts +26 -0
  76. package/dist/typechain-types/index.js +29 -0
  77. package/package.json +30 -9
  78. package/dist/deploy.d.ts +0 -3
  79. package/dist/upgrade.d.ts +0 -2
@@ -1,4 +1,6 @@
1
1
  import { HardhatUserConfig } from "hardhat/config";
2
+ import '@typechain/hardhat';
2
3
  import "@nomiclabs/hardhat-ethers";
4
+ import "@openzeppelin/hardhat-upgrades";
3
5
  declare const config: HardhatUserConfig;
4
6
  export default config;
@@ -1,5 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("@typechain/hardhat");
3
4
  require("@nomiclabs/hardhat-ethers");
4
- const config = {};
5
+ require("@openzeppelin/hardhat-upgrades");
6
+ const config = {
7
+ solidity: {
8
+ compilers: [
9
+ {
10
+ version: '0.8.11',
11
+ settings: {
12
+ optimizer: {
13
+ enabled: true,
14
+ runs: 200
15
+ }
16
+ }
17
+ }
18
+ ]
19
+ },
20
+ typechain: {
21
+ externalArtifacts: ['node_modules/@openzeppelin/upgrades-core/artifacts/*.json']
22
+ }
23
+ };
5
24
  exports.default = config;
File without changes
File without changes
@@ -0,0 +1,5 @@
1
+ export declare function deployLibraries(libraryNames: string[]): Promise<Map<string, string>>;
2
+ export declare function getLinkedContractFactory(contractName: string, libraries: Map<string, string>): Promise<import("ethers").ContractFactory>;
3
+ export declare function getContractKeyInAbiFile(contract: string): string;
4
+ export declare function getManifestFile(): Promise<string>;
5
+ export declare function getContractFactory(contract: string): Promise<import("ethers").ContractFactory>;
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.getContractFactory = exports.getManifestFile = exports.getContractKeyInAbiFile = void 0;
12
+ exports.getContractFactory = exports.getManifestFile = exports.getContractKeyInAbiFile = exports.getLinkedContractFactory = exports.deployLibraries = void 0;
13
13
  const upgrades_core_1 = require("@openzeppelin/upgrades-core");
14
14
  const hardhat_1 = require("hardhat");
15
15
  const fs_1 = require("fs");
@@ -30,6 +30,7 @@ function deployLibraries(libraryNames) {
30
30
  return libraries;
31
31
  });
32
32
  }
33
+ exports.deployLibraries = deployLibraries;
33
34
  function _linkBytecode(artifact, libraries) {
34
35
  let bytecode = artifact.bytecode;
35
36
  for (const [, fileReferences] of Object.entries(artifact.linkReferences)) {
@@ -56,6 +57,7 @@ function getLinkedContractFactory(contractName, libraries) {
56
57
  return ContractFactory;
57
58
  });
58
59
  }
60
+ exports.getLinkedContractFactory = getLinkedContractFactory;
59
61
  function getContractKeyInAbiFile(contract) {
60
62
  return contract.replace(/([a-zA-Z])(?=[A-Z])/g, '$1_').toLowerCase();
61
63
  }
@@ -1,4 +1,4 @@
1
- import type { ethers } from "ethers";
1
+ import { ethers } from "ethers";
2
2
  import { HardhatEthersHelpers } from "@nomiclabs/hardhat-ethers/types";
3
3
  declare type Ethers = typeof ethers & HardhatEthersHelpers;
4
4
  interface SafeMultisigTransaction {
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -33,9 +37,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
33
37
  Object.defineProperty(exports, "__esModule", { value: true });
34
38
  exports.sendSafeTransaction = exports.createMultiSendTransaction = exports.getSafeRelayUrl = exports.getSafeTransactionUrl = void 0;
35
39
  const axios_1 = __importDefault(require("axios"));
36
- const ethers_eip712_1 = require("ethers-eip712");
37
40
  const ethUtil = __importStar(require("ethereumjs-util"));
38
41
  const chalk_1 = __importDefault(require("chalk"));
42
+ const ethers_1 = require("ethers");
39
43
  var Network;
40
44
  (function (Network) {
41
45
  Network[Network["MAINNET"] = 1] = "MAINNET";
@@ -43,7 +47,6 @@ var Network;
43
47
  Network[Network["GANACHE"] = 1337] = "GANACHE";
44
48
  Network[Network["HARDHAT"] = 31337] = "HARDHAT";
45
49
  })(Network || (Network = {}));
46
- const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
47
50
  const ADDRESSES = {
48
51
  multiSend: {
49
52
  [Network.MAINNET]: "0x8D29bE29923b68abfDD21e541b9374737B49cdAD",
@@ -68,7 +71,7 @@ function getMultiSendAddress(chainId) {
68
71
  return ADDRESSES.multiSend[chainId];
69
72
  }
70
73
  else if ([Network.GANACHE, Network.HARDHAT].includes(chainId)) {
71
- return ZERO_ADDRESS;
74
+ return ethers_1.ethers.constants.AddressZero;
72
75
  }
73
76
  else {
74
77
  throw Error(`Can't get multiSend contract at network with chainId = ${chainId}`);
@@ -114,6 +117,8 @@ function createMultiSendTransaction(ethers, safeAddress, privateKey, transaction
114
117
  const multiSendAddress = getMultiSendAddress(chainId);
115
118
  const multiSendAbi = [{ "constant": false, "inputs": [{ "internalType": "bytes", "name": "transactions", "type": "bytes" }], "name": "multiSend", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }];
116
119
  const multiSend = new ethers.Contract(multiSendAddress, new ethers.utils.Interface(multiSendAbi), ethers.provider);
120
+ const safeAbi = [{ "constant": true, "inputs": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "enum Enum.Operation", "name": "operation", "type": "uint8" }, { "internalType": "uint256", "name": "safeTxGas", "type": "uint256" }, { "internalType": "uint256", "name": "baseGas", "type": "uint256" }, { "internalType": "uint256", "name": "gasPrice", "type": "uint256" }, { "internalType": "address", "name": "gasToken", "type": "address" }, { "internalType": "address", "name": "refundReceiver", "type": "address" }, { "internalType": "uint256", "name": "_nonce", "type": "uint256" }], "name": "getTransactionHash", "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "payable": false, "stateMutability": "view", "type": "function" }];
121
+ const safe = new ethers.Contract(safeAddress, new ethers.utils.Interface(safeAbi), ethers.provider);
117
122
  let nonce = 0;
118
123
  if (!isSafeMock) {
119
124
  try {
@@ -132,39 +137,14 @@ function createMultiSendTransaction(ethers, safeAddress, privateKey, transaction
132
137
  "value": 0,
133
138
  "data": multiSend.interface.encodeFunctionData("multiSend", [concatTransactions(transactions)]),
134
139
  "operation": 1,
135
- "gasToken": ZERO_ADDRESS,
140
+ "gasToken": ethers.constants.AddressZero,
136
141
  "safeTxGas": 0,
137
142
  "baseGas": 0,
138
143
  "gasPrice": 0,
139
- "refundReceiver": ZERO_ADDRESS,
144
+ "refundReceiver": ethers.constants.AddressZero,
140
145
  "nonce": nonce, // Nonce of the Safe, transaction cannot be executed until Safe's nonce is not equal to this nonce
141
146
  };
142
- const typedData = {
143
- types: {
144
- EIP712Domain: [
145
- { name: "verifyingContract", type: "address" },
146
- ],
147
- SafeTx: [
148
- { type: "address", name: "to" },
149
- { type: "uint256", name: "value" },
150
- { type: "bytes", name: "data" },
151
- { type: "uint8", name: "operation" },
152
- { type: "uint256", name: "safeTxGas" },
153
- { type: "uint256", name: "baseGas" },
154
- { type: "uint256", name: "gasPrice" },
155
- { type: "address", name: "gasToken" },
156
- { type: "address", name: "refundReceiver" },
157
- { type: "uint256", name: "nonce" },
158
- ]
159
- },
160
- primaryType: 'SafeTx',
161
- domain: {
162
- verifyingContract: safeAddress
163
- },
164
- message: Object.assign(Object.assign({}, tx), { data: ethers.utils.arrayify(tx.data) })
165
- };
166
- const digest = ethers_eip712_1.TypedDataUtils.encodeDigest(typedData);
167
- const digestHex = ethers.utils.hexlify(digest);
147
+ const digestHex = yield safe.getTransactionHash(tx.to, tx.value, tx.data, tx.operation, tx.safeTxGas, tx.baseGas, tx.gasPrice, tx.gasToken, tx.refundReceiver, tx.nonce);
168
148
  const privateKeyBuffer = ethUtil.toBuffer(privateKey);
169
149
  const { r, s, v } = ethUtil.ecsign(ethUtil.toBuffer(digestHex), privateKeyBuffer);
170
150
  const signature = ethUtil.toRpcSig(v, r, s).toString();
@@ -3,5 +3,6 @@ export * from "./deploy";
3
3
  export * from "./gnosis-safe";
4
4
  export * from "./multiSend";
5
5
  export * from "./upgrade";
6
+ export * from "./types";
6
7
  export * from "./verification";
7
8
  export * from "./version";
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -15,5 +19,6 @@ __exportStar(require("./deploy"), exports);
15
19
  __exportStar(require("./gnosis-safe"), exports);
16
20
  __exportStar(require("./multiSend"), exports);
17
21
  __exportStar(require("./upgrade"), exports);
22
+ __exportStar(require("./types"), exports);
18
23
  __exportStar(require("./verification"), exports);
19
24
  __exportStar(require("./version"), exports);
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,7 @@
1
+ import { SkaleABIFile } from "./types";
2
+ import { Contract } from "ethers";
3
+ import { OwnableUpgradeable } from "../typechain-types";
4
+ export declare function getContractFactoryAndUpdateManifest(contract: string): Promise<import("ethers").ContractFactory>;
5
+ declare type DeploymentAction<ContractManagerType extends Contract> = (safeTransactions: string[], abi: SkaleABIFile, contractManager: ContractManagerType) => Promise<void>;
6
+ export declare function upgrade<ContractManagerType extends OwnableUpgradeable>(projectName: string, targetVersion: string, getDeployedVersion: (abi: SkaleABIFile) => Promise<string | undefined>, setVersion: (safeTransaction: string[], abi: SkaleABIFile, newVersion: string) => Promise<void>, safeMockAccessRequirements: string[], contractNamesToUpgrade: string[], deployNewContracts: DeploymentAction<ContractManagerType>, initialize: DeploymentAction<ContractManagerType>): Promise<void>;
7
+ export {};
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.upgrade = exports.getContractFactoryAndUpdateManifest = void 0;
16
+ const deploy_1 = require("./deploy");
17
+ const fs_1 = require("fs");
18
+ const hardhat_1 = require("hardhat");
19
+ const hardhat_2 = __importDefault(require("hardhat"));
20
+ const upgrades_core_1 = require("@openzeppelin/upgrades-core");
21
+ const chalk_1 = __importDefault(require("chalk"));
22
+ const admin_1 = require("@openzeppelin/hardhat-upgrades/dist/admin");
23
+ const version_1 = require("./version");
24
+ const abi_1 = require("./abi");
25
+ const verification_1 = require("./verification");
26
+ const multiSend_1 = require("./multiSend");
27
+ const gnosis_safe_1 = require("./gnosis-safe");
28
+ function getContractFactoryAndUpdateManifest(contract) {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ const manifest = JSON.parse(yield fs_1.promises.readFile(yield (0, deploy_1.getManifestFile)(), "utf-8"));
31
+ const { linkReferences } = yield hardhat_1.artifacts.readArtifact(contract);
32
+ if (!Object.keys(linkReferences).length)
33
+ return yield hardhat_1.ethers.getContractFactory(contract);
34
+ const librariesToUpgrade = [];
35
+ const oldLibraries = {};
36
+ if (manifest.libraries === undefined) {
37
+ Object.assign(manifest, { libraries: {} });
38
+ }
39
+ for (const key of Object.keys(linkReferences)) {
40
+ const libraryName = Object.keys(linkReferences[key])[0];
41
+ const { bytecode } = yield hardhat_1.artifacts.readArtifact(libraryName);
42
+ if (manifest.libraries[libraryName] === undefined) {
43
+ librariesToUpgrade.push(libraryName);
44
+ continue;
45
+ }
46
+ const libraryBytecodeHash = manifest.libraries[libraryName].bytecodeHash;
47
+ if ((0, upgrades_core_1.hashBytecode)(bytecode) !== libraryBytecodeHash) {
48
+ librariesToUpgrade.push(libraryName);
49
+ }
50
+ else {
51
+ oldLibraries[libraryName] = manifest.libraries[libraryName].address;
52
+ }
53
+ }
54
+ const libraries = yield (0, deploy_1.deployLibraries)(librariesToUpgrade);
55
+ for (const [libraryName, libraryAddress] of libraries.entries()) {
56
+ const { bytecode } = yield hardhat_1.artifacts.readArtifact(libraryName);
57
+ manifest.libraries[libraryName] = { "address": libraryAddress, "bytecodeHash": (0, upgrades_core_1.hashBytecode)(bytecode) };
58
+ }
59
+ Object.assign(libraries, oldLibraries);
60
+ yield fs_1.promises.writeFile(yield (0, deploy_1.getManifestFile)(), JSON.stringify(manifest, null, 4));
61
+ return yield (0, deploy_1.getLinkedContractFactory)(contract, libraries);
62
+ });
63
+ }
64
+ exports.getContractFactoryAndUpdateManifest = getContractFactoryAndUpdateManifest;
65
+ function upgrade(projectName, targetVersion, getDeployedVersion, setVersion, safeMockAccessRequirements, contractNamesToUpgrade, deployNewContracts, initialize) {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ if (!process.env.ABI) {
68
+ console.log(chalk_1.default.red("Set path to file with ABI and addresses to ABI environment variables"));
69
+ return;
70
+ }
71
+ const abiFilename = process.env.ABI;
72
+ const abi = JSON.parse(yield fs_1.promises.readFile(abiFilename, "utf-8"));
73
+ const proxyAdmin = yield (0, admin_1.getManifestAdmin)(hardhat_2.default);
74
+ const contractManagerName = "ContractManager";
75
+ const contractManagerFactory = yield hardhat_1.ethers.getContractFactory(contractManagerName);
76
+ const contractManager = (contractManagerFactory.attach(abi[(0, deploy_1.getContractKeyInAbiFile)(contractManagerName) + "_address"]));
77
+ const deployedVersion = yield getDeployedVersion(abi);
78
+ const version = yield (0, version_1.getVersion)();
79
+ if (deployedVersion) {
80
+ if (deployedVersion !== targetVersion) {
81
+ console.log(chalk_1.default.red(`This script can't upgrade version ${deployedVersion} to ${version}`));
82
+ process.exit(1);
83
+ }
84
+ }
85
+ else {
86
+ console.log(chalk_1.default.yellow(`Can't check currently deployed version of ${projectName}`));
87
+ }
88
+ console.log(`Will mark updated version as ${version}`);
89
+ const [deployer] = yield hardhat_1.ethers.getSigners();
90
+ let safe = yield proxyAdmin.owner();
91
+ const safeTransactions = [];
92
+ let safeMock = undefined;
93
+ if ((yield hardhat_1.ethers.provider.getCode(safe)) === "0x") {
94
+ console.log("Owner is not a contract");
95
+ if (deployer.address !== safe) {
96
+ console.log(chalk_1.default.red(`Used address does not have permissions to upgrade ${projectName}`));
97
+ process.exit(1);
98
+ }
99
+ console.log(chalk_1.default.blue("Deploy SafeMock to simulate upgrade via multisig"));
100
+ const safeMockFactory = yield hardhat_1.ethers.getContractFactory("SafeMock");
101
+ safeMock = yield safeMockFactory.deploy();
102
+ yield safeMock.deployTransaction.wait();
103
+ console.log(chalk_1.default.blue("Transfer ownership to SafeMock"));
104
+ safe = safeMock.address;
105
+ yield (yield proxyAdmin.transferOwnership(safe)).wait();
106
+ yield (yield contractManager.transferOwnership(safe)).wait();
107
+ for (const contractName of safeMockAccessRequirements) {
108
+ const contractFactory = yield getContractFactoryAndUpdateManifest(contractName);
109
+ const contractAddress = abi[(0, deploy_1.getContractKeyInAbiFile)(contractName) + "_address"];
110
+ const contract = contractFactory.attach(contractAddress);
111
+ console.log(chalk_1.default.blue(`Grant access to ${contractName}`));
112
+ yield (yield contract.grantRole(yield contract.DEFAULT_ADMIN_ROLE(), safe)).wait();
113
+ }
114
+ }
115
+ else {
116
+ try {
117
+ const safeMockFactory = yield hardhat_1.ethers.getContractFactory("SafeMock");
118
+ const checkSafeMock = safeMockFactory.attach(safe);
119
+ if (yield checkSafeMock.IS_SAFE_MOCK()) {
120
+ safeMock = checkSafeMock;
121
+ }
122
+ }
123
+ catch (e) {
124
+ console.log(chalk_1.default.yellow("Owner is not SafeMock"));
125
+ }
126
+ }
127
+ // Deploy new contracts
128
+ yield deployNewContracts(safeTransactions, abi, contractManager);
129
+ // deploy new implementations
130
+ const contractsToUpgrade = [];
131
+ for (const contract of contractNamesToUpgrade) {
132
+ const contractFactory = yield getContractFactoryAndUpdateManifest(contract);
133
+ let _contract = contract;
134
+ if (contract === "BountyV2") {
135
+ if (!abi[(0, deploy_1.getContractKeyInAbiFile)(contract) + "_address"])
136
+ _contract = "Bounty";
137
+ }
138
+ const proxyAddress = abi[(0, deploy_1.getContractKeyInAbiFile)(_contract) + "_address"];
139
+ console.log(`Prepare upgrade of ${contract}`);
140
+ const newImplementationAddress = yield hardhat_1.upgrades.prepareUpgrade(proxyAddress, contractFactory, {
141
+ unsafeAllowLinkedLibraries: true,
142
+ unsafeAllowRenames: true
143
+ });
144
+ const currentImplementationAddress = yield (0, upgrades_core_1.getImplementationAddress)(hardhat_1.network.provider, proxyAddress);
145
+ if (newImplementationAddress !== currentImplementationAddress) {
146
+ contractsToUpgrade.push({
147
+ proxyAddress,
148
+ implementationAddress: newImplementationAddress,
149
+ name: contract,
150
+ abi: (0, abi_1.getAbi)(contractFactory.interface)
151
+ });
152
+ yield (0, verification_1.verify)(contract, newImplementationAddress, []);
153
+ }
154
+ else {
155
+ console.log(chalk_1.default.gray(`Contract ${contract} is up to date`));
156
+ }
157
+ }
158
+ // Switch proxies to new implementations
159
+ for (const contract of contractsToUpgrade) {
160
+ console.log(chalk_1.default.yellowBright(`Prepare transaction to upgrade ${contract.name} at ${contract.proxyAddress} to ${contract.implementationAddress}`));
161
+ safeTransactions.push((0, multiSend_1.encodeTransaction)(0, proxyAdmin.address, 0, proxyAdmin.interface.encodeFunctionData("upgrade", [contract.proxyAddress, contract.implementationAddress])));
162
+ abi[(0, deploy_1.getContractKeyInAbiFile)(contract.name) + "_abi"] = contract.abi;
163
+ }
164
+ yield initialize(safeTransactions, abi, contractManager);
165
+ // write version
166
+ yield setVersion(safeTransactions, abi, version);
167
+ yield fs_1.promises.writeFile(`data/transactions-${version}-${hardhat_1.network.name}.json`, JSON.stringify(safeTransactions, null, 4));
168
+ let privateKey = hardhat_1.network.config.accounts[0];
169
+ if (hardhat_1.network.config.accounts === "remote") {
170
+ // Don't have an information about private key
171
+ // Use random one because we most probable run tests
172
+ privateKey = hardhat_1.ethers.Wallet.createRandom().privateKey;
173
+ }
174
+ const safeTx = yield (0, gnosis_safe_1.createMultiSendTransaction)(hardhat_1.ethers, safe, privateKey, safeTransactions, safeMock !== undefined);
175
+ if (!safeMock) {
176
+ const chainId = (yield hardhat_1.ethers.provider.getNetwork()).chainId;
177
+ yield (0, gnosis_safe_1.sendSafeTransaction)(safe, chainId, safeTx);
178
+ }
179
+ else {
180
+ console.log(chalk_1.default.blue("Send upgrade transactions to safe mock"));
181
+ try {
182
+ yield (yield deployer.sendTransaction({
183
+ to: safeMock.address,
184
+ value: safeTx.value,
185
+ data: safeTx.data,
186
+ })).wait();
187
+ console.log(chalk_1.default.blue("Transactions have been sent"));
188
+ }
189
+ finally {
190
+ console.log(chalk_1.default.blue("Return ownership to wallet"));
191
+ yield (yield safeMock.transferProxyAdminOwnership(contractManager.address, deployer.address)).wait();
192
+ yield (yield safeMock.transferProxyAdminOwnership(proxyAdmin.address, deployer.address)).wait();
193
+ if ((yield proxyAdmin.owner()) !== deployer.address) {
194
+ console.log(chalk_1.default.blue("Something went wrong with ownership transfer"));
195
+ process.exit(1);
196
+ }
197
+ }
198
+ }
199
+ yield fs_1.promises.writeFile(`data/${projectName}-${version}-${hardhat_1.network.name}-abi.json`, JSON.stringify(abi, null, 4));
200
+ console.log("Done");
201
+ });
202
+ }
203
+ exports.upgrade = upgrade;
File without changes
File without changes
File without changes
@@ -0,0 +1,183 @@
1
+ import { BaseContract, BigNumber, BigNumberish, BytesLike, CallOverrides, ContractTransaction, Overrides, PopulatedTransaction, Signer, utils } from "ethers";
2
+ import { FunctionFragment, Result, EventFragment } from "@ethersproject/abi";
3
+ import { Listener, Provider } from "@ethersproject/providers";
4
+ import { TypedEventFilter, TypedEvent, TypedListener, OnEvent } from "./common";
5
+ export interface AccessControlEnumerableUpgradeableInterface extends utils.Interface {
6
+ contractName: "AccessControlEnumerableUpgradeable";
7
+ functions: {
8
+ "DEFAULT_ADMIN_ROLE()": FunctionFragment;
9
+ "getRoleAdmin(bytes32)": FunctionFragment;
10
+ "getRoleMember(bytes32,uint256)": FunctionFragment;
11
+ "getRoleMemberCount(bytes32)": FunctionFragment;
12
+ "grantRole(bytes32,address)": FunctionFragment;
13
+ "hasRole(bytes32,address)": FunctionFragment;
14
+ "renounceRole(bytes32,address)": FunctionFragment;
15
+ "revokeRole(bytes32,address)": FunctionFragment;
16
+ "supportsInterface(bytes4)": FunctionFragment;
17
+ };
18
+ encodeFunctionData(functionFragment: "DEFAULT_ADMIN_ROLE", values?: undefined): string;
19
+ encodeFunctionData(functionFragment: "getRoleAdmin", values: [BytesLike]): string;
20
+ encodeFunctionData(functionFragment: "getRoleMember", values: [BytesLike, BigNumberish]): string;
21
+ encodeFunctionData(functionFragment: "getRoleMemberCount", values: [BytesLike]): string;
22
+ encodeFunctionData(functionFragment: "grantRole", values: [BytesLike, string]): string;
23
+ encodeFunctionData(functionFragment: "hasRole", values: [BytesLike, string]): string;
24
+ encodeFunctionData(functionFragment: "renounceRole", values: [BytesLike, string]): string;
25
+ encodeFunctionData(functionFragment: "revokeRole", values: [BytesLike, string]): string;
26
+ encodeFunctionData(functionFragment: "supportsInterface", values: [BytesLike]): string;
27
+ decodeFunctionResult(functionFragment: "DEFAULT_ADMIN_ROLE", data: BytesLike): Result;
28
+ decodeFunctionResult(functionFragment: "getRoleAdmin", data: BytesLike): Result;
29
+ decodeFunctionResult(functionFragment: "getRoleMember", data: BytesLike): Result;
30
+ decodeFunctionResult(functionFragment: "getRoleMemberCount", data: BytesLike): Result;
31
+ decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result;
32
+ decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result;
33
+ decodeFunctionResult(functionFragment: "renounceRole", data: BytesLike): Result;
34
+ decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result;
35
+ decodeFunctionResult(functionFragment: "supportsInterface", data: BytesLike): Result;
36
+ events: {
37
+ "Initialized(uint8)": EventFragment;
38
+ "RoleAdminChanged(bytes32,bytes32,bytes32)": EventFragment;
39
+ "RoleGranted(bytes32,address,address)": EventFragment;
40
+ "RoleRevoked(bytes32,address,address)": EventFragment;
41
+ };
42
+ getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment;
43
+ getEvent(nameOrSignatureOrTopic: "RoleAdminChanged"): EventFragment;
44
+ getEvent(nameOrSignatureOrTopic: "RoleGranted"): EventFragment;
45
+ getEvent(nameOrSignatureOrTopic: "RoleRevoked"): EventFragment;
46
+ }
47
+ export declare type InitializedEvent = TypedEvent<[number], {
48
+ version: number;
49
+ }>;
50
+ export declare type InitializedEventFilter = TypedEventFilter<InitializedEvent>;
51
+ export declare type RoleAdminChangedEvent = TypedEvent<[
52
+ string,
53
+ string,
54
+ string
55
+ ], {
56
+ role: string;
57
+ previousAdminRole: string;
58
+ newAdminRole: string;
59
+ }>;
60
+ export declare type RoleAdminChangedEventFilter = TypedEventFilter<RoleAdminChangedEvent>;
61
+ export declare type RoleGrantedEvent = TypedEvent<[
62
+ string,
63
+ string,
64
+ string
65
+ ], {
66
+ role: string;
67
+ account: string;
68
+ sender: string;
69
+ }>;
70
+ export declare type RoleGrantedEventFilter = TypedEventFilter<RoleGrantedEvent>;
71
+ export declare type RoleRevokedEvent = TypedEvent<[
72
+ string,
73
+ string,
74
+ string
75
+ ], {
76
+ role: string;
77
+ account: string;
78
+ sender: string;
79
+ }>;
80
+ export declare type RoleRevokedEventFilter = TypedEventFilter<RoleRevokedEvent>;
81
+ export interface AccessControlEnumerableUpgradeable extends BaseContract {
82
+ contractName: "AccessControlEnumerableUpgradeable";
83
+ connect(signerOrProvider: Signer | Provider | string): this;
84
+ attach(addressOrName: string): this;
85
+ deployed(): Promise<this>;
86
+ interface: AccessControlEnumerableUpgradeableInterface;
87
+ queryFilter<TEvent extends TypedEvent>(event: TypedEventFilter<TEvent>, fromBlockOrBlockhash?: string | number | undefined, toBlock?: string | number | undefined): Promise<Array<TEvent>>;
88
+ listeners<TEvent extends TypedEvent>(eventFilter?: TypedEventFilter<TEvent>): Array<TypedListener<TEvent>>;
89
+ listeners(eventName?: string): Array<Listener>;
90
+ removeAllListeners<TEvent extends TypedEvent>(eventFilter: TypedEventFilter<TEvent>): this;
91
+ removeAllListeners(eventName?: string): this;
92
+ off: OnEvent<this>;
93
+ on: OnEvent<this>;
94
+ once: OnEvent<this>;
95
+ removeListener: OnEvent<this>;
96
+ functions: {
97
+ DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>;
98
+ getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<[string]>;
99
+ getRoleMember(role: BytesLike, index: BigNumberish, overrides?: CallOverrides): Promise<[string]>;
100
+ getRoleMemberCount(role: BytesLike, overrides?: CallOverrides): Promise<[BigNumber]>;
101
+ grantRole(role: BytesLike, account: string, overrides?: Overrides & {
102
+ from?: string | Promise<string>;
103
+ }): Promise<ContractTransaction>;
104
+ hasRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<[boolean]>;
105
+ renounceRole(role: BytesLike, account: string, overrides?: Overrides & {
106
+ from?: string | Promise<string>;
107
+ }): Promise<ContractTransaction>;
108
+ revokeRole(role: BytesLike, account: string, overrides?: Overrides & {
109
+ from?: string | Promise<string>;
110
+ }): Promise<ContractTransaction>;
111
+ supportsInterface(interfaceId: BytesLike, overrides?: CallOverrides): Promise<[boolean]>;
112
+ };
113
+ DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<string>;
114
+ getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<string>;
115
+ getRoleMember(role: BytesLike, index: BigNumberish, overrides?: CallOverrides): Promise<string>;
116
+ getRoleMemberCount(role: BytesLike, overrides?: CallOverrides): Promise<BigNumber>;
117
+ grantRole(role: BytesLike, account: string, overrides?: Overrides & {
118
+ from?: string | Promise<string>;
119
+ }): Promise<ContractTransaction>;
120
+ hasRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<boolean>;
121
+ renounceRole(role: BytesLike, account: string, overrides?: Overrides & {
122
+ from?: string | Promise<string>;
123
+ }): Promise<ContractTransaction>;
124
+ revokeRole(role: BytesLike, account: string, overrides?: Overrides & {
125
+ from?: string | Promise<string>;
126
+ }): Promise<ContractTransaction>;
127
+ supportsInterface(interfaceId: BytesLike, overrides?: CallOverrides): Promise<boolean>;
128
+ callStatic: {
129
+ DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<string>;
130
+ getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<string>;
131
+ getRoleMember(role: BytesLike, index: BigNumberish, overrides?: CallOverrides): Promise<string>;
132
+ getRoleMemberCount(role: BytesLike, overrides?: CallOverrides): Promise<BigNumber>;
133
+ grantRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<void>;
134
+ hasRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<boolean>;
135
+ renounceRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<void>;
136
+ revokeRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<void>;
137
+ supportsInterface(interfaceId: BytesLike, overrides?: CallOverrides): Promise<boolean>;
138
+ };
139
+ filters: {
140
+ "Initialized(uint8)"(version?: null): InitializedEventFilter;
141
+ Initialized(version?: null): InitializedEventFilter;
142
+ "RoleAdminChanged(bytes32,bytes32,bytes32)"(role?: BytesLike | null, previousAdminRole?: BytesLike | null, newAdminRole?: BytesLike | null): RoleAdminChangedEventFilter;
143
+ RoleAdminChanged(role?: BytesLike | null, previousAdminRole?: BytesLike | null, newAdminRole?: BytesLike | null): RoleAdminChangedEventFilter;
144
+ "RoleGranted(bytes32,address,address)"(role?: BytesLike | null, account?: string | null, sender?: string | null): RoleGrantedEventFilter;
145
+ RoleGranted(role?: BytesLike | null, account?: string | null, sender?: string | null): RoleGrantedEventFilter;
146
+ "RoleRevoked(bytes32,address,address)"(role?: BytesLike | null, account?: string | null, sender?: string | null): RoleRevokedEventFilter;
147
+ RoleRevoked(role?: BytesLike | null, account?: string | null, sender?: string | null): RoleRevokedEventFilter;
148
+ };
149
+ estimateGas: {
150
+ DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<BigNumber>;
151
+ getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<BigNumber>;
152
+ getRoleMember(role: BytesLike, index: BigNumberish, overrides?: CallOverrides): Promise<BigNumber>;
153
+ getRoleMemberCount(role: BytesLike, overrides?: CallOverrides): Promise<BigNumber>;
154
+ grantRole(role: BytesLike, account: string, overrides?: Overrides & {
155
+ from?: string | Promise<string>;
156
+ }): Promise<BigNumber>;
157
+ hasRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<BigNumber>;
158
+ renounceRole(role: BytesLike, account: string, overrides?: Overrides & {
159
+ from?: string | Promise<string>;
160
+ }): Promise<BigNumber>;
161
+ revokeRole(role: BytesLike, account: string, overrides?: Overrides & {
162
+ from?: string | Promise<string>;
163
+ }): Promise<BigNumber>;
164
+ supportsInterface(interfaceId: BytesLike, overrides?: CallOverrides): Promise<BigNumber>;
165
+ };
166
+ populateTransaction: {
167
+ DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<PopulatedTransaction>;
168
+ getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<PopulatedTransaction>;
169
+ getRoleMember(role: BytesLike, index: BigNumberish, overrides?: CallOverrides): Promise<PopulatedTransaction>;
170
+ getRoleMemberCount(role: BytesLike, overrides?: CallOverrides): Promise<PopulatedTransaction>;
171
+ grantRole(role: BytesLike, account: string, overrides?: Overrides & {
172
+ from?: string | Promise<string>;
173
+ }): Promise<PopulatedTransaction>;
174
+ hasRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<PopulatedTransaction>;
175
+ renounceRole(role: BytesLike, account: string, overrides?: Overrides & {
176
+ from?: string | Promise<string>;
177
+ }): Promise<PopulatedTransaction>;
178
+ revokeRole(role: BytesLike, account: string, overrides?: Overrides & {
179
+ from?: string | Promise<string>;
180
+ }): Promise<PopulatedTransaction>;
181
+ supportsInterface(interfaceId: BytesLike, overrides?: CallOverrides): Promise<PopulatedTransaction>;
182
+ };
183
+ }
@@ -1,3 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = {};