@skalenetwork/upgrade-tools 4.0.0-ownership-helpers.0 → 4.0.0-ownership-helpers.2
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/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/ownership-transfer/ownershipAdmin.d.ts +23 -2
- package/dist/src/ownership-transfer/ownershipAdmin.js +184 -6
- package/dist/src/ownership-transfer/ownershipAdmin.js.map +1 -1
- package/dist/src/ownership-transfer/permission-utils.d.ts +10 -6
- package/dist/src/ownership-transfer/permission-utils.js +117 -6
- package/dist/src/ownership-transfer/permission-utils.js.map +1 -1
- package/dist/src/ownership-transfer/utils.d.ts +1 -1
- package/dist/src/ownership-transfer/utils.js +3 -2
- package/dist/src/ownership-transfer/utils.js.map +1 -1
- package/package.json +1 -1
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.js
CHANGED
|
@@ -24,4 +24,5 @@ __exportStar(require("./version"), exports);
|
|
|
24
24
|
__exportStar(require("./upgrader"), exports);
|
|
25
25
|
__exportStar(require("./upgraders/abstractTransparentProxyUpgrader"), exports);
|
|
26
26
|
__exportStar(require("./upgraders/beaconUpgrader"), exports);
|
|
27
|
+
__exportStar(require("./ownership-transfer/ownershipAdmin"), exports);
|
|
27
28
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,2CAAyB;AACzB,gDAA8B;AAC9B,kDAAgC;AAChC,+CAA6B;AAC7B,iDAA+B;AAC/B,4CAA0B;AAC1B,6CAA2B;AAC3B,+EAA6D;AAC7D,6DAA0C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,2CAAyB;AACzB,gDAA8B;AAC9B,kDAAgC;AAChC,+CAA6B;AAC7B,iDAA+B;AAC/B,4CAA0B;AAC1B,6CAA2B;AAC3B,+EAA6D;AAC7D,6DAA0C;AAC1C,sEAAoD"}
|
|
@@ -1,14 +1,35 @@
|
|
|
1
1
|
import { Instance } from "@skalenetwork/skale-contracts-ethers-v6";
|
|
2
|
+
interface OwnershipAdminOptions {
|
|
3
|
+
newOwner?: string;
|
|
4
|
+
readonly?: boolean;
|
|
5
|
+
rolesToCheck?: string[];
|
|
6
|
+
managerRolesToCheck?: number[];
|
|
7
|
+
}
|
|
2
8
|
export declare class OwnershipAdmin {
|
|
3
9
|
private instance;
|
|
4
10
|
private contractMetadata;
|
|
5
11
|
private contractNames;
|
|
6
12
|
private isMetadataLoaded;
|
|
13
|
+
private transactionsByContractName;
|
|
14
|
+
private transactions;
|
|
15
|
+
private bytes32RolesToCheck;
|
|
16
|
+
private managerRolesToCheck;
|
|
17
|
+
private newOwner;
|
|
18
|
+
private newOwnerConfirmed;
|
|
7
19
|
private readonly;
|
|
8
|
-
constructor(instance: Instance, contractNames: string[],
|
|
20
|
+
constructor(instance: Instance, contractNames: string[], options?: OwnershipAdminOptions);
|
|
9
21
|
loadContractMetadata(confirmFindings?: boolean): Promise<void>;
|
|
22
|
+
createNecessaryTransactions(): Promise<void>;
|
|
10
23
|
private confirmMetadata;
|
|
11
|
-
private
|
|
24
|
+
private displayMetadataFindings;
|
|
12
25
|
private handleUserRejection;
|
|
13
26
|
private groupMetadataByPattern;
|
|
27
|
+
private createTUPPOwnershipTransaction;
|
|
28
|
+
private createOwnableOwnershipTransaction;
|
|
29
|
+
private createAssignRolesTransactions;
|
|
30
|
+
private createTxsToChangeContractOwnership;
|
|
31
|
+
private promptConfirmNewOwner;
|
|
32
|
+
private promptConfirmTransactions;
|
|
33
|
+
private isDuplicateTransaction;
|
|
14
34
|
}
|
|
35
|
+
export {};
|
|
@@ -4,19 +4,49 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.OwnershipAdmin = void 0;
|
|
7
|
+
/* eslint-disable max-lines */
|
|
8
|
+
// Cspell:words TUPP keccak
|
|
7
9
|
const utils_1 = require("./utils");
|
|
8
10
|
const permission_utils_1 = require("./permission-utils");
|
|
11
|
+
const ethers_1 = require("ethers");
|
|
9
12
|
const chalk_1 = __importDefault(require("chalk"));
|
|
13
|
+
const ZERO = 0;
|
|
10
14
|
class OwnershipAdmin {
|
|
11
|
-
|
|
15
|
+
// eslint-disable-next-line max-statements
|
|
16
|
+
constructor(instance, contractNames, options = {}) {
|
|
17
|
+
this.transactions = [];
|
|
18
|
+
this.bytes32RolesToCheck = [];
|
|
19
|
+
this.managerRolesToCheck = [];
|
|
20
|
+
this.newOwnerConfirmed = false;
|
|
12
21
|
this.instance = instance;
|
|
13
22
|
this.contractMetadata = new Map();
|
|
14
23
|
this.isMetadataLoaded = false;
|
|
24
|
+
this.transactionsByContractName = new Map();
|
|
15
25
|
// If true, does not allow to send transactions to blockchain
|
|
16
|
-
this.readonly = readonly;
|
|
26
|
+
this.readonly = options.readonly ?? true;
|
|
27
|
+
this.newOwner = options.newOwner ?? "MOCK_NEW_OWNER_ADDRESS";
|
|
28
|
+
this.bytes32RolesToCheck = (options.rolesToCheck ?? []).map(role =>
|
|
29
|
+
// Convert to keccak256 hash
|
|
30
|
+
ethers_1.ethers.id(role));
|
|
31
|
+
// Always check DEFAULT_ADMIN_ROLE at the end!
|
|
32
|
+
this.bytes32RolesToCheck.push(ethers_1.ethers.ZeroHash);
|
|
33
|
+
this.managerRolesToCheck = options.managerRolesToCheck ?? [];
|
|
34
|
+
this.managerRolesToCheck.forEach(role => {
|
|
35
|
+
if (typeof role !== "number" || !Number.isInteger(role) || role < ZERO) {
|
|
36
|
+
throw new Error(`Invalid manager role: ${role}. Must be a non-negative integer.`);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
this.managerRolesToCheck.push(ZERO);
|
|
40
|
+
if (!this.readonly && this.newOwner === "MOCK_NEW_OWNER_ADDRESS") {
|
|
41
|
+
throw new Error("New owner address must be provided in options when in write mode.");
|
|
42
|
+
}
|
|
17
43
|
this.contractNames = contractNames;
|
|
18
44
|
}
|
|
19
45
|
async loadContractMetadata(confirmFindings = true) {
|
|
46
|
+
if (this.isMetadataLoaded) {
|
|
47
|
+
console.log(chalk_1.default.yellow("Contract metadata is already loaded. Skipping reload."));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
20
50
|
await Promise.all(this.contractNames.map(async (contractName) => {
|
|
21
51
|
// Already checks the contractName is in the instance
|
|
22
52
|
const address = await this.instance.getContractAddress(contractName);
|
|
@@ -39,15 +69,28 @@ class OwnershipAdmin {
|
|
|
39
69
|
await this.confirmMetadata();
|
|
40
70
|
}
|
|
41
71
|
}
|
|
72
|
+
async createNecessaryTransactions() {
|
|
73
|
+
// Clear previous transactions
|
|
74
|
+
console.log(chalk_1.default.grey("INFO: The next Following steps will NOT submit any transactions to the blockchain."));
|
|
75
|
+
if (!this.readonly) {
|
|
76
|
+
await this.promptConfirmNewOwner();
|
|
77
|
+
}
|
|
78
|
+
for (const contract of this.contractMetadata.values()) {
|
|
79
|
+
// eslint-disable-next-line no-await-in-loop
|
|
80
|
+
const txs = await this.createTxsToChangeContractOwnership(contract);
|
|
81
|
+
this.transactionsByContractName.set(contract.name, txs);
|
|
82
|
+
txs.forEach(txData => this.transactions.push(txData.transaction));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
42
85
|
async confirmMetadata() {
|
|
43
|
-
this.
|
|
86
|
+
this.displayMetadataFindings();
|
|
44
87
|
const userConfirmed = await (0, utils_1.promptUserConfirmation)();
|
|
45
88
|
if (!userConfirmed) {
|
|
46
89
|
this.handleUserRejection();
|
|
47
90
|
}
|
|
48
91
|
console.log(chalk_1.default.green("\nUser confirmed. Proceeding...\n"));
|
|
49
92
|
}
|
|
50
|
-
|
|
93
|
+
displayMetadataFindings() {
|
|
51
94
|
console.log(chalk_1.default.cyan("\n=== Contract Pattern Detection Results ===\n"));
|
|
52
95
|
const groupedByPattern = this.groupMetadataByPattern();
|
|
53
96
|
for (const [pattern, contracts] of Object.entries(groupedByPattern)) {
|
|
@@ -62,10 +105,11 @@ class OwnershipAdmin {
|
|
|
62
105
|
console.log(chalk_1.default.cyan("\n==========================================\n"));
|
|
63
106
|
}
|
|
64
107
|
handleUserRejection() {
|
|
65
|
-
console.log(chalk_1.default.
|
|
108
|
+
console.log(chalk_1.default.red("User did not confirm. Aborting and clearing all data..."));
|
|
66
109
|
this.contractMetadata.clear();
|
|
110
|
+
this.transactions.length = 0;
|
|
67
111
|
this.isMetadataLoaded = false;
|
|
68
|
-
throw new Error("User aborted the operation.
|
|
112
|
+
throw new Error("User aborted the operation. Data has been cleared.");
|
|
69
113
|
}
|
|
70
114
|
groupMetadataByPattern() {
|
|
71
115
|
const grouped = Object.values(utils_1.Pattern).
|
|
@@ -78,6 +122,140 @@ class OwnershipAdmin {
|
|
|
78
122
|
}
|
|
79
123
|
return grouped;
|
|
80
124
|
}
|
|
125
|
+
async createTUPPOwnershipTransaction(contractData) {
|
|
126
|
+
const admin = await (0, utils_1.getAdminAddress)(contractData.address);
|
|
127
|
+
const tx = await (0, permission_utils_1.transferOwnership)(admin, this.newOwner);
|
|
128
|
+
if (typeof tx === "boolean" && tx) {
|
|
129
|
+
console.log(chalk_1.default.gray(` -> Owner of ProxyAdmin of ${contractData.address} is already ${this.newOwner}.`));
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
else if (this.isDuplicateTransaction(tx)) {
|
|
133
|
+
console.log(chalk_1.default.gray(` -> Transaction to change Owner of Proxy Admin of ${contractData.name} was already prepared.`));
|
|
134
|
+
console.log(chalk_1.default.gray(` NOTE: It's likely ${contractData.name} shares the same Proxy Admin of another contract.`));
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
console.log(chalk_1.default.yellow(` -> Tx to change Proxy Admin at ${admin} of ${contractData.name} created.`));
|
|
138
|
+
return {
|
|
139
|
+
description: `-> Tx to change Proxy Admin at ${admin} to ${this.newOwner}`,
|
|
140
|
+
transaction: tx
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async createOwnableOwnershipTransaction(contractData) {
|
|
144
|
+
const tx = await (0, permission_utils_1.transferOwnership)(contractData.address, this.newOwner);
|
|
145
|
+
if (typeof tx === "boolean" && tx) {
|
|
146
|
+
console.log(chalk_1.default.gray(` -> Owner of ${contractData.name} at ${contractData.address} is already ${this.newOwner}.`));
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
else if (this.isDuplicateTransaction(tx)) {
|
|
150
|
+
throw new Error(`Error: Transaction to change Owner of ${contractData.name} was already created.`);
|
|
151
|
+
}
|
|
152
|
+
console.log(chalk_1.default.yellow(` -> Tx to change Owner of ${contractData.name} at ${contractData.address} created.`));
|
|
153
|
+
return {
|
|
154
|
+
description: `-> Tx to change Owner of ${contractData.name} at ${contractData.address} to ${this.newOwner} created`,
|
|
155
|
+
transaction: tx
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
async createAssignRolesTransactions(contractData) {
|
|
159
|
+
const txs = [];
|
|
160
|
+
for (const role of this.bytes32RolesToCheck) {
|
|
161
|
+
// eslint-disable-next-line no-await-in-loop
|
|
162
|
+
const tx = await (0, permission_utils_1.grantRole)(contractData.address, role, this.newOwner);
|
|
163
|
+
if (typeof tx === "boolean" && tx) {
|
|
164
|
+
console.log(chalk_1.default.gray(` -> Role ${role} already granted to ${this.newOwner} in ${contractData.name}.`));
|
|
165
|
+
}
|
|
166
|
+
else if (this.isDuplicateTransaction(tx)) {
|
|
167
|
+
throw new Error(`Error: Transaction to grant role ${role} in ${contractData.name} was already created.`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
console.log(chalk_1.default.yellow(` -> Tx to grant role ${role} to ${this.newOwner} in ${contractData.name} created.`));
|
|
171
|
+
txs.push({
|
|
172
|
+
description: `-> Tx to grant role ${role} to ${this.newOwner} in ${contractData.name}`,
|
|
173
|
+
transaction: tx
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return txs;
|
|
178
|
+
}
|
|
179
|
+
// TODO: Remove this
|
|
180
|
+
// eslint-disable-next-line max-statements
|
|
181
|
+
async createTxsToChangeContractOwnership(contractData) {
|
|
182
|
+
console.log(chalk_1.default.white(`* Creating Transactions to change Ownership of ${contractData.name}.`));
|
|
183
|
+
const txs = [];
|
|
184
|
+
if (contractData.pattern === utils_1.Pattern.TUPP) {
|
|
185
|
+
const tx = await this.createTUPPOwnershipTransaction(contractData);
|
|
186
|
+
if (tx !== true) {
|
|
187
|
+
txs.push(tx);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (contractData.permissionModel?.includes(permission_utils_1.PermissionModel.OWNABLE)) {
|
|
191
|
+
const tx = await this.createOwnableOwnershipTransaction(contractData);
|
|
192
|
+
if (tx !== true) {
|
|
193
|
+
txs.push(tx);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (contractData.permissionModel?.includes(permission_utils_1.PermissionModel.ROLE_BASED)) {
|
|
197
|
+
const txList = await this.createAssignRolesTransactions(contractData);
|
|
198
|
+
if (txList.length) {
|
|
199
|
+
txList.forEach(tx => txs.push(tx));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (contractData.permissionModel?.includes(permission_utils_1.PermissionModel.ACCESS_MANAGER)) {
|
|
203
|
+
console.log(chalk_1.default.yellow("Not implemented yet: Access Manager role assignments."));
|
|
204
|
+
}
|
|
205
|
+
return txs;
|
|
206
|
+
}
|
|
207
|
+
// eslint-disable-next-line max-statements
|
|
208
|
+
async promptConfirmNewOwner() {
|
|
209
|
+
if (this.newOwnerConfirmed) {
|
|
210
|
+
console.log(chalk_1.default.white("INFO: New owner already confirmed. Skipping confirmation."));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const message1 = `You have specified the new owner address as ${this.newOwner}.`;
|
|
214
|
+
let message2 = "";
|
|
215
|
+
let message3 = "";
|
|
216
|
+
const isContract = await (0, utils_1.isContractAddress)(this.newOwner);
|
|
217
|
+
if (isContract) {
|
|
218
|
+
message2 = chalk_1.default.green(`INFO: It appears to be a contract address.`);
|
|
219
|
+
const { owners, threshold } = await (0, permission_utils_1.tryGetMultiSigInfo)(this.newOwner);
|
|
220
|
+
if (owners) {
|
|
221
|
+
const ownersList = owners.join(", ");
|
|
222
|
+
message3 = chalk_1.default.green(`INFO: Found owners of new Owner Multi-Sig: ${ownersList}`);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
message3 = chalk_1.default.red(`WARNING: The script was unable to collect owners details.`);
|
|
226
|
+
}
|
|
227
|
+
if (threshold) {
|
|
228
|
+
message3 += chalk_1.default.green(`INFO: Multi-Sig threshold is set to ${threshold}.`);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
message3 += chalk_1.default.red(`WARNING: The script was unable to determine the Multi-Sig threshold.`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const message = `${message1}\n${message2 || ""}\n${message3 || ""}\nDo you confirm this is correct?`;
|
|
235
|
+
const userConfirmed = await (0, utils_1.promptUserConfirmation)(message);
|
|
236
|
+
if (!userConfirmed) {
|
|
237
|
+
throw new Error("User did not confirm the new owner address. Aborting...");
|
|
238
|
+
}
|
|
239
|
+
this.newOwnerConfirmed = true;
|
|
240
|
+
}
|
|
241
|
+
// TODO: Remove disable
|
|
242
|
+
// eslint-disable-next-line class-methods-use-this
|
|
243
|
+
async promptConfirmTransactions(transactions) {
|
|
244
|
+
if (!transactions.length) {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
console.log(chalk_1.default.white("\n=== Prepared Following Ownership Transfer Transactions ===\n"));
|
|
248
|
+
transactions.forEach((txData, index) => {
|
|
249
|
+
console.log(chalk_1.default.gray(` - Transaction ${index}: ${txData.description || "No description"}`));
|
|
250
|
+
});
|
|
251
|
+
const msg = "Do you confirm these transactions? They will NOT be sent to the blockchain yet.";
|
|
252
|
+
const userConfirmed = await (0, utils_1.promptUserConfirmation)(msg);
|
|
253
|
+
return userConfirmed;
|
|
254
|
+
}
|
|
255
|
+
isDuplicateTransaction(transaction) {
|
|
256
|
+
return this.transactions.some((existingTx) => existingTx.to === transaction.to &&
|
|
257
|
+
existingTx.data === transaction.data);
|
|
258
|
+
}
|
|
81
259
|
}
|
|
82
260
|
exports.OwnershipAdmin = OwnershipAdmin;
|
|
83
261
|
//# sourceMappingURL=ownershipAdmin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ownershipAdmin.js","sourceRoot":"","sources":["../../../src/ownership-transfer/ownershipAdmin.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"ownershipAdmin.js","sourceRoot":"","sources":["../../../src/ownership-transfer/ownershipAdmin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { AddressLike } from "ethers";
|
|
1
|
+
import { AddressLike, Transaction } from "ethers";
|
|
2
2
|
export declare enum PermissionModel {
|
|
3
3
|
OWNABLE = "OWNABLE",
|
|
4
4
|
ROLE_BASED = "ROLE_BASED",
|
|
5
|
-
ACCESS_MANAGED = "ACCESS_MANAGED"
|
|
5
|
+
ACCESS_MANAGED = "ACCESS_MANAGED",
|
|
6
|
+
ACCESS_MANAGER = "ACCESS_MANAGER"
|
|
6
7
|
}
|
|
7
8
|
export declare const isOwnable: (contractAddress: AddressLike) => Promise<boolean>;
|
|
8
9
|
export declare const isAccessControl: (contractAddress: AddressLike) => Promise<boolean>;
|
|
10
|
+
export declare const isAccessManager: (contractAddress: AddressLike) => Promise<boolean>;
|
|
9
11
|
export declare const isAccessManaged: (contractAddress: AddressLike) => Promise<boolean>;
|
|
10
|
-
export declare const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
12
|
+
export declare const tryGetMultiSigInfo: (contractAddress: AddressLike) => Promise<{
|
|
13
|
+
owners: string[] | null;
|
|
14
|
+
threshold: bigint | null;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const transferOwnership: (contractAddress: AddressLike, newOwner: AddressLike) => Promise<Transaction | true>;
|
|
17
|
+
export declare const grantRole: (contractAddress: AddressLike, role: string, account: AddressLike) => Promise<Transaction | true>;
|
|
14
18
|
export declare const getPermissionModels: (address: AddressLike) => Promise<PermissionModel[]>;
|
|
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getPermissionModels = exports.transferOwnership = exports.isAccessManaged = exports.isAccessControl = exports.isOwnable = exports.PermissionModel = void 0;
|
|
6
|
+
exports.getPermissionModels = exports.grantRole = exports.transferOwnership = exports.tryGetMultiSigInfo = exports.isAccessManaged = exports.isAccessManager = exports.isAccessControl = exports.isOwnable = exports.PermissionModel = void 0;
|
|
7
|
+
/* eslint-disable max-lines */
|
|
7
8
|
const ethers_1 = require("ethers");
|
|
8
9
|
const utils_1 = require("./utils");
|
|
9
10
|
const chalk_1 = __importDefault(require("chalk"));
|
|
@@ -12,9 +13,10 @@ var PermissionModel;
|
|
|
12
13
|
(function (PermissionModel) {
|
|
13
14
|
// Does not fully complete the process of Ownable2Step
|
|
14
15
|
PermissionModel["OWNABLE"] = "OWNABLE";
|
|
15
|
-
// This
|
|
16
|
+
// This does NOT work for ACCESS_MANAGER contracts
|
|
16
17
|
PermissionModel["ROLE_BASED"] = "ROLE_BASED";
|
|
17
18
|
PermissionModel["ACCESS_MANAGED"] = "ACCESS_MANAGED";
|
|
19
|
+
PermissionModel["ACCESS_MANAGER"] = "ACCESS_MANAGER";
|
|
18
20
|
})(PermissionModel || (exports.PermissionModel = PermissionModel = {}));
|
|
19
21
|
/*
|
|
20
22
|
* ABI for Ownable interface - includes owner() function
|
|
@@ -31,12 +33,24 @@ const ACCESS_CONTROL_ABI = [
|
|
|
31
33
|
"function grantRole(bytes32 role, address account)",
|
|
32
34
|
"function revokeRole(bytes32 role, address account)"
|
|
33
35
|
];
|
|
36
|
+
const ACCESS_MANAGER_ABI = [
|
|
37
|
+
"function hasRole(uint64 role, address account) view returns (bool)",
|
|
38
|
+
"function grantRole(uint64 role, address account, uint32 executionDelay)",
|
|
39
|
+
"function revokeRole(uint64 role, address account)"
|
|
40
|
+
];
|
|
34
41
|
/*
|
|
35
42
|
* ABI for AccessManaged interface - includes authority() function
|
|
36
43
|
*/
|
|
37
44
|
const ACCESS_MANAGED_ABI = [
|
|
38
45
|
"function authority() view returns (address)"
|
|
39
46
|
];
|
|
47
|
+
/*
|
|
48
|
+
* ABI for Gnosis Safe MultiSig interface
|
|
49
|
+
*/
|
|
50
|
+
const MULTISIG_ABI = [
|
|
51
|
+
"function getOwners() view returns (address[])",
|
|
52
|
+
"function getThreshold() view returns (uint256)"
|
|
53
|
+
];
|
|
40
54
|
const verifyOwnableInterface = async (contract, contractAddress) => {
|
|
41
55
|
/*
|
|
42
56
|
* Verify owner() exists and returns non-zero address
|
|
@@ -105,6 +119,42 @@ const isAccessControl = async (contractAddress) => {
|
|
|
105
119
|
}
|
|
106
120
|
};
|
|
107
121
|
exports.isAccessControl = isAccessControl;
|
|
122
|
+
const verifyAccessManagerInterface = async (contract, contractAddress) => {
|
|
123
|
+
/*
|
|
124
|
+
* Verify hasRole(uint64,address) view function exists
|
|
125
|
+
* AccessManager uses uint64 for roleId instead of bytes32
|
|
126
|
+
*/
|
|
127
|
+
const zeroRole = 0n;
|
|
128
|
+
await contract.hasRole(zeroRole, hardhat_1.ethers.ZeroAddress);
|
|
129
|
+
/*
|
|
130
|
+
* Verify grantRole(uint64,address,uint32) exists by checking bytecode
|
|
131
|
+
* AccessManager's grantRole includes an executionDelay parameter
|
|
132
|
+
*/
|
|
133
|
+
return await (0, utils_1.hasFunctionSelector)(contractAddress, "grantRole(uint64,address,uint32)") &&
|
|
134
|
+
await (0, utils_1.hasFunctionSelector)(contractAddress, "revokeRole(uint64,address)");
|
|
135
|
+
};
|
|
136
|
+
/*
|
|
137
|
+
* Checks if a contract implements the AccessManager interface.
|
|
138
|
+
* A contract is considered AccessManager if it has hasRole(uint64,address) and
|
|
139
|
+
* grantRole(uint64,address,uint32) functions with uint64 role parameter.
|
|
140
|
+
*
|
|
141
|
+
* @param contractAddress - The address of the contract to check
|
|
142
|
+
* @returns true if the contract is AccessManager, false otherwise
|
|
143
|
+
*/
|
|
144
|
+
const isAccessManager = async (contractAddress) => {
|
|
145
|
+
try {
|
|
146
|
+
const resolvedAddress = await hardhat_1.ethers.resolveAddress(contractAddress);
|
|
147
|
+
if (!await (0, utils_1.isContractAddress)(resolvedAddress)) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
const contract = new ethers_1.Contract(resolvedAddress, ACCESS_MANAGER_ABI, hardhat_1.ethers.provider);
|
|
151
|
+
return await verifyAccessManagerInterface(contract, resolvedAddress);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
exports.isAccessManager = isAccessManager;
|
|
108
158
|
/*
|
|
109
159
|
* Checks if a contract implements the AccessManaged interface.
|
|
110
160
|
* A contract is considered AccessManaged if it has an authority() function
|
|
@@ -133,6 +183,30 @@ const isAccessManaged = async (contractAddress) => {
|
|
|
133
183
|
}
|
|
134
184
|
};
|
|
135
185
|
exports.isAccessManaged = isAccessManaged;
|
|
186
|
+
/*
|
|
187
|
+
* Checks if a contract is a MultiSig (Gnosis Safe).
|
|
188
|
+
* A contract is considered a MultiSig if it has both getOwners() and getThreshold() functions
|
|
189
|
+
* and returns valid data (at least one owner and threshold > 0).
|
|
190
|
+
*
|
|
191
|
+
* @param contractAddress - The address of the contract to check
|
|
192
|
+
* @returns An object containing owners and threshold if the contract is a MultiSig, null otherwise
|
|
193
|
+
*/
|
|
194
|
+
const tryGetMultiSigInfo = async (contractAddress) => {
|
|
195
|
+
let owners = null;
|
|
196
|
+
let threshold = null;
|
|
197
|
+
try {
|
|
198
|
+
const resolvedAddress = await hardhat_1.ethers.resolveAddress(contractAddress);
|
|
199
|
+
const contract = new ethers_1.Contract(resolvedAddress, MULTISIG_ABI, hardhat_1.ethers.provider);
|
|
200
|
+
owners = await contract.getOwners();
|
|
201
|
+
threshold = await contract.getThreshold();
|
|
202
|
+
return { owners, threshold };
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
console.warn(`Error calling usual Multi-sig getter functions: ${err}`);
|
|
206
|
+
return { owners, threshold };
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
exports.tryGetMultiSigInfo = tryGetMultiSigInfo;
|
|
136
210
|
/*
|
|
137
211
|
* Transfers ownership of an Ownable contract to a new owner.
|
|
138
212
|
* This function encodes the transferOwnership call data for the transaction.
|
|
@@ -144,6 +218,7 @@ exports.isAccessManaged = isAccessManaged;
|
|
|
144
218
|
*
|
|
145
219
|
* @dev The address must have already been verified as an Ownable contract before calling this function.
|
|
146
220
|
*/
|
|
221
|
+
// eslint-disable-next-line max-statements
|
|
147
222
|
const transferOwnership = async (contractAddress, newOwner) => {
|
|
148
223
|
const resolvedContractAddress = await hardhat_1.ethers.resolveAddress(contractAddress);
|
|
149
224
|
const resolvedNewOwner = await hardhat_1.ethers.resolveAddress(newOwner);
|
|
@@ -153,12 +228,42 @@ const transferOwnership = async (contractAddress, newOwner) => {
|
|
|
153
228
|
}
|
|
154
229
|
const data = contract.interface.encodeFunctionData("transferOwnership", [resolvedNewOwner]);
|
|
155
230
|
console.log(chalk_1.default.green(`Prepared transferOwnership transaction for ${resolvedContractAddress} to new owner ${resolvedNewOwner}`));
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
231
|
+
const transaction = new ethers_1.Transaction();
|
|
232
|
+
transaction.to = resolvedContractAddress;
|
|
233
|
+
transaction.data = data;
|
|
234
|
+
return transaction;
|
|
160
235
|
};
|
|
161
236
|
exports.transferOwnership = transferOwnership;
|
|
237
|
+
/*
|
|
238
|
+
* Grants a role to an address in a ROLE_BASED (AccessControl) contract.
|
|
239
|
+
* This function encodes the grantRole call data for the transaction.
|
|
240
|
+
*
|
|
241
|
+
* @param contractAddress - The address of the AccessControl contract
|
|
242
|
+
* @param role - The bytes32 role identifier to grant
|
|
243
|
+
* @param account - The address to grant the role to
|
|
244
|
+
* @returns Transaction object with the encoded grantRole call or true
|
|
245
|
+
* if the account already has the role
|
|
246
|
+
*
|
|
247
|
+
* @dev The contract address must be a ROLE_BASED contract (not validated by this function)
|
|
248
|
+
*/
|
|
249
|
+
const grantRole = async (contractAddress, role, account) => {
|
|
250
|
+
const resolvedContractAddress = await hardhat_1.ethers.resolveAddress(contractAddress);
|
|
251
|
+
const resolvedAccount = await hardhat_1.ethers.resolveAddress(account);
|
|
252
|
+
const contract = new ethers_1.Contract(resolvedContractAddress, ACCESS_CONTROL_ABI, hardhat_1.ethers.provider);
|
|
253
|
+
/*
|
|
254
|
+
* Check if the account already has the role
|
|
255
|
+
*/
|
|
256
|
+
if (await contract.hasRole(role, resolvedAccount)) {
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
const data = contract.interface.encodeFunctionData("grantRole", [role, resolvedAccount]);
|
|
260
|
+
const transaction = new ethers_1.Transaction();
|
|
261
|
+
transaction.to = resolvedContractAddress;
|
|
262
|
+
transaction.data = data;
|
|
263
|
+
return transaction;
|
|
264
|
+
};
|
|
265
|
+
exports.grantRole = grantRole;
|
|
266
|
+
// eslint-disable-next-line max-statements
|
|
162
267
|
const getPermissionModels = async (address) => {
|
|
163
268
|
const models = [];
|
|
164
269
|
if (await (0, exports.isOwnable)(address)) {
|
|
@@ -167,9 +272,15 @@ const getPermissionModels = async (address) => {
|
|
|
167
272
|
if (await (0, exports.isAccessControl)(address)) {
|
|
168
273
|
models.push(PermissionModel.ROLE_BASED);
|
|
169
274
|
}
|
|
275
|
+
if (await (0, exports.isAccessManager)(address)) {
|
|
276
|
+
models.push(PermissionModel.ACCESS_MANAGER);
|
|
277
|
+
}
|
|
170
278
|
if (await (0, exports.isAccessManaged)(address)) {
|
|
171
279
|
models.push(PermissionModel.ACCESS_MANAGED);
|
|
172
280
|
}
|
|
281
|
+
if (models.includes(PermissionModel.ACCESS_MANAGER) && models.includes(PermissionModel.ROLE_BASED)) {
|
|
282
|
+
throw new Error(`Address ${address} cannot be both ACCESS_MANAGER and ROLE_BASED permission models.`);
|
|
283
|
+
}
|
|
173
284
|
return models;
|
|
174
285
|
};
|
|
175
286
|
exports.getPermissionModels = getPermissionModels;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission-utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/permission-utils.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"permission-utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/permission-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,6 @@ export declare const getImplementationAddress: (address: string) => Promise<stri
|
|
|
11
11
|
export declare const isTUPPPattern: (address: string) => Promise<boolean>;
|
|
12
12
|
export declare const isBeaconPattern: (address: string) => Promise<boolean>;
|
|
13
13
|
export declare const identifyProxyPattern: (address: string) => Promise<Pattern>;
|
|
14
|
-
export declare const promptUserConfirmation: () => Promise<boolean>;
|
|
14
|
+
export declare const promptUserConfirmation: (message?: string) => Promise<boolean>;
|
|
15
15
|
export declare const detectPattern: (address: AddressLike) => Promise<Pattern>;
|
|
16
16
|
export declare const hasFunctionSelector: (address: string, signature: string) => Promise<boolean>;
|
|
@@ -120,13 +120,14 @@ exports.identifyProxyPattern = identifyProxyPattern;
|
|
|
120
120
|
* Accepts "yes" or "y" (case-insensitive) as confirmation.
|
|
121
121
|
* Returns a Promise that resolves to true if confirmed, false otherwise.
|
|
122
122
|
*/
|
|
123
|
-
const promptUserConfirmation = () => {
|
|
123
|
+
const promptUserConfirmation = (message) => {
|
|
124
124
|
const rl = readline_1.default.createInterface({
|
|
125
125
|
"input": process.stdin,
|
|
126
126
|
"output": process.stdout
|
|
127
127
|
});
|
|
128
|
+
const msg = message || "Do you confirm these findings?";
|
|
128
129
|
return new Promise((resolve) => {
|
|
129
|
-
rl.question(chalk_1.default.yellow(
|
|
130
|
+
rl.question(chalk_1.default.yellow(`${msg} (yes/y to confirm): `), (answer) => {
|
|
130
131
|
rl.close();
|
|
131
132
|
const normalizedAnswer = answer.trim().toLowerCase();
|
|
132
133
|
resolve(normalizedAnswer === "yes" || normalizedAnswer === "y");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/utils.ts"],"names":[],"mappings":"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"}
|