@skalenetwork/upgrade-tools 4.0.0-update-verify.6 → 4.0.0-update-gnosis-service.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.
- package/dist/src/contractVerifier.d.ts +24 -12
- package/dist/src/contractVerifier.js +47 -43
- package/dist/src/contractVerifier.js.map +1 -1
- package/dist/src/gnosis-safe.js +6 -37
- package/dist/src/gnosis-safe.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/ownership-transfer/constants.d.ts +8 -0
- package/dist/src/ownership-transfer/constants.js +33 -0
- package/dist/src/ownership-transfer/constants.js.map +1 -0
- package/dist/src/ownership-transfer/contractAdmin.d.ts +55 -0
- package/dist/src/ownership-transfer/contractAdmin.js +206 -0
- package/dist/src/ownership-transfer/contractAdmin.js.map +1 -0
- package/dist/src/ownership-transfer/instanceAdmin.d.ts +51 -0
- package/dist/src/ownership-transfer/instanceAdmin.js +223 -0
- package/dist/src/ownership-transfer/instanceAdmin.js.map +1 -0
- package/dist/src/ownership-transfer/permission-utils.d.ts +32 -0
- package/dist/src/ownership-transfer/permission-utils.js +192 -0
- package/dist/src/ownership-transfer/permission-utils.js.map +1 -0
- package/dist/src/ownership-transfer/utils.d.ts +19 -0
- package/dist/src/ownership-transfer/utils.js +201 -0
- package/dist/src/ownership-transfer/utils.js.map +1 -0
- package/dist/src/proxyUpgrader.d.ts +18 -0
- package/dist/src/proxyUpgrader.js +72 -0
- package/dist/src/proxyUpgrader.js.map +1 -0
- package/dist/src/upgrader.d.ts +11 -6
- package/dist/src/upgrader.js +61 -61
- package/dist/src/upgrader.js.map +1 -1
- package/dist/src/upgraders/abstractTransparentProxyUpgrader.d.ts +19 -0
- package/dist/src/upgraders/abstractTransparentProxyUpgrader.js +57 -0
- package/dist/src/upgraders/abstractTransparentProxyUpgrader.js.map +1 -0
- package/dist/src/upgraders/beaconUpgrader.d.ts +8 -0
- package/dist/src/upgraders/beaconUpgrader.js +37 -0
- package/dist/src/upgraders/beaconUpgrader.js.map +1 -0
- package/dist/src/upgraders/transparentProxyUpgrader.d.ts +5 -0
- package/dist/src/upgraders/transparentProxyUpgrader.js +20 -0
- package/dist/src/upgraders/transparentProxyUpgrader.js.map +1 -0
- package/dist/src/upgraders/v4TransparentProxyUpgrader.d.ts +5 -0
- package/dist/src/upgraders/v4TransparentProxyUpgrader.js +19 -0
- package/dist/src/upgraders/v4TransparentProxyUpgrader.js.map +1 -0
- package/dist/src/verification.d.ts +2 -17
- package/dist/src/verification.js +60 -210
- package/dist/src/verification.js.map +1 -1
- package/dist/src/verifiers/blockscoutVerifier.d.ts +11 -0
- package/dist/src/verifiers/blockscoutVerifier.js +69 -0
- package/dist/src/verifiers/blockscoutVerifier.js.map +1 -0
- package/dist/src/verifiers/etherscanVerifier.d.ts +19 -0
- package/dist/src/verifiers/etherscanVerifier.js +105 -0
- package/dist/src/verifiers/etherscanVerifier.js.map +1 -0
- package/dist/src/verifiers/skaleBlockscoutVerifier.d.ts +7 -0
- package/dist/src/verifiers/skaleBlockscoutVerifier.js +60 -0
- package/dist/src/verifiers/skaleBlockscoutVerifier.js.map +1 -0
- package/package.json +5 -5
- package/dist/src/proxyAdmin.d.ts +0 -4
- package/dist/src/proxyAdmin.js +0 -56
- package/dist/src/proxyAdmin.js.map +0 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { EoaSubmitter, SafeSubmitter } from "../submitters";
|
|
2
|
+
import { Instance } from "@skalenetwork/skale-contracts-ethers-v6";
|
|
3
|
+
export interface InstanceAdminOptions {
|
|
4
|
+
oldOwner: string;
|
|
5
|
+
submitter: SafeSubmitter | EoaSubmitter;
|
|
6
|
+
renounceRoles: boolean;
|
|
7
|
+
newOwner: string;
|
|
8
|
+
readonly: boolean;
|
|
9
|
+
testMode: boolean;
|
|
10
|
+
rolesToCheck?: string[];
|
|
11
|
+
managerRolesToCheck?: bigint[];
|
|
12
|
+
}
|
|
13
|
+
interface ContractId {
|
|
14
|
+
name: string;
|
|
15
|
+
address?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class InstanceAdmin {
|
|
18
|
+
private instance?;
|
|
19
|
+
private contractMetadata;
|
|
20
|
+
private contractIds;
|
|
21
|
+
private bytes32RolesToCheck;
|
|
22
|
+
private managerRolesToCheck;
|
|
23
|
+
private oldOwner;
|
|
24
|
+
private newOwner;
|
|
25
|
+
private readonly;
|
|
26
|
+
private submitter;
|
|
27
|
+
private renounceRoles;
|
|
28
|
+
private testMode;
|
|
29
|
+
constructor(contractIds: ContractId[], options: InstanceAdminOptions, instance?: Instance);
|
|
30
|
+
executeOwnershipTransfer(): Promise<void>;
|
|
31
|
+
private initialize;
|
|
32
|
+
private processGrantStepIfRequired;
|
|
33
|
+
private processRenounceStepIfRequired;
|
|
34
|
+
private submitRenounceRolesTransactions;
|
|
35
|
+
private confirmAndSubmitTransactions;
|
|
36
|
+
private submitGrantOwnershipTransactions;
|
|
37
|
+
private ownershipGrantingRequired;
|
|
38
|
+
private ownershipRevokingRequired;
|
|
39
|
+
private resolveContractAddress;
|
|
40
|
+
private loadContractMetadataAndCreateTransactions;
|
|
41
|
+
private confirmData;
|
|
42
|
+
private processOptions;
|
|
43
|
+
private createRequiredTransactions;
|
|
44
|
+
private getColumnWidths;
|
|
45
|
+
private displayPatternGroup;
|
|
46
|
+
private displayFindings;
|
|
47
|
+
private handleUserRejection;
|
|
48
|
+
private groupMetadataByPattern;
|
|
49
|
+
private promptConfirmation;
|
|
50
|
+
}
|
|
51
|
+
export {};
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.InstanceAdmin = void 0;
|
|
7
|
+
// Cspell:words keccak
|
|
8
|
+
const contractAdmin_1 = require("./contractAdmin");
|
|
9
|
+
const submitters_1 = require("../submitters");
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
+
const hardhat_1 = require("hardhat");
|
|
13
|
+
const ZERO = 0;
|
|
14
|
+
class InstanceAdmin {
|
|
15
|
+
constructor(contractIds, options, instance) {
|
|
16
|
+
this.contractMetadata = new Map();
|
|
17
|
+
this.bytes32RolesToCheck = [];
|
|
18
|
+
this.managerRolesToCheck = [];
|
|
19
|
+
this.instance = instance;
|
|
20
|
+
this.contractIds = contractIds;
|
|
21
|
+
this.readonly = options.readonly;
|
|
22
|
+
this.newOwner = options.newOwner;
|
|
23
|
+
this.submitter = options.submitter;
|
|
24
|
+
this.oldOwner = options.oldOwner;
|
|
25
|
+
this.renounceRoles = options.renounceRoles;
|
|
26
|
+
this.testMode = options.testMode;
|
|
27
|
+
this.processOptions(options);
|
|
28
|
+
}
|
|
29
|
+
async executeOwnershipTransfer() {
|
|
30
|
+
// Confirm data found in initialization
|
|
31
|
+
await this.initialize();
|
|
32
|
+
if (this.readonly) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
await this.processGrantStepIfRequired();
|
|
36
|
+
await this.processRenounceStepIfRequired();
|
|
37
|
+
this.displayFindings();
|
|
38
|
+
if (this.ownershipGrantingRequired() || (this.ownershipRevokingRequired() && this.renounceRoles)) {
|
|
39
|
+
console.error(chalk_1.default.red("Unexpected state: There are still actions required."));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.log(chalk_1.default.green("Ownership transfer process completed. - Nothing more to do."));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async initialize() {
|
|
46
|
+
await this.loadContractMetadataAndCreateTransactions();
|
|
47
|
+
await this.confirmData();
|
|
48
|
+
}
|
|
49
|
+
async processGrantStepIfRequired() {
|
|
50
|
+
if (this.ownershipGrantingRequired()) {
|
|
51
|
+
await this.submitGrantOwnershipTransactions();
|
|
52
|
+
if (this.renounceRoles) {
|
|
53
|
+
await this.createRequiredTransactions();
|
|
54
|
+
}
|
|
55
|
+
await this.confirmData();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async processRenounceStepIfRequired() {
|
|
59
|
+
if (this.renounceRoles && this.ownershipRevokingRequired() === true) {
|
|
60
|
+
await this.submitRenounceRolesTransactions();
|
|
61
|
+
await this.createRequiredTransactions();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async submitRenounceRolesTransactions() {
|
|
65
|
+
const txsToSubmit = [];
|
|
66
|
+
for (const contract of this.contractMetadata.values()) {
|
|
67
|
+
txsToSubmit.push(...contract.getRenounceOwnershipTransactions());
|
|
68
|
+
contract.clearRenounceTransactions();
|
|
69
|
+
}
|
|
70
|
+
console.log(chalk_1.default.green(`Submitting ${txsToSubmit.length} renounce ownership transactions...`));
|
|
71
|
+
for (const [index, txData] of txsToSubmit.entries()) {
|
|
72
|
+
console.log(chalk_1.default.grey(` -> Transaction ${index}: ${txData.description || "No description"}`));
|
|
73
|
+
}
|
|
74
|
+
await this.confirmAndSubmitTransactions(txsToSubmit);
|
|
75
|
+
}
|
|
76
|
+
async confirmAndSubmitTransactions(txsToSubmit) {
|
|
77
|
+
const confirmation = await this.promptConfirmation("Do you want to proceed with submitting these transactions?");
|
|
78
|
+
if (!confirmation) {
|
|
79
|
+
throw new Error("Transaction submission aborted by user.");
|
|
80
|
+
}
|
|
81
|
+
await this.submitter.submit(txsToSubmit.map(tx => tx.transaction));
|
|
82
|
+
if (this.submitter instanceof submitters_1.SafeSubmitter) {
|
|
83
|
+
await this.promptConfirmation("Please proceed only AFTER the Safe transactions have been executed on-chain.\n" +
|
|
84
|
+
"Do you want to proceed?");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async submitGrantOwnershipTransactions() {
|
|
88
|
+
const txsToSubmit = [];
|
|
89
|
+
for (const contract of this.contractMetadata.values()) {
|
|
90
|
+
txsToSubmit.push(...contract.getGrantOwnershipTransactions());
|
|
91
|
+
contract.clearGrantTransactions();
|
|
92
|
+
}
|
|
93
|
+
// Required for ProxyAdmins shared among multiple contracts
|
|
94
|
+
const txsToSubmitFiltered = (0, utils_1.removeDuplicateTransactions)(txsToSubmit);
|
|
95
|
+
console.log(chalk_1.default.green(`Submitting ${txsToSubmitFiltered.length} unique grant ownership transactions...`));
|
|
96
|
+
for (const [index, txData] of txsToSubmitFiltered.entries()) {
|
|
97
|
+
console.log(chalk_1.default.grey(` -> Transaction ${index}: ${txData.description || "No description"}`));
|
|
98
|
+
}
|
|
99
|
+
await this.confirmAndSubmitTransactions(txsToSubmit);
|
|
100
|
+
}
|
|
101
|
+
ownershipGrantingRequired() {
|
|
102
|
+
return Array.from(this.contractMetadata.values()).some(contract => contract.requiresGrantingOwnership());
|
|
103
|
+
}
|
|
104
|
+
ownershipRevokingRequired() {
|
|
105
|
+
return Array.from(this.contractMetadata.values()).some(contract => contract.requiresRenouncingOwnership());
|
|
106
|
+
}
|
|
107
|
+
async resolveContractAddress(contractName) {
|
|
108
|
+
if (!this.instance) {
|
|
109
|
+
throw new Error(`Instance is not defined. Cannot resolve ${contractName} address.`);
|
|
110
|
+
}
|
|
111
|
+
return await this.instance.getContractAddress(contractName);
|
|
112
|
+
}
|
|
113
|
+
async loadContractMetadataAndCreateTransactions() {
|
|
114
|
+
/* eslint-disable no-await-in-loop */
|
|
115
|
+
// Do not parallelize to avoid rate limit issues which CAN produce wrong outputs - sensitive
|
|
116
|
+
for (const { name: contractName, address } of this.contractIds) {
|
|
117
|
+
const resolvedAddress = address || await this.resolveContractAddress(contractName);
|
|
118
|
+
if (!this.contractMetadata.has(resolvedAddress)) {
|
|
119
|
+
const details = {
|
|
120
|
+
address: resolvedAddress,
|
|
121
|
+
name: contractName,
|
|
122
|
+
};
|
|
123
|
+
const contractAdmin = new contractAdmin_1.ContractAdmin(details, this.oldOwner, this.newOwner);
|
|
124
|
+
await contractAdmin.scanPatternAndPermissionModels();
|
|
125
|
+
this.contractMetadata.set(resolvedAddress, contractAdmin);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/* eslint-enable no-await-in-loop */
|
|
129
|
+
await this.createRequiredTransactions();
|
|
130
|
+
}
|
|
131
|
+
async confirmData() {
|
|
132
|
+
this.displayFindings();
|
|
133
|
+
const userConfirmed = await this.promptConfirmation();
|
|
134
|
+
if (!userConfirmed) {
|
|
135
|
+
this.handleUserRejection();
|
|
136
|
+
}
|
|
137
|
+
console.log(chalk_1.default.green("\nUser confirmed. Proceeding...\n"));
|
|
138
|
+
}
|
|
139
|
+
processOptions(options) {
|
|
140
|
+
this.bytes32RolesToCheck = (options.rolesToCheck ?? []).map(role => ({
|
|
141
|
+
// Never will include "0x00..." as role - default admin handled separately
|
|
142
|
+
identifier: hardhat_1.ethers.id(role),
|
|
143
|
+
name: role
|
|
144
|
+
}));
|
|
145
|
+
this.bytes32RolesToCheck.push({ identifier: hardhat_1.ethers.ZeroHash, name: "DEFAULT_ADMIN_ROLE" });
|
|
146
|
+
if (!this.readonly && this.newOwner === hardhat_1.ethers.ZeroAddress) {
|
|
147
|
+
throw new Error("New owner address must be provided in options when in write mode.");
|
|
148
|
+
}
|
|
149
|
+
this.managerRolesToCheck = (options.managerRolesToCheck ?? []).map(role => {
|
|
150
|
+
if (typeof role !== "bigint" || role <= ZERO) {
|
|
151
|
+
throw new Error(`Invalid manager role: ${role}. Must be a non-zero bigint.`);
|
|
152
|
+
}
|
|
153
|
+
return { identifier: role, name: `Role ${role}` };
|
|
154
|
+
});
|
|
155
|
+
this.managerRolesToCheck.push({ identifier: BigInt(ZERO), name: "ADMIN_ROLE" });
|
|
156
|
+
}
|
|
157
|
+
async createRequiredTransactions() {
|
|
158
|
+
console.log(chalk_1.default.grey("INFO: The next Following steps will NOT submit any transactions to the blockchain."));
|
|
159
|
+
// Preferred to create sequentially due to rate limits of RPC providers - sensitive
|
|
160
|
+
/* eslint-disable no-await-in-loop */
|
|
161
|
+
for (const contract of this.contractMetadata.values()) {
|
|
162
|
+
await contract.createGrantOwnershipTransactions(this.bytes32RolesToCheck, this.managerRolesToCheck);
|
|
163
|
+
if (!contract.requiresGrantingOwnership()) {
|
|
164
|
+
await contract.createRenounceOwnershipTransactions(this.bytes32RolesToCheck, this.managerRolesToCheck);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/* eslint-enable no-await-in-loop */
|
|
168
|
+
}
|
|
169
|
+
getColumnWidths() {
|
|
170
|
+
let maxNameWidth = 0;
|
|
171
|
+
let maxAddressWidth = 0;
|
|
172
|
+
let maxPermissionsWidth = 0;
|
|
173
|
+
for (const contract of this.contractMetadata.values()) {
|
|
174
|
+
maxNameWidth = Math.max(maxNameWidth, contract.contractName.length);
|
|
175
|
+
maxAddressWidth = Math.max(maxAddressWidth, contract.address.length);
|
|
176
|
+
const permissions = contract.permissionModel?.join(", ") || "None";
|
|
177
|
+
maxPermissionsWidth = Math.max(maxPermissionsWidth, permissions.length);
|
|
178
|
+
}
|
|
179
|
+
return { maxAddressWidth, maxNameWidth, maxPermissionsWidth };
|
|
180
|
+
}
|
|
181
|
+
displayPatternGroup(pattern, contracts) {
|
|
182
|
+
const columnWidths = this.getColumnWidths();
|
|
183
|
+
console.log(chalk_1.default.bold(`\n${pattern} Pattern (${contracts.length} contracts):`));
|
|
184
|
+
for (const contract of contracts) {
|
|
185
|
+
contract.displayData(columnWidths);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
displayFindings() {
|
|
189
|
+
console.log(chalk_1.default.cyan("\n=== Ownership Status Results ===\n"));
|
|
190
|
+
const groupedByPattern = this.groupMetadataByPattern();
|
|
191
|
+
for (const [pattern, contracts] of Object.entries(groupedByPattern)) {
|
|
192
|
+
if (contracts.length) {
|
|
193
|
+
this.displayPatternGroup(pattern, contracts);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
console.log(chalk_1.default.cyan("\n==========================================\n"));
|
|
197
|
+
}
|
|
198
|
+
handleUserRejection() {
|
|
199
|
+
console.log(chalk_1.default.red("User did not confirm. Aborting and clearing all data..."));
|
|
200
|
+
this.contractMetadata.clear();
|
|
201
|
+
throw new Error("User aborted because some data was inaccurate. Data has been cleared.");
|
|
202
|
+
}
|
|
203
|
+
groupMetadataByPattern() {
|
|
204
|
+
const grouped = Object.values(utils_1.Pattern).
|
|
205
|
+
reduce((acc, pattern) => {
|
|
206
|
+
acc[pattern] = [];
|
|
207
|
+
return acc;
|
|
208
|
+
}, {});
|
|
209
|
+
for (const metadata of this.contractMetadata.values()) {
|
|
210
|
+
// Used only after scan - will be defined if it reaches here
|
|
211
|
+
grouped[metadata.pattern].push(metadata);
|
|
212
|
+
}
|
|
213
|
+
return grouped;
|
|
214
|
+
}
|
|
215
|
+
async promptConfirmation(msg) {
|
|
216
|
+
if (this.testMode) {
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
return await (0, utils_1.promptUserConfirmation)(msg);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
exports.InstanceAdmin = InstanceAdmin;
|
|
223
|
+
//# sourceMappingURL=instanceAdmin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instanceAdmin.js","sourceRoot":"","sources":["../../../src/ownership-transfer/instanceAdmin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AddressLike, Transaction } from "ethers";
|
|
2
|
+
export declare enum PermissionModel {
|
|
3
|
+
OWNABLE = "OWNABLE",
|
|
4
|
+
ROLE_BASED = "ROLE_BASED",
|
|
5
|
+
ACCESS_MANAGED = "ACCESS_MANAGED",
|
|
6
|
+
ACCESS_MANAGER = "ACCESS_MANAGER"
|
|
7
|
+
}
|
|
8
|
+
export declare const isOwnable: (contractAddress: AddressLike) => Promise<boolean>;
|
|
9
|
+
export declare const isAccessControl: (contractAddress: AddressLike) => Promise<boolean>;
|
|
10
|
+
export declare const isAccessManager: (contractAddress: AddressLike) => Promise<boolean>;
|
|
11
|
+
export declare const isAccessManaged: (contractAddress: AddressLike) => Promise<boolean>;
|
|
12
|
+
export declare const transferOwnership: (contractAddress: string, newOwner: string, oldOwner: string) => Promise<Transaction | false>;
|
|
13
|
+
export declare const grantRole: (input: {
|
|
14
|
+
contractAddress: string;
|
|
15
|
+
role: string;
|
|
16
|
+
newAccount: AddressLike;
|
|
17
|
+
oldAccount: AddressLike;
|
|
18
|
+
}) => Promise<Transaction | false>;
|
|
19
|
+
export declare const renounceRole: (contractAddress: string, role: string, oldAccount: AddressLike) => Promise<Transaction | boolean>;
|
|
20
|
+
export declare const getPermissionModels: (address: AddressLike) => Promise<PermissionModel[]>;
|
|
21
|
+
export declare const grantAccessManagerRole: (input: {
|
|
22
|
+
contractAddress: string;
|
|
23
|
+
role: bigint;
|
|
24
|
+
newAccount: AddressLike;
|
|
25
|
+
oldAccount: AddressLike;
|
|
26
|
+
}) => Promise<Transaction | false>;
|
|
27
|
+
export declare const renounceAccessManagerRole: (input: {
|
|
28
|
+
contractAddress: string;
|
|
29
|
+
role: bigint;
|
|
30
|
+
newAccount: AddressLike;
|
|
31
|
+
oldAccount: AddressLike;
|
|
32
|
+
}) => Promise<Transaction | boolean>;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renounceAccessManagerRole = exports.grantAccessManagerRole = exports.getPermissionModels = exports.renounceRole = exports.grantRole = exports.transferOwnership = exports.isAccessManaged = exports.isAccessManager = exports.isAccessControl = exports.isOwnable = exports.PermissionModel = void 0;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
const ethers_1 = require("ethers");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
const hardhat_1 = require("hardhat");
|
|
8
|
+
var PermissionModel;
|
|
9
|
+
(function (PermissionModel) {
|
|
10
|
+
// Does not fully complete the process of Ownable2Step
|
|
11
|
+
PermissionModel["OWNABLE"] = "OWNABLE";
|
|
12
|
+
PermissionModel["ROLE_BASED"] = "ROLE_BASED";
|
|
13
|
+
PermissionModel["ACCESS_MANAGED"] = "ACCESS_MANAGED";
|
|
14
|
+
PermissionModel["ACCESS_MANAGER"] = "ACCESS_MANAGER";
|
|
15
|
+
})(PermissionModel || (exports.PermissionModel = PermissionModel = {}));
|
|
16
|
+
const ZERO = 0;
|
|
17
|
+
const MIN_ROLE_HOLDERS = 2n;
|
|
18
|
+
const verifyOwnableInterface = async (contract, contractAddress) => {
|
|
19
|
+
const owner = await contract.owner();
|
|
20
|
+
return owner !== hardhat_1.ethers.ZeroAddress &&
|
|
21
|
+
await (0, utils_1.hasFunctionSelector)(contractAddress, "transferOwnership(address)");
|
|
22
|
+
};
|
|
23
|
+
const isOwnable = async (contractAddress) => {
|
|
24
|
+
try {
|
|
25
|
+
const resolvedAddress = await hardhat_1.ethers.resolveAddress(contractAddress);
|
|
26
|
+
if (!await (0, utils_1.isContractAddress)(resolvedAddress)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
const contract = new ethers_1.Contract(resolvedAddress, constants_1.OWNABLE_ABI, hardhat_1.ethers.provider);
|
|
30
|
+
return await verifyOwnableInterface(contract, resolvedAddress);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
exports.isOwnable = isOwnable;
|
|
37
|
+
const verifyAccessControlInterface = async (contract, contractAddress) => {
|
|
38
|
+
await contract.hasRole(hardhat_1.ethers.ZeroHash, hardhat_1.ethers.ZeroAddress);
|
|
39
|
+
return await (0, utils_1.hasFunctionSelector)(contractAddress, "grantRole(bytes32,address)") &&
|
|
40
|
+
await (0, utils_1.hasFunctionSelector)(contractAddress, "renounceRole(bytes32,address)");
|
|
41
|
+
};
|
|
42
|
+
const isAccessControl = async (contractAddress) => {
|
|
43
|
+
try {
|
|
44
|
+
const resolvedAddress = await hardhat_1.ethers.resolveAddress(contractAddress);
|
|
45
|
+
if (!await (0, utils_1.isContractAddress)(resolvedAddress)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const contract = new ethers_1.Contract(resolvedAddress, constants_1.ACCESS_CONTROL_ABI, hardhat_1.ethers.provider);
|
|
49
|
+
return await verifyAccessControlInterface(contract, resolvedAddress);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
exports.isAccessControl = isAccessControl;
|
|
56
|
+
const verifyAccessManagerInterface = async (contract, contractAddress) => {
|
|
57
|
+
const zeroRole = 0n;
|
|
58
|
+
await contract.hasRole(zeroRole, hardhat_1.ethers.ZeroAddress);
|
|
59
|
+
return await (0, utils_1.hasFunctionSelector)(contractAddress, "grantRole(uint64,address,uint32)") &&
|
|
60
|
+
await (0, utils_1.hasFunctionSelector)(contractAddress, "renounceRole(uint64,address)");
|
|
61
|
+
};
|
|
62
|
+
const isAccessManager = async (contractAddress) => {
|
|
63
|
+
try {
|
|
64
|
+
const resolvedAddress = await hardhat_1.ethers.resolveAddress(contractAddress);
|
|
65
|
+
if (!await (0, utils_1.isContractAddress)(resolvedAddress)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
const contract = new ethers_1.Contract(resolvedAddress, constants_1.ACCESS_MANAGER_ABI, hardhat_1.ethers.provider);
|
|
69
|
+
return await verifyAccessManagerInterface(contract, resolvedAddress);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
exports.isAccessManager = isAccessManager;
|
|
76
|
+
const isAccessManaged = async (contractAddress) => {
|
|
77
|
+
try {
|
|
78
|
+
const resolvedAddress = await hardhat_1.ethers.resolveAddress(contractAddress);
|
|
79
|
+
if (!await (0, utils_1.isContractAddress)(resolvedAddress)) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
const contract = new ethers_1.Contract(resolvedAddress, constants_1.ACCESS_MANAGED_ABI, hardhat_1.ethers.provider);
|
|
83
|
+
const authorityAddress = await contract.authority();
|
|
84
|
+
return await (0, exports.isAccessManager)(authorityAddress);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
exports.isAccessManaged = isAccessManaged;
|
|
91
|
+
const transferOwnership = async (contractAddress, newOwner, oldOwner) => {
|
|
92
|
+
const contract = new ethers_1.Contract(contractAddress, constants_1.OWNABLE_ABI, hardhat_1.ethers.provider);
|
|
93
|
+
if (await contract.owner() === newOwner) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
if (await contract.owner() !== oldOwner) {
|
|
97
|
+
throw new Error(`Current owner of contract ${contractAddress} does not match the provided old owner address.`);
|
|
98
|
+
}
|
|
99
|
+
const data = contract.interface.encodeFunctionData("transferOwnership", [newOwner]);
|
|
100
|
+
const transaction = new ethers_1.Transaction();
|
|
101
|
+
transaction.to = contractAddress;
|
|
102
|
+
transaction.data = data;
|
|
103
|
+
return transaction;
|
|
104
|
+
};
|
|
105
|
+
exports.transferOwnership = transferOwnership;
|
|
106
|
+
const grantRole = async (input) => {
|
|
107
|
+
const contract = new ethers_1.Contract(input.contractAddress, constants_1.ACCESS_CONTROL_ABI, hardhat_1.ethers.provider);
|
|
108
|
+
// If new account already has role or old account never had it in the first place - no action
|
|
109
|
+
if (await contract.hasRole(input.role, input.newAccount) || !await contract.hasRole(input.role, input.oldAccount)) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
if (!await contract.hasRole(hardhat_1.ethers.ZeroHash, input.oldAccount)) {
|
|
113
|
+
// Currently we do not support roleAdmins - must be ran by owner
|
|
114
|
+
throw new Error(`Account ${input.oldAccount} does not have permission to grant roles on contract ${input.contractAddress}.`);
|
|
115
|
+
}
|
|
116
|
+
const data = contract.interface.encodeFunctionData("grantRole", [input.role, input.newAccount]);
|
|
117
|
+
const transaction = new ethers_1.Transaction();
|
|
118
|
+
transaction.to = input.contractAddress;
|
|
119
|
+
transaction.data = data;
|
|
120
|
+
return transaction;
|
|
121
|
+
};
|
|
122
|
+
exports.grantRole = grantRole;
|
|
123
|
+
const renounceRole = async (contractAddress, role, oldAccount) => {
|
|
124
|
+
const contract = new ethers_1.Contract(contractAddress, constants_1.ACCESS_CONTROL_ABI, hardhat_1.ethers.provider);
|
|
125
|
+
if (!await contract.hasRole(role, oldAccount)) {
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
// Prevent revoking last role holder of default admin role
|
|
129
|
+
if (role === hardhat_1.ethers.ZeroHash && (await contract.getRoleMemberCount(role)) < MIN_ROLE_HOLDERS) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
const data = contract.interface.encodeFunctionData("renounceRole", [role, oldAccount]);
|
|
133
|
+
const transaction = new ethers_1.Transaction();
|
|
134
|
+
transaction.to = contractAddress;
|
|
135
|
+
transaction.data = data;
|
|
136
|
+
return transaction;
|
|
137
|
+
};
|
|
138
|
+
exports.renounceRole = renounceRole;
|
|
139
|
+
const getPermissionModels = async (address) => {
|
|
140
|
+
const checks = [
|
|
141
|
+
{ check: exports.isOwnable, model: PermissionModel.OWNABLE },
|
|
142
|
+
{ check: exports.isAccessControl, model: PermissionModel.ROLE_BASED },
|
|
143
|
+
{ check: exports.isAccessManager, model: PermissionModel.ACCESS_MANAGER },
|
|
144
|
+
{ check: exports.isAccessManaged, model: PermissionModel.ACCESS_MANAGED }
|
|
145
|
+
];
|
|
146
|
+
const models = [];
|
|
147
|
+
// Change to await in loop if rate-limiting becomes an issue
|
|
148
|
+
await Promise.all(checks.map(async ({ check, model }) => {
|
|
149
|
+
if (await check(address)) {
|
|
150
|
+
models.push(model);
|
|
151
|
+
}
|
|
152
|
+
}));
|
|
153
|
+
if (models.includes(PermissionModel.ACCESS_MANAGER) && models.includes(PermissionModel.ROLE_BASED)) {
|
|
154
|
+
throw new Error(`Address ${address} cannot be both ACCESS_MANAGER and ROLE_BASED permission models.`);
|
|
155
|
+
}
|
|
156
|
+
return models;
|
|
157
|
+
};
|
|
158
|
+
exports.getPermissionModels = getPermissionModels;
|
|
159
|
+
const grantAccessManagerRole = async (input) => {
|
|
160
|
+
const contract = new ethers_1.Contract(input.contractAddress, constants_1.ACCESS_MANAGER_ABI, hardhat_1.ethers.provider);
|
|
161
|
+
// If new account already has role or old account never had it in the first place - no action
|
|
162
|
+
if (await contract.hasRole(input.role, input.newAccount) || !await contract.hasRole(input.role, input.oldAccount)) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
if (!await contract.hasRole(ZERO, input.oldAccount)) {
|
|
166
|
+
// Currently we do not support roleAdmins - must be ran by owner
|
|
167
|
+
throw new Error(`Account ${input.oldAccount} does not have permission to grant roles on contract ${input.contractAddress}.`);
|
|
168
|
+
}
|
|
169
|
+
const data = contract.interface.encodeFunctionData("grantRole", [input.role, input.newAccount, ZERO]);
|
|
170
|
+
const transaction = new ethers_1.Transaction();
|
|
171
|
+
transaction.to = input.contractAddress;
|
|
172
|
+
transaction.data = data;
|
|
173
|
+
return transaction;
|
|
174
|
+
};
|
|
175
|
+
exports.grantAccessManagerRole = grantAccessManagerRole;
|
|
176
|
+
const renounceAccessManagerRole = async (input) => {
|
|
177
|
+
const contract = new ethers_1.Contract(input.contractAddress, constants_1.ACCESS_MANAGER_ABI, hardhat_1.ethers.provider);
|
|
178
|
+
if (!await contract.hasRole(input.role, input.oldAccount)) {
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
// Ensure role was granted to newAccount before renouncing
|
|
182
|
+
if (input.role === BigInt(ZERO) && !(await contract.hasRole(input.role, input.newAccount))) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
const data = contract.interface.encodeFunctionData("renounceRole", [input.role, input.oldAccount]);
|
|
186
|
+
const transaction = new ethers_1.Transaction();
|
|
187
|
+
transaction.to = input.contractAddress;
|
|
188
|
+
transaction.data = data;
|
|
189
|
+
return transaction;
|
|
190
|
+
};
|
|
191
|
+
exports.renounceAccessManagerRole = renounceAccessManagerRole;
|
|
192
|
+
//# sourceMappingURL=permission-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/permission-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AddressLike } from "ethers";
|
|
2
|
+
import { TransactionData } from "./contractAdmin";
|
|
3
|
+
export declare enum Pattern {
|
|
4
|
+
TUPP = "TUPP",
|
|
5
|
+
BEACON = "BEACON",
|
|
6
|
+
REGULAR = "REGULAR"
|
|
7
|
+
}
|
|
8
|
+
export declare const isContractAddress: (address: string) => Promise<boolean>;
|
|
9
|
+
export declare const extractAddressFromSlot: (slotValue: string) => string;
|
|
10
|
+
export declare const getAdminAddress: (address: string) => Promise<string>;
|
|
11
|
+
export declare const getTUPPImplementationAddress: (address: string) => Promise<string>;
|
|
12
|
+
export declare const isTUPPPattern: (address: string) => Promise<boolean>;
|
|
13
|
+
export declare const hasFunctionSelector: (address: string, signature: string) => Promise<boolean>;
|
|
14
|
+
export declare const isMultisig: (contractAddress: AddressLike) => Promise<boolean>;
|
|
15
|
+
export declare const isBeaconPattern: (address: string) => Promise<boolean>;
|
|
16
|
+
export declare const identifyProxyPattern: (address: string) => Promise<Pattern>;
|
|
17
|
+
export declare const promptUserConfirmation: (message?: string) => Promise<boolean>;
|
|
18
|
+
export declare const detectPattern: (address: AddressLike) => Promise<Pattern>;
|
|
19
|
+
export declare const removeDuplicateTransactions: (items: TransactionData[]) => TransactionData[];
|