@skalenetwork/upgrade-tools 3.0.0-verification.0 → 4.0.0-develop.1

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 (145) hide show
  1. package/dist/hardhat.config.d.ts +3 -3
  2. package/dist/hardhat.config.js +6 -17
  3. package/dist/hardhat.config.js.map +1 -0
  4. package/dist/src/abi.d.ts +2 -2
  5. package/dist/src/abi.js +8 -4
  6. package/dist/src/abi.js.map +1 -0
  7. package/dist/src/contractFactory.d.ts +4 -0
  8. package/dist/src/contractFactory.js +84 -0
  9. package/dist/src/contractFactory.js.map +1 -0
  10. package/dist/src/contractVerifier.d.ts +25 -0
  11. package/dist/src/contractVerifier.js +71 -0
  12. package/dist/src/contractVerifier.js.map +1 -0
  13. package/dist/src/deploy.d.ts +5 -4
  14. package/dist/src/deploy.js +77 -58
  15. package/dist/src/deploy.js.map +1 -0
  16. package/dist/src/exitCodes.d.ts +8 -0
  17. package/dist/src/exitCodes.js +13 -0
  18. package/dist/src/exitCodes.js.map +1 -0
  19. package/dist/src/gnosis-safe.d.ts +2 -2
  20. package/dist/src/gnosis-safe.js +105 -96
  21. package/dist/src/gnosis-safe.js.map +1 -0
  22. package/dist/src/index.d.ts +0 -1
  23. package/dist/src/index.js +1 -1
  24. package/dist/src/index.js.map +1 -0
  25. package/dist/src/nonceProvider.d.ts +10 -0
  26. package/dist/src/nonceProvider.js +34 -0
  27. package/dist/src/nonceProvider.js.map +1 -0
  28. package/dist/src/proxyAdmin.d.ts +4 -0
  29. package/dist/src/proxyAdmin.js +56 -0
  30. package/dist/src/proxyAdmin.js.map +1 -0
  31. package/dist/src/submitters/auto-submitter.d.ts +22 -5
  32. package/dist/src/submitters/auto-submitter.js +135 -120
  33. package/dist/src/submitters/auto-submitter.js.map +1 -0
  34. package/dist/src/submitters/eoa-submitter.d.ts +3 -2
  35. package/dist/src/submitters/eoa-submitter.js +23 -12
  36. package/dist/src/submitters/eoa-submitter.js.map +1 -0
  37. package/dist/src/submitters/index.js +1 -0
  38. package/dist/src/submitters/index.js.map +1 -0
  39. package/dist/src/submitters/safe-ima-legacy-marionette-submitter.d.ts +4 -3
  40. package/dist/src/submitters/safe-ima-legacy-marionette-submitter.js +14 -13
  41. package/dist/src/submitters/safe-ima-legacy-marionette-submitter.js.map +1 -0
  42. package/dist/src/submitters/safe-ima-marionette-submitter.d.ts +3 -3
  43. package/dist/src/submitters/safe-ima-marionette-submitter.js +13 -11
  44. package/dist/src/submitters/safe-ima-marionette-submitter.js.map +1 -0
  45. package/dist/src/submitters/safe-submitter.d.ts +4 -4
  46. package/dist/src/submitters/safe-submitter.js +4 -3
  47. package/dist/src/submitters/safe-submitter.js.map +1 -0
  48. package/dist/src/submitters/safe-to-ima-submitter.d.ts +11 -6
  49. package/dist/src/submitters/safe-to-ima-submitter.js +23 -15
  50. package/dist/src/submitters/safe-to-ima-submitter.js.map +1 -0
  51. package/dist/src/submitters/submitter.d.ts +3 -3
  52. package/dist/src/submitters/submitter.js +11 -7
  53. package/dist/src/submitters/submitter.js.map +1 -0
  54. package/dist/src/submitters/types/marionette.d.ts +6 -3
  55. package/dist/src/submitters/types/marionette.js +1 -0
  56. package/dist/src/submitters/types/marionette.js.map +1 -0
  57. package/dist/src/types/SkaleManifestData.js +1 -0
  58. package/dist/src/types/SkaleManifestData.js.map +1 -0
  59. package/dist/src/types/upgrader.d.ts +12 -0
  60. package/dist/{typechain-types/AccessControlUpgradeable.js → src/types/upgrader.js} +1 -0
  61. package/dist/src/types/upgrader.js.map +1 -0
  62. package/dist/src/upgrader.d.ts +27 -12
  63. package/dist/src/upgrader.js +145 -95
  64. package/dist/src/upgrader.js.map +1 -0
  65. package/dist/src/verification.d.ts +2 -2
  66. package/dist/src/verification.js +69 -28
  67. package/dist/src/verification.js.map +1 -0
  68. package/dist/src/verifiers/blockscoutVerifier.d.ts +11 -0
  69. package/dist/src/verifiers/blockscoutVerifier.js +65 -0
  70. package/dist/src/verifiers/blockscoutVerifier.js.map +1 -0
  71. package/dist/src/verifiers/etherscanVerifier.d.ts +19 -0
  72. package/dist/src/verifiers/etherscanVerifier.js +105 -0
  73. package/dist/src/verifiers/etherscanVerifier.js.map +1 -0
  74. package/dist/src/verifiers/skaleBlockscoutVerifier.d.ts +7 -0
  75. package/dist/src/verifiers/skaleBlockscoutVerifier.js +60 -0
  76. package/dist/src/verifiers/skaleBlockscoutVerifier.js.map +1 -0
  77. package/dist/src/version.js +24 -2
  78. package/dist/src/version.js.map +1 -0
  79. package/dist/typechain-types/AdminUpgradeabilityProxy.d.ts +59 -54
  80. package/dist/typechain-types/AdminUpgradeabilityProxy.js +1 -0
  81. package/dist/typechain-types/AdminUpgradeabilityProxy.js.map +1 -0
  82. package/dist/typechain-types/ProxyAdmin.d.ts +94 -137
  83. package/dist/typechain-types/ProxyAdmin.js +1 -0
  84. package/dist/typechain-types/ProxyAdmin.js.map +1 -0
  85. package/dist/typechain-types/common.d.ts +40 -11
  86. package/dist/typechain-types/common.js +1 -0
  87. package/dist/typechain-types/common.js.map +1 -0
  88. package/dist/typechain-types/factories/AdminUpgradeabilityProxy__factory.d.ts +71 -41
  89. package/dist/typechain-types/factories/AdminUpgradeabilityProxy__factory.js +8 -11
  90. package/dist/typechain-types/factories/AdminUpgradeabilityProxy__factory.js.map +1 -0
  91. package/dist/typechain-types/factories/ProxyAdmin__factory.d.ts +129 -41
  92. package/dist/typechain-types/factories/ProxyAdmin__factory.js +8 -11
  93. package/dist/typechain-types/factories/ProxyAdmin__factory.js.map +1 -0
  94. package/dist/typechain-types/factories/index.d.ts +2 -0
  95. package/dist/typechain-types/factories/index.js +11 -0
  96. package/dist/typechain-types/factories/index.js.map +1 -0
  97. package/dist/typechain-types/index.d.ts +1 -22
  98. package/dist/typechain-types/index.js +36 -23
  99. package/dist/typechain-types/index.js.map +1 -0
  100. package/package.json +23 -27
  101. package/dist/src/multiSend.d.ts +0 -2
  102. package/dist/src/multiSend.js +0 -46
  103. package/dist/typechain-types/AccessControlEnumerableUpgradeable.d.ts +0 -183
  104. package/dist/typechain-types/AccessControlEnumerableUpgradeable.js +0 -2
  105. package/dist/typechain-types/AccessControlUpgradeable.d.ts +0 -167
  106. package/dist/typechain-types/ContextUpgradeable.d.ts +0 -40
  107. package/dist/typechain-types/ContextUpgradeable.js +0 -2
  108. package/dist/typechain-types/ERC165Upgradeable.d.ts +0 -53
  109. package/dist/typechain-types/ERC165Upgradeable.js +0 -2
  110. package/dist/typechain-types/IAccessControlEnumerableUpgradeable.d.ts +0 -159
  111. package/dist/typechain-types/IAccessControlEnumerableUpgradeable.js +0 -2
  112. package/dist/typechain-types/IAccessControlUpgradeable.d.ts +0 -143
  113. package/dist/typechain-types/IAccessControlUpgradeable.js +0 -2
  114. package/dist/typechain-types/IERC165Upgradeable.d.ts +0 -43
  115. package/dist/typechain-types/IERC165Upgradeable.js +0 -2
  116. package/dist/typechain-types/ISafeMock.d.ts +0 -86
  117. package/dist/typechain-types/ISafeMock.js +0 -2
  118. package/dist/typechain-types/Initializable.d.ts +0 -40
  119. package/dist/typechain-types/Initializable.js +0 -2
  120. package/dist/typechain-types/OwnableUpgradeable.d.ts +0 -97
  121. package/dist/typechain-types/OwnableUpgradeable.js +0 -2
  122. package/dist/typechain-types/SafeMock.d.ts +0 -172
  123. package/dist/typechain-types/SafeMock.js +0 -2
  124. package/dist/typechain-types/factories/AccessControlEnumerableUpgradeable__factory.d.ts +0 -35
  125. package/dist/typechain-types/factories/AccessControlEnumerableUpgradeable__factory.js +0 -279
  126. package/dist/typechain-types/factories/AccessControlUpgradeable__factory.d.ts +0 -35
  127. package/dist/typechain-types/factories/AccessControlUpgradeable__factory.js +0 -236
  128. package/dist/typechain-types/factories/ContextUpgradeable__factory.d.ts +0 -18
  129. package/dist/typechain-types/factories/ContextUpgradeable__factory.js +0 -32
  130. package/dist/typechain-types/factories/ERC165Upgradeable__factory.d.ts +0 -35
  131. package/dist/typechain-types/factories/ERC165Upgradeable__factory.js +0 -51
  132. package/dist/typechain-types/factories/IAccessControlEnumerableUpgradeable__factory.d.ts +0 -35
  133. package/dist/typechain-types/factories/IAccessControlEnumerableUpgradeable__factory.js +0 -234
  134. package/dist/typechain-types/factories/IAccessControlUpgradeable__factory.d.ts +0 -35
  135. package/dist/typechain-types/factories/IAccessControlUpgradeable__factory.js +0 -191
  136. package/dist/typechain-types/factories/IERC165Upgradeable__factory.d.ts +0 -22
  137. package/dist/typechain-types/factories/IERC165Upgradeable__factory.js +0 -38
  138. package/dist/typechain-types/factories/ISafeMock__factory.d.ts +0 -22
  139. package/dist/typechain-types/factories/ISafeMock__factory.js +0 -114
  140. package/dist/typechain-types/factories/Initializable__factory.d.ts +0 -18
  141. package/dist/typechain-types/factories/Initializable__factory.js +0 -32
  142. package/dist/typechain-types/factories/OwnableUpgradeable__factory.d.ts +0 -42
  143. package/dist/typechain-types/factories/OwnableUpgradeable__factory.js +0 -84
  144. package/dist/typechain-types/factories/SafeMock__factory.d.ts +0 -56
  145. package/dist/typechain-types/factories/SafeMock__factory.js +0 -247
@@ -1,5 +1,5 @@
1
- import { UnsignedTransaction } from "ethers";
1
+ import { Transaction } from "ethers";
2
2
  export declare abstract class Submitter {
3
- abstract submit(transactions: UnsignedTransaction[]): Promise<void>;
4
- _atomicityWarning(): void;
3
+ abstract submit(transactions: Transaction[]): Promise<void>;
4
+ protected static atomicityWarning(): void;
5
5
  }
@@ -4,18 +4,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Submitter = void 0;
7
+ const exitCodes_1 = require("../exitCodes");
7
8
  const chalk_1 = __importDefault(require("chalk"));
8
9
  class Submitter {
9
- // private
10
- _atomicityWarning() {
11
- if (!process.env.ALLOW_NOT_ATOMIC_UPGRADE) {
12
- console.log(chalk_1.default.red("The upgrade will consist of multiple transactions and will not be atomic"));
13
- console.log(chalk_1.default.red("If not atomic upgrade is OK set ALLOW_NOT_ATOMIC_UPGRADE environment variable"));
14
- process.exit(1);
10
+ // Protected
11
+ static atomicityWarning() {
12
+ if (process.env.ALLOW_NOT_ATOMIC_UPGRADE) {
13
+ console.log(chalk_1.default.yellow("Not atomic upgrade is performing"));
15
14
  }
16
15
  else {
17
- console.log(chalk_1.default.yellow("Not atomic upgrade is performing"));
16
+ console.log(chalk_1.default.red("The upgrade will consist" +
17
+ " of multiple transactions and will not be atomic"));
18
+ console.log(chalk_1.default.red("If not atomic upgrade is OK" +
19
+ " set ALLOW_NOT_ATOMIC_UPGRADE environment variable"));
20
+ process.exit(exitCodes_1.EXIT_CODES.NOT_ATOMIC_UPGRADE);
18
21
  }
19
22
  }
20
23
  }
21
24
  exports.Submitter = Submitter;
25
+ //# sourceMappingURL=submitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submitter.js","sourceRoot":"","sources":["../../../src/submitters/submitter.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAwC;AAExC,kDAA0B;AAG1B,MAAsB,SAAS;IAG3B,YAAY;IAEF,MAAM,CAAC,gBAAgB;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B;gBAC5C,kDAAkD,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,6BAA6B;gBAC/C,oDAAoD,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,sBAAU,CAAC,kBAAkB,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;CACJ;AAhBD,8BAgBC"}
@@ -1,12 +1,15 @@
1
- import { BigNumberish, BytesLike } from "ethers";
2
- import { ethers as RawEthers } from "ethers";
1
+ import { BigNumberish, BytesLike, ethers as RawEthers } from "ethers";
3
2
  export declare const MARIONETTE_ADDRESS = "0xD2c0DeFACe000000000000000000000000000000";
4
3
  type FunctionCallStruct = {
5
4
  receiver: string;
6
5
  value: BigNumberish;
7
6
  data: BytesLike;
8
7
  };
9
- export interface Marionette extends RawEthers.Contract {
8
+ export interface LegacyMarionette extends RawEthers.BaseContract {
9
+ encodeFunctionCall(receiver: string, value: BigNumberish, data: BytesLike): Promise<BytesLike>;
10
+ version(): Promise<string>;
11
+ }
12
+ export interface Marionette extends RawEthers.BaseContract {
10
13
  encodeFunctionCalls(functionCalls: FunctionCallStruct[]): Promise<BytesLike>;
11
14
  version(): Promise<string>;
12
15
  }
@@ -2,3 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MARIONETTE_ADDRESS = void 0;
4
4
  exports.MARIONETTE_ADDRESS = "0xD2c0DeFACe000000000000000000000000000000";
5
+ //# sourceMappingURL=marionette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marionette.js","sourceRoot":"","sources":["../../../../src/submitters/types/marionette.ts"],"names":[],"mappings":";;;AAGa,QAAA,kBAAkB,GAAG,4CAA4C,CAAC"}
@@ -1,2 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=SkaleManifestData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkaleManifestData.js","sourceRoot":"","sources":["../../../src/types/SkaleManifestData.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { Instance } from "@skalenetwork/skale-contracts-ethers-v6";
2
+ export interface ContractToUpgrade {
3
+ proxyAddress: string;
4
+ implementationAddress: string;
5
+ name: string;
6
+ }
7
+ export interface Project {
8
+ name: string;
9
+ instance: Instance;
10
+ version: string;
11
+ contractNamesToUpgrade: string[];
12
+ }
@@ -1,2 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=upgrader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrader.js","sourceRoot":"","sources":["../../../src/types/upgrader.ts"],"names":[],"mappings":""}
@@ -1,18 +1,33 @@
1
- import { UnsignedTransaction } from "ethers";
1
+ import { Transaction } from "ethers";
2
+ import { Project } from "./types/upgrader";
3
+ import { Instance } from "@skalenetwork/skale-contracts-ethers-v6";
2
4
  import { Submitter } from "./submitters/submitter";
3
- import { Instance } from "@skalenetwork/skale-contracts-ethers-v5";
4
5
  export declare abstract class Upgrader {
5
- instance: Instance;
6
- targetVersion: string;
7
- contractNamesToUpgrade: string[];
8
- projectName: string;
9
- transactions: UnsignedTransaction[];
10
- submitter: Submitter;
11
- constructor(projectName: string, targetVersion: string, instance: Instance, contractNamesToUpgrade: string[], submitter?: Submitter);
6
+ private targetVersion;
7
+ private contractNamesToUpgrade;
8
+ private projectName;
9
+ private submitter;
10
+ private nonceProvider?;
11
+ private deploySemaphore;
12
+ protected instance: Instance;
13
+ protected transactions: Transaction[];
14
+ constructor(project: Project, submitter?: Submitter);
12
15
  abstract getDeployedVersion: () => Promise<string | undefined>;
13
16
  abstract setVersion: (newVersion: string) => Promise<void>;
14
- deployNewContracts: () => Promise<void>;
15
- initialize: () => Promise<void>;
17
+ deployNewContracts?: () => Promise<void>;
18
+ initialize?: () => Promise<void>;
16
19
  upgrade(): Promise<void>;
17
- _getContractFactoryAndUpdateManifest(contract: string): Promise<import("ethers").ContractFactory>;
20
+ getOwner(): Promise<string>;
21
+ private callInitialize;
22
+ private callDeployNewContracts;
23
+ private prepareVersion;
24
+ private writeTransactions;
25
+ private static verify;
26
+ private switchToNewImplementations;
27
+ private deployNewImplementations;
28
+ private protectedDeployNewImplementation;
29
+ private deployNewImplementation;
30
+ private prepareUpgrade;
31
+ private getNormalizedDeployedVersion;
32
+ private checkVersion;
18
33
  }
@@ -4,126 +4,176 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Upgrader = void 0;
7
- const hardhat_1 = __importDefault(require("hardhat"));
7
+ const hardhat_1 = require("hardhat");
8
+ const proxyAdmin_1 = require("./proxyAdmin");
9
+ const auto_submitter_1 = require("./submitters/auto-submitter");
10
+ const exitCodes_1 = require("./exitCodes");
11
+ const nonceProvider_1 = require("./nonceProvider");
12
+ const semaphore_async_await_1 = __importDefault(require("semaphore-async-await"));
8
13
  const chalk_1 = __importDefault(require("chalk"));
9
- const hardhat_2 = require("hardhat");
10
- const admin_1 = require("@openzeppelin/hardhat-upgrades/dist/admin");
11
- const version_1 = require("./version");
12
14
  const fs_1 = require("fs");
13
- const deploy_1 = require("./deploy");
15
+ const contractFactory_1 = require("./contractFactory");
14
16
  const upgrades_core_1 = require("@openzeppelin/upgrades-core");
17
+ const version_1 = require("./version");
15
18
  const verification_1 = require("./verification");
16
- const auto_submitter_1 = require("./submitters/auto-submitter");
19
+ const withoutNull = (array) => array.
20
+ filter((element) => element !== null);
21
+ // TODO: Set to 8 when upgrade plugins become thread safe
22
+ const maxSimultaneousDeployments = 1;
23
+ // 10 minutes
24
+ const deployTimeout = 60e4;
17
25
  class Upgrader {
18
- constructor(projectName, targetVersion, instance, contractNamesToUpgrade, submitter = new auto_submitter_1.AutoSubmitter()) {
19
- // protected
20
- this.deployNewContracts = () => { return Promise.resolve(); };
21
- this.initialize = () => { return Promise.resolve(); };
22
- this.targetVersion = targetVersion;
23
- if (!targetVersion.includes('-')) {
24
- this.targetVersion = targetVersion + '-stable.0';
26
+ constructor(project, submitter) {
27
+ this.targetVersion = project.version;
28
+ if (!project.version.includes("-")) {
29
+ this.targetVersion = `${project.version}-stable.0`;
25
30
  }
26
- this.instance = instance;
27
- this.contractNamesToUpgrade = contractNamesToUpgrade;
28
- this.projectName = projectName;
31
+ this.instance = project.instance;
32
+ this.contractNamesToUpgrade = project.contractNamesToUpgrade;
33
+ this.projectName = project.name;
29
34
  this.transactions = [];
30
- this.submitter = submitter;
35
+ this.submitter = submitter ?? new auto_submitter_1.AutoSubmitter(this);
36
+ this.deploySemaphore = new semaphore_async_await_1.default(maxSimultaneousDeployments);
31
37
  }
32
- // public
38
+ // Public
33
39
  async upgrade() {
34
- const proxyAdmin = await (0, admin_1.getManifestAdmin)(hardhat_1.default);
35
- let deployedVersion = await this.getDeployedVersion();
36
- const version = await (0, version_1.getVersion)();
37
- if (deployedVersion) {
38
- if (!deployedVersion.includes('-')) {
39
- deployedVersion = deployedVersion + '-stable.0';
40
- }
41
- if (deployedVersion !== this.targetVersion) {
42
- console.log(chalk_1.default.red(`This script can't upgrade version ${deployedVersion} to ${version}`));
43
- process.exit(1);
40
+ const version = await this.prepareVersion();
41
+ await this.callDeployNewContracts();
42
+ const contractsToUpgrade = await this.deployNewImplementations();
43
+ await this.switchToNewImplementations(contractsToUpgrade);
44
+ await this.callInitialize();
45
+ // Write version
46
+ await this.setVersion(version);
47
+ await this.writeTransactions(version);
48
+ await this.submitter.submit(this.transactions);
49
+ await Upgrader.verify(contractsToUpgrade);
50
+ console.log("Done");
51
+ }
52
+ async getOwner() {
53
+ const proxyAddresses = await Promise.all(this.contractNamesToUpgrade.map((contract) => this.instance.getContractAddress(contract), this));
54
+ const admins = await Promise.all(proxyAddresses.map((proxy) => (0, proxyAdmin_1.getProxyAdmin)(proxy)));
55
+ const owners = await Promise.all(admins.map((admin) => admin.owner()));
56
+ return owners.reduce((owner1, owner2) => {
57
+ if (owner1 !== owner2) {
58
+ throw Error("Proxies have different owners");
44
59
  }
60
+ return owner1;
61
+ });
62
+ }
63
+ // Private
64
+ async callInitialize() {
65
+ if (typeof this.initialize !== "undefined") {
66
+ await this.initialize();
45
67
  }
46
- else {
47
- console.log(chalk_1.default.yellow(`Can't check currently deployed version of ${this.projectName}`));
68
+ }
69
+ async callDeployNewContracts() {
70
+ if (typeof this.deployNewContracts !== "undefined") {
71
+ // Deploy new contracts
72
+ await this.deployNewContracts();
48
73
  }
74
+ }
75
+ async prepareVersion() {
76
+ const version = await (0, version_1.getVersion)();
77
+ await this.checkVersion(version);
49
78
  console.log(`Will mark updated version as ${version}`);
50
- // Deploy new contracts
51
- await this.deployNewContracts();
52
- // Deploy new implementations
53
- const contractsToUpgrade = [];
54
- for (const contract of this.contractNamesToUpgrade) {
55
- const contractFactory = await this._getContractFactoryAndUpdateManifest(contract), proxyAddress = (await this.instance.getContract(contract)).address;
56
- console.log(`Prepare upgrade of ${contract}`);
57
- const currentImplementationAddress = await (0, upgrades_core_1.getImplementationAddress)(hardhat_2.network.provider, proxyAddress), newImplementationAddress = await hardhat_2.upgrades.prepareUpgrade(proxyAddress, contractFactory, {
58
- unsafeAllowLinkedLibraries: true,
59
- unsafeAllowRenames: true
60
- });
61
- if (newImplementationAddress !== currentImplementationAddress) {
62
- contractsToUpgrade.push({
63
- proxyAddress,
64
- implementationAddress: newImplementationAddress,
65
- name: contract
66
- });
67
- }
68
- else {
69
- console.log(chalk_1.default.gray(`Contract ${contract} is up to date`));
70
- }
71
- }
72
- // Switch proxies to new implementations
73
- for (const contract of contractsToUpgrade) {
74
- console.log(chalk_1.default.yellowBright(`Prepare transaction to upgrade ${contract.name} at ${contract.proxyAddress} to ${contract.implementationAddress}`));
75
- this.transactions.push({
76
- to: proxyAdmin.address,
77
- data: proxyAdmin.interface.encodeFunctionData("upgrade", [contract.proxyAddress, contract.implementationAddress])
78
- });
79
- }
80
- await this.initialize();
81
- // write version
82
- await this.setVersion(version);
83
- await fs_1.promises.writeFile(`data/transactions-${version}-${hardhat_2.network.name}.json`, JSON.stringify(this.transactions, null, 4));
84
- await this.submitter.submit(this.transactions);
79
+ return version;
80
+ }
81
+ async writeTransactions(version) {
82
+ const indentation = 4;
83
+ await fs_1.promises.writeFile(`data/transactions-${version}-${hardhat_1.network.name}.json`, JSON.stringify(this.transactions, null, indentation));
84
+ }
85
+ static async verify(contractsToUpgrade) {
85
86
  if (process.env.NO_VERIFY) {
86
87
  console.log("Skip verification");
87
88
  }
88
89
  else {
89
90
  console.log("Start verification");
90
- for (const contract of contractsToUpgrade) {
91
- await (0, verification_1.verify)(contract.name, contract.implementationAddress, []);
92
- }
91
+ await Promise.all(contractsToUpgrade.map((contract) => (0, verification_1.verify)(contract.name, contract.implementationAddress)));
93
92
  }
94
- console.log("Done");
95
93
  }
96
- // private
97
- async _getContractFactoryAndUpdateManifest(contract) {
98
- const { linkReferences } = await hardhat_2.artifacts.readArtifact(contract), manifest = JSON.parse(await fs_1.promises.readFile(await (0, deploy_1.getManifestFile)(), "utf-8"));
99
- if (!Object.keys(linkReferences).length)
100
- return await hardhat_2.ethers.getContractFactory(contract);
101
- const librariesToUpgrade = [], oldLibraries = {};
102
- if (manifest.libraries === undefined) {
103
- Object.assign(manifest, { libraries: {} });
94
+ async switchToNewImplementations(contractsToUpgrade) {
95
+ const upgradeTransactions = await Promise.all(contractsToUpgrade.map((contract) => (0, proxyAdmin_1.getUpgradeTransaction)(contract.proxyAddress, contract.implementationAddress)));
96
+ contractsToUpgrade.forEach((contract, index) => {
97
+ const infoMessage = `Prepare transaction to upgrade ${contract.name}` +
98
+ ` at ${contract.proxyAddress}` +
99
+ ` to ${contract.implementationAddress}`;
100
+ console.log(chalk_1.default.yellowBright(infoMessage));
101
+ this.transactions.push(upgradeTransactions[index]);
102
+ });
103
+ }
104
+ async deployNewImplementations() {
105
+ const [deployer] = await hardhat_1.ethers.getSigners();
106
+ this.nonceProvider ?? (this.nonceProvider = await nonceProvider_1.NonceProvider.createForWallet(deployer));
107
+ const contracts = await Promise.all(this.contractNamesToUpgrade.
108
+ map(this.protectedDeployNewImplementation, this));
109
+ return withoutNull(contracts);
110
+ }
111
+ async protectedDeployNewImplementation(contract) {
112
+ await this.deploySemaphore.acquire();
113
+ let result = null;
114
+ try {
115
+ result = await this.deployNewImplementation(contract);
104
116
  }
105
- for (const key of Object.keys(linkReferences)) {
106
- const libraryName = Object.keys(linkReferences[key])[0], { bytecode } = await hardhat_2.artifacts.readArtifact(libraryName);
107
- if (manifest.libraries[libraryName] === undefined) {
108
- librariesToUpgrade.push(libraryName);
109
- continue;
110
- }
111
- const libraryBytecodeHash = manifest.libraries[libraryName].bytecodeHash;
112
- if ((0, upgrades_core_1.hashBytecode)(bytecode) !== libraryBytecodeHash) {
113
- librariesToUpgrade.push(libraryName);
117
+ finally {
118
+ this.deploySemaphore.release();
119
+ }
120
+ return result;
121
+ }
122
+ async deployNewImplementation(contract) {
123
+ const contractFactory = await (0, contractFactory_1.getContractFactoryAndUpdateManifest)(contract, this.nonceProvider);
124
+ const proxyAddress = await (await this.instance.getContract(contract)).getAddress();
125
+ console.log(`Prepare upgrade of ${contract}`);
126
+ return this.prepareUpgrade(contract, proxyAddress, contractFactory);
127
+ }
128
+ async prepareUpgrade(contractName, proxyAddress, contractFactory) {
129
+ const currentImplementationAddress = await (0, upgrades_core_1.getImplementationAddress)(hardhat_1.network.provider, proxyAddress);
130
+ const nonce = this.nonceProvider?.reserveNonce();
131
+ const newImplementationAddress = await hardhat_1.upgrades.prepareUpgrade(proxyAddress, contractFactory, {
132
+ "timeout": deployTimeout,
133
+ "txOverrides": {
134
+ nonce
135
+ },
136
+ "unsafeAllowLinkedLibraries": true,
137
+ "unsafeAllowRenames": true
138
+ });
139
+ if (newImplementationAddress !== currentImplementationAddress) {
140
+ return {
141
+ "implementationAddress": newImplementationAddress,
142
+ "name": contractName,
143
+ proxyAddress
144
+ };
145
+ }
146
+ console.log(chalk_1.default.gray(`Contract ${contractName} is up to date`));
147
+ if (nonce) {
148
+ this.nonceProvider?.releaseNonce(nonce);
149
+ }
150
+ return null;
151
+ }
152
+ async getNormalizedDeployedVersion() {
153
+ const deployedVersion = await this.getDeployedVersion();
154
+ if (deployedVersion) {
155
+ if (!deployedVersion.includes("-")) {
156
+ return `${deployedVersion}-stable.0`;
114
157
  }
115
- else {
116
- oldLibraries[libraryName] = manifest.libraries[libraryName].address;
158
+ return deployedVersion;
159
+ }
160
+ return deployedVersion;
161
+ }
162
+ async checkVersion(version) {
163
+ const deployedVersion = await this.getNormalizedDeployedVersion();
164
+ if (deployedVersion) {
165
+ if (deployedVersion !== this.targetVersion) {
166
+ const cannotUpgradeMessage = `This script can't upgrade version ${deployedVersion}` +
167
+ ` to ${version}`;
168
+ console.log(chalk_1.default.red(cannotUpgradeMessage));
169
+ process.exit(exitCodes_1.EXIT_CODES.BAD_VERSION);
117
170
  }
118
171
  }
119
- const libraries = await (0, deploy_1.deployLibraries)(librariesToUpgrade);
120
- for (const [libraryName, libraryAddress] of libraries.entries()) {
121
- const { bytecode } = await hardhat_2.artifacts.readArtifact(libraryName);
122
- manifest.libraries[libraryName] = { "address": libraryAddress, "bytecodeHash": (0, upgrades_core_1.hashBytecode)(bytecode) };
172
+ else {
173
+ const cannotCheckMessage = `Can't check currently deployed version of ${this.projectName}`;
174
+ console.log(chalk_1.default.yellow(cannotCheckMessage));
123
175
  }
124
- Object.assign(libraries, oldLibraries);
125
- await fs_1.promises.writeFile(await (0, deploy_1.getManifestFile)(), JSON.stringify(manifest, null, 4));
126
- return await (0, deploy_1.getLinkedContractFactory)(contract, libraries);
127
176
  }
128
177
  }
129
178
  exports.Upgrader = Upgrader;
179
+ //# sourceMappingURL=upgrader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrader.js","sourceRoot":"","sources":["../../src/upgrader.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare function verify(contractName: string, contractAddress: string, constructorArguments: object): Promise<void>;
2
- export declare function verifyProxy(contractName: string, proxyAddress: string, constructorArguments: object): Promise<void>;
1
+ export declare const verify: (contractName: string, contractAddress: string) => Promise<void>;
2
+ export declare const verifyProxy: (contractName: string, proxyAddress: string) => Promise<void>;
@@ -5,38 +5,79 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.verifyProxy = exports.verify = void 0;
7
7
  const hardhat_1 = require("hardhat");
8
- const chain_config_1 = require("@nomicfoundation/hardhat-verify/internal/chain-config");
8
+ const blockscoutVerifier_1 = require("./verifiers/blockscoutVerifier");
9
+ const etherscanVerifier_1 = require("./verifiers/etherscanVerifier");
10
+ const skaleBlockscoutVerifier_1 = require("./verifiers/skaleBlockscoutVerifier");
9
11
  const chalk_1 = __importDefault(require("chalk"));
10
12
  const upgrades_core_1 = require("@openzeppelin/upgrades-core");
11
- async function verify(contractName, contractAddress, constructorArguments) {
12
- const chainId = (await hardhat_1.ethers.provider.getNetwork()).chainId;
13
- if (chain_config_1.builtinChains.find(chain => chain.chainId === chainId) !== undefined) {
14
- for (let retry = 0; retry <= 5; ++retry) {
15
- try {
16
- await (0, hardhat_1.run)("verify:verify", {
17
- address: contractAddress,
18
- constructorArguments
19
- });
20
- break;
21
- }
22
- catch (e) {
23
- if (e instanceof Error) {
24
- if (e.toString().includes("Contract source code already verified")) {
25
- console.log(chalk_1.default.grey(`${contractName} is already verified`));
26
- return;
27
- }
28
- console.log(chalk_1.default.red(`Contract ${contractName} was not verified on etherscan`));
29
- console.log(e.toString());
30
- }
31
- else {
32
- console.log("Unknown exception type:", e);
33
- }
13
+ const setupEtherscan = async (chainId) => {
14
+ if (process.env.ETHERSCAN) {
15
+ if (await etherscanVerifier_1.EtherscanVerifier.isChainSupported(chainId)) {
16
+ return new etherscanVerifier_1.EtherscanVerifier(process.env.ETHERSCAN, chainId);
17
+ }
18
+ console.log(chalk_1.default.gray(`Etherscan does not support chainId ${chainId}. Skipping verification on Etherscan.`));
19
+ }
20
+ else {
21
+ console.log(chalk_1.default.yellow(`No etherscan API key provided. Skipping verification on Etherscan.`));
22
+ }
23
+ return null;
24
+ };
25
+ const setupBlockscout = (chainId) => {
26
+ const verifier = blockscoutVerifier_1.BlockscoutVerifier.createFromChainId(chainId);
27
+ if (verifier) {
28
+ return verifier;
29
+ }
30
+ console.log(chalk_1.default.gray(`Blockscout API url is not known for chainId ${chainId}.`));
31
+ if (process.env.EXPLORER_URL) {
32
+ console.log(chalk_1.default.gray("Using EXPLORER_URL to setup verification."));
33
+ return new blockscoutVerifier_1.BlockscoutVerifier(`${process.env.EXPLORER_URL}/api`, process.env.EXPLORER_URL);
34
+ }
35
+ console.log(chalk_1.default.gray("Skipping verification on Blockscout."));
36
+ return null;
37
+ };
38
+ const setupSkale = async () => {
39
+ if (process.env.ENDPOINT) {
40
+ try {
41
+ const verifier = await skaleBlockscoutVerifier_1.SkaleBlockscoutVerifier.createFromEndpoint(process.env.ENDPOINT);
42
+ if (verifier) {
43
+ return verifier;
34
44
  }
35
45
  }
46
+ catch (error) {
47
+ console.log(chalk_1.default.yellow(error));
48
+ }
49
+ }
50
+ else {
51
+ console.log(chalk_1.default.gray("ENDPOINT is not provided. Can't determine SKALE block explorer API url."));
52
+ }
53
+ console.log(chalk_1.default.gray("Skipping verification on SKALE block explorer."));
54
+ return null;
55
+ };
56
+ const verifiers = [];
57
+ let verifiersSetup = false;
58
+ const setupVerifiers = async () => {
59
+ if (!verifiersSetup) {
60
+ verifiersSetup = true;
61
+ const { chainId } = await hardhat_1.ethers.provider.getNetwork();
62
+ const candidates = [
63
+ await setupEtherscan(chainId),
64
+ setupBlockscout(chainId),
65
+ await setupSkale()
66
+ ];
67
+ verifiers.push(...candidates.filter(item => item !== null));
36
68
  }
37
- }
69
+ };
70
+ const verify = async (contractName, contractAddress) => {
71
+ await setupVerifiers();
72
+ await Promise.all(verifiers.map(verifier => verifier.verify({
73
+ contractAddress,
74
+ contractName
75
+ })));
76
+ };
38
77
  exports.verify = verify;
39
- async function verifyProxy(contractName, proxyAddress, constructorArguments) {
40
- await verify(contractName, await (0, upgrades_core_1.getImplementationAddress)(hardhat_1.network.provider, proxyAddress), constructorArguments);
41
- }
78
+ const verifyProxy = async (contractName, proxyAddress) => {
79
+ await (0, exports.verify)(contractName, await (0, upgrades_core_1.getImplementationAddress)(hardhat_1.network.provider, proxyAddress));
80
+ await (0, exports.verify)("TransparentUpgradeableProxy", proxyAddress);
81
+ };
42
82
  exports.verifyProxy = verifyProxy;
83
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ContractVerifier, VerificationRequestParameters, VerificationTarget } from "../contractVerifier";
2
+ import { ValidationResponse } from "@nomicfoundation/hardhat-verify/internal/utilities";
3
+ export declare class BlockscoutVerifier extends ContractVerifier {
4
+ name: string;
5
+ private readonly blockscout;
6
+ constructor(apiURL: string, browserURL: string);
7
+ static createFromChainId(chainId: bigint): BlockscoutVerifier | null;
8
+ protected isAlreadyVerified(verificationTarget: VerificationTarget): Promise<boolean>;
9
+ protected submitVerificationRequest(target: VerificationTarget, params: VerificationRequestParameters): Promise<ValidationResponse>;
10
+ protected getContractUrl(verificationTarget: VerificationTarget): string;
11
+ }