@skalenetwork/upgrade-tools 4.0.0-ownership-helpers.18 → 4.0.0-ownership-helpers.19
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/ownership-transfer/constants.d.ts +0 -1
- package/dist/src/ownership-transfer/constants.js +5 -5
- package/dist/src/ownership-transfer/constants.js.map +1 -1
- package/dist/src/ownership-transfer/contractAdmin.d.ts +13 -6
- package/dist/src/ownership-transfer/contractAdmin.js +62 -30
- package/dist/src/ownership-transfer/contractAdmin.js.map +1 -1
- package/dist/src/ownership-transfer/instanceAdmin.d.ts +13 -7
- package/dist/src/ownership-transfer/instanceAdmin.js +41 -29
- package/dist/src/ownership-transfer/instanceAdmin.js.map +1 -1
- package/dist/src/ownership-transfer/permission-utils.d.ts +3 -5
- package/dist/src/ownership-transfer/permission-utils.js +62 -64
- package/dist/src/ownership-transfer/permission-utils.js.map +1 -1
- package/dist/src/ownership-transfer/utils.d.ts +2 -2
- package/dist/src/ownership-transfer/utils.js +30 -39
- package/dist/src/ownership-transfer/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export declare const ERC1967_ADMIN_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
|
|
2
2
|
export declare const ERC1967_IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
|
|
3
|
-
export declare const ERC1967_BEACON_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
|
|
4
3
|
export declare const basicBeaconAbi: string[];
|
|
5
4
|
export declare const OWNABLE_ABI: string[];
|
|
6
5
|
export declare const ACCESS_CONTROL_ABI: string[];
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MULTISIG_ABI = exports.ACCESS_MANAGED_ABI = exports.ACCESS_MANAGER_ABI = exports.ACCESS_CONTROL_ABI = exports.OWNABLE_ABI = exports.basicBeaconAbi = exports.
|
|
3
|
+
exports.MULTISIG_ABI = exports.ACCESS_MANAGED_ABI = exports.ACCESS_MANAGER_ABI = exports.ACCESS_CONTROL_ABI = exports.OWNABLE_ABI = exports.basicBeaconAbi = exports.ERC1967_IMPLEMENTATION_SLOT = exports.ERC1967_ADMIN_SLOT = void 0;
|
|
4
4
|
exports.ERC1967_ADMIN_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
|
|
5
5
|
exports.ERC1967_IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
|
|
6
|
-
exports.ERC1967_BEACON_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
|
|
7
6
|
exports.basicBeaconAbi = [
|
|
8
7
|
"function owner() view returns (address)",
|
|
9
|
-
"function implementation() view returns (address)"
|
|
8
|
+
"function implementation() view returns (address)",
|
|
9
|
+
"function upgradeTo(address newImplementation)"
|
|
10
10
|
];
|
|
11
11
|
exports.OWNABLE_ABI = [
|
|
12
12
|
"function transferOwnership(address newOwner)",
|
|
@@ -15,13 +15,13 @@ exports.OWNABLE_ABI = [
|
|
|
15
15
|
exports.ACCESS_CONTROL_ABI = [
|
|
16
16
|
"function hasRole(bytes32 role, address account) view returns (bool)",
|
|
17
17
|
"function grantRole(bytes32 role, address account)",
|
|
18
|
-
"function
|
|
18
|
+
"function renounceRole(bytes32 role, address account)",
|
|
19
19
|
"function getRoleMemberCount(bytes32 role) view returns (uint256)"
|
|
20
20
|
];
|
|
21
21
|
exports.ACCESS_MANAGER_ABI = [
|
|
22
22
|
"function hasRole(uint64 role, address account) view returns (bool)",
|
|
23
23
|
"function grantRole(uint64 role, address account, uint32 executionDelay)",
|
|
24
|
-
"function
|
|
24
|
+
"function renounceRole(uint64 role, address account)"
|
|
25
25
|
];
|
|
26
26
|
exports.ACCESS_MANAGED_ABI = [
|
|
27
27
|
"function authority() view returns (address)"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/ownership-transfer/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,kBAAkB,GAAG,oEAAoE,CAAC;AAC1F,QAAA,2BAA2B,GAAG,oEAAoE,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/ownership-transfer/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,kBAAkB,GAAG,oEAAoE,CAAC;AAC1F,QAAA,2BAA2B,GAAG,oEAAoE,CAAC;AAGnG,QAAA,cAAc,GAAG;IAC1B,yCAAyC;IACzC,kDAAkD;IAClD,+CAA+C;CAClD,CAAC;AAEW,QAAA,WAAW,GAAG;IACvB,8CAA8C;IAC9C,yCAAyC;CAC5C,CAAC;AAEW,QAAA,kBAAkB,GAAG;IAC9B,qEAAqE;IACrE,mDAAmD;IACnD,sDAAsD;IACtD,kEAAkE;CACrE,CAAC;AAEW,QAAA,kBAAkB,GAAG;IAC9B,oEAAoE;IACpE,yEAAyE;IACzE,qDAAqD;CACxD,CAAC;AAEW,QAAA,kBAAkB,GAAG;IAC9B,6CAA6C;CAChD,CAAC;AAEW,QAAA,YAAY,GAAG;IACxB,+CAA+C;IAC/C,gDAAgD;CACnD,CAAC"}
|
|
@@ -5,6 +5,10 @@ export interface BytesRole {
|
|
|
5
5
|
name: string;
|
|
6
6
|
identifier: string;
|
|
7
7
|
}
|
|
8
|
+
export interface UintRole {
|
|
9
|
+
name: string;
|
|
10
|
+
identifier: bigint;
|
|
11
|
+
}
|
|
8
12
|
export interface ContractMetadataDetails {
|
|
9
13
|
name: string;
|
|
10
14
|
pattern: Pattern;
|
|
@@ -21,13 +25,13 @@ export declare class ContractAdmin {
|
|
|
21
25
|
address: string;
|
|
22
26
|
permissionModel: PermissionModel[];
|
|
23
27
|
private grantOwnershipRoleTxs;
|
|
24
|
-
private
|
|
28
|
+
private renounceOwnershipTxs;
|
|
25
29
|
constructor(details: ContractMetadataDetails);
|
|
26
|
-
createGrantOwnershipTransactions(oldOwner: string, newOwner: string, bytes32RolesToCheck: BytesRole[]): Promise<void>;
|
|
27
|
-
|
|
30
|
+
createGrantOwnershipTransactions(oldOwner: string, newOwner: string, bytes32RolesToCheck: BytesRole[], managerRolesToCheck: UintRole[]): Promise<void>;
|
|
31
|
+
createRenounceOwnershipTransactions(oldOwner: string, bytes32RolesToCheck: BytesRole[], managerRolesToCheck: UintRole[]): Promise<void>;
|
|
28
32
|
getGrantOwnershipTransactions(): TransactionData[];
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
getRenounceOwnershipTransactions(): TransactionData[];
|
|
34
|
+
clearRenounceTransactions(): void;
|
|
31
35
|
clearGrantTransactions(): void;
|
|
32
36
|
requiresOwnershipGranting(): boolean;
|
|
33
37
|
requiresOwnershipRevoking(): boolean;
|
|
@@ -38,7 +42,10 @@ export declare class ContractAdmin {
|
|
|
38
42
|
}): void;
|
|
39
43
|
private createTUPPGrantOwnershipTransaction;
|
|
40
44
|
private createOwnableOwnershipTransaction;
|
|
45
|
+
private createAssignUint64RolesTransactions;
|
|
46
|
+
private handleRenounceOwnershipTransaction;
|
|
47
|
+
private createRenounceUint64RolesTransactions;
|
|
41
48
|
private createAssignBytes32RolesTransactions;
|
|
42
|
-
private
|
|
49
|
+
private createRenounceBytes32RolesTransactions;
|
|
43
50
|
private isDuplicateTransaction;
|
|
44
51
|
}
|
|
@@ -12,18 +12,21 @@ class ContractAdmin {
|
|
|
12
12
|
constructor(details) {
|
|
13
13
|
this.permissionModel = [];
|
|
14
14
|
this.grantOwnershipRoleTxs = [];
|
|
15
|
-
this.
|
|
15
|
+
this.renounceOwnershipTxs = [];
|
|
16
16
|
this.contractName = details.name;
|
|
17
17
|
this.pattern = details.pattern;
|
|
18
18
|
this.address = details.address;
|
|
19
19
|
this.permissionModel = details.permissionModel ?? [];
|
|
20
20
|
}
|
|
21
|
-
|
|
21
|
+
// Looks cleaner than passing an object. Also parsing the object would be more verbose.
|
|
22
|
+
// eslint-disable-next-line max-params, max-statements
|
|
23
|
+
async createGrantOwnershipTransactions(oldOwner, newOwner, bytes32RolesToCheck, managerRolesToCheck) {
|
|
22
24
|
if (!this.grantOwnershipRoleTxs.length) {
|
|
23
25
|
console.log(chalk_1.default.white(`* Creating Transactions to grant Ownership in ${this.contractName}.`));
|
|
24
26
|
if (this.pattern === utils_1.Pattern.TUPP) {
|
|
25
27
|
await this.createTUPPGrantOwnershipTransaction(oldOwner, newOwner);
|
|
26
28
|
}
|
|
29
|
+
// UpgradeableBeacon is detected also as OWNABLE
|
|
27
30
|
if (this.permissionModel.includes(permission_utils_1.PermissionModel.OWNABLE)) {
|
|
28
31
|
await this.createOwnableOwnershipTransaction(oldOwner, newOwner);
|
|
29
32
|
}
|
|
@@ -31,30 +34,30 @@ class ContractAdmin {
|
|
|
31
34
|
await this.createAssignBytes32RolesTransactions(oldOwner, newOwner, bytes32RolesToCheck);
|
|
32
35
|
}
|
|
33
36
|
if (this.permissionModel.includes(permission_utils_1.PermissionModel.ACCESS_MANAGER)) {
|
|
34
|
-
|
|
37
|
+
this.createAssignUint64RolesTransactions(oldOwner, newOwner, managerRolesToCheck);
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
40
|
}
|
|
38
|
-
async
|
|
39
|
-
if (this.
|
|
41
|
+
async createRenounceOwnershipTransactions(oldOwner, bytes32RolesToCheck, managerRolesToCheck) {
|
|
42
|
+
if (this.renounceOwnershipTxs.length) {
|
|
40
43
|
return;
|
|
41
44
|
}
|
|
42
|
-
console.log(chalk_1.default.white(`* Creating Transactions to
|
|
45
|
+
console.log(chalk_1.default.white(`* Creating Transactions to renounce Ownership in ${this.contractName}.`));
|
|
43
46
|
if (this.permissionModel.includes(permission_utils_1.PermissionModel.ROLE_BASED)) {
|
|
44
|
-
await this.
|
|
47
|
+
await this.createRenounceBytes32RolesTransactions(oldOwner, bytes32RolesToCheck);
|
|
45
48
|
}
|
|
46
49
|
if (this.permissionModel.includes(permission_utils_1.PermissionModel.ACCESS_MANAGER)) {
|
|
47
|
-
|
|
50
|
+
await this.createRenounceUint64RolesTransactions(oldOwner, managerRolesToCheck);
|
|
48
51
|
}
|
|
49
52
|
}
|
|
50
53
|
getGrantOwnershipTransactions() {
|
|
51
54
|
return this.grantOwnershipRoleTxs;
|
|
52
55
|
}
|
|
53
|
-
|
|
54
|
-
return this.
|
|
56
|
+
getRenounceOwnershipTransactions() {
|
|
57
|
+
return this.renounceOwnershipTxs;
|
|
55
58
|
}
|
|
56
|
-
|
|
57
|
-
this.
|
|
59
|
+
clearRenounceTransactions() {
|
|
60
|
+
this.renounceOwnershipTxs = [];
|
|
58
61
|
}
|
|
59
62
|
clearGrantTransactions() {
|
|
60
63
|
this.grantOwnershipRoleTxs = [];
|
|
@@ -63,7 +66,7 @@ class ContractAdmin {
|
|
|
63
66
|
return Boolean(this.grantOwnershipRoleTxs.length);
|
|
64
67
|
}
|
|
65
68
|
requiresOwnershipRevoking() {
|
|
66
|
-
return Boolean(this.
|
|
69
|
+
return Boolean(this.renounceOwnershipTxs.length);
|
|
67
70
|
}
|
|
68
71
|
displayData(columnWidths) {
|
|
69
72
|
const { maxNameWidth, maxAddressWidth, maxPermissionsWidth } = columnWidths;
|
|
@@ -74,12 +77,12 @@ class ContractAdmin {
|
|
|
74
77
|
if (this.grantOwnershipRoleTxs.length) {
|
|
75
78
|
status = chalk_1.default.yellow("GRANT OWNERSHIP REQUIRED");
|
|
76
79
|
}
|
|
77
|
-
else if (this.
|
|
80
|
+
else if (this.renounceOwnershipTxs.length) {
|
|
78
81
|
status = chalk_1.default.yellow("REVOKE ROLES REQUIRED");
|
|
79
82
|
}
|
|
80
83
|
console.log(chalk_1.default.gray(` ${name} ${address} ${permissions} `) + status);
|
|
81
84
|
}
|
|
82
|
-
//
|
|
85
|
+
// InstanceAdmin filters duplicates across multiple contracts sharing the same proxy admin
|
|
83
86
|
async createTUPPGrantOwnershipTransaction(oldOwner, newOwner) {
|
|
84
87
|
const admin = await (0, utils_1.getAdminAddress)(this.address);
|
|
85
88
|
await this.createOwnableOwnershipTransaction(oldOwner, newOwner, { address: admin, name: `${this.contractName} Proxy Admin` });
|
|
@@ -99,15 +102,15 @@ class ContractAdmin {
|
|
|
99
102
|
});
|
|
100
103
|
}
|
|
101
104
|
}
|
|
102
|
-
async
|
|
103
|
-
for (const role of
|
|
105
|
+
async createAssignUint64RolesTransactions(oldOwner, newOwner, managerRolesToCheck) {
|
|
106
|
+
for (const role of managerRolesToCheck) {
|
|
104
107
|
// Required to process sequentially as it access shared memory state
|
|
105
108
|
// eslint-disable-next-line no-await-in-loop
|
|
106
|
-
const tx = await (0, permission_utils_1.
|
|
109
|
+
const tx = await (0, permission_utils_1.grantAccessManagerRole)(this.address, role.identifier, newOwner, oldOwner);
|
|
107
110
|
if (tx) {
|
|
108
111
|
if (this.isDuplicateTransaction({ transaction: tx })) {
|
|
109
112
|
// Unexpected - better check
|
|
110
|
-
throw new Error(`Error: Transaction to grant role ${role} in ${this.contractName} was already created.`);
|
|
113
|
+
throw new Error(`Error: Transaction to grant manager role ${role.name} in ${this.contractName} was already created.`);
|
|
111
114
|
}
|
|
112
115
|
else {
|
|
113
116
|
const description = `-> Tx to grant role ${role.name} to ${newOwner} in ${this.contractName}`;
|
|
@@ -117,33 +120,62 @@ class ContractAdmin {
|
|
|
117
120
|
}
|
|
118
121
|
}
|
|
119
122
|
}
|
|
120
|
-
|
|
123
|
+
handleRenounceOwnershipTransaction(tx, roleName, oldOwner) {
|
|
124
|
+
if (typeof tx !== "boolean" && tx) {
|
|
125
|
+
if (this.isDuplicateTransaction({ transaction: tx })) {
|
|
126
|
+
// Unexpected - better check
|
|
127
|
+
throw new Error(`Error: Transaction to renounce role ${roleName} in ${this.contractName} was already created.`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const description = `-> Tx to renounce role ${roleName} from ${oldOwner} in ${this.contractName}`;
|
|
131
|
+
console.log(chalk_1.default.yellow(` ${description} created.`));
|
|
132
|
+
this.renounceOwnershipTxs.push({ description, transaction: tx });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else if (!tx) {
|
|
136
|
+
console.log(chalk_1.default.yellow(` WARNING: Skipping revocation of role ${roleName} in ${this.contractName} as it requires at least 1 member left.`));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async createRenounceUint64RolesTransactions(oldOwner, managerRolesToCheck) {
|
|
140
|
+
for (const role of managerRolesToCheck) {
|
|
141
|
+
// Required to process sequentially as it access shared memory state
|
|
142
|
+
// eslint-disable-next-line no-await-in-loop
|
|
143
|
+
const tx = await (0, permission_utils_1.renounceAccessManagerRole)(this.address, role.identifier, oldOwner);
|
|
144
|
+
this.handleRenounceOwnershipTransaction(tx, role.name, oldOwner);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async createAssignBytes32RolesTransactions(oldOwner, newOwner, bytes32RolesToCheck) {
|
|
121
148
|
for (const role of bytes32RolesToCheck) {
|
|
122
149
|
// Required to process sequentially as it access shared memory state
|
|
123
150
|
// eslint-disable-next-line no-await-in-loop
|
|
124
|
-
const tx = await (0, permission_utils_1.
|
|
125
|
-
if (
|
|
151
|
+
const tx = await (0, permission_utils_1.grantRole)(this.address, role.identifier, newOwner, oldOwner);
|
|
152
|
+
if (tx) {
|
|
126
153
|
if (this.isDuplicateTransaction({ transaction: tx })) {
|
|
127
154
|
// Unexpected - better check
|
|
128
|
-
throw new Error(`Error: Transaction to
|
|
155
|
+
throw new Error(`Error: Transaction to grant role ${role.name} in ${this.contractName} was already created.`);
|
|
129
156
|
}
|
|
130
157
|
else {
|
|
131
|
-
const description = `-> Tx to
|
|
158
|
+
const description = `-> Tx to grant role ${role.name} to ${newOwner} in ${this.contractName}`;
|
|
132
159
|
console.log(chalk_1.default.yellow(` ${description} created.`));
|
|
133
|
-
this.
|
|
160
|
+
this.grantOwnershipRoleTxs.push({ description, transaction: tx });
|
|
134
161
|
}
|
|
135
162
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async createRenounceBytes32RolesTransactions(oldOwner, bytes32RolesToCheck) {
|
|
166
|
+
for (const role of bytes32RolesToCheck) {
|
|
167
|
+
// Required to process sequentially as it access shared memory state
|
|
168
|
+
// eslint-disable-next-line no-await-in-loop
|
|
169
|
+
const tx = await (0, permission_utils_1.renounceRole)(this.address, role.identifier, oldOwner);
|
|
170
|
+
this.handleRenounceOwnershipTransaction(tx, role.name, oldOwner);
|
|
139
171
|
}
|
|
140
172
|
}
|
|
141
173
|
isDuplicateTransaction(transaction) {
|
|
142
174
|
const isGrantDuplicate = this.grantOwnershipRoleTxs.some((existingTx) => existingTx.transaction.to === transaction.transaction.to &&
|
|
143
175
|
existingTx.transaction.data === transaction.transaction.data);
|
|
144
|
-
const
|
|
176
|
+
const isRenounceDuplicate = this.renounceOwnershipTxs.some((existingTx) => existingTx.transaction.to === transaction.transaction.to &&
|
|
145
177
|
existingTx.transaction.data === transaction.transaction.data);
|
|
146
|
-
return isGrantDuplicate ||
|
|
178
|
+
return isGrantDuplicate || isRenounceDuplicate;
|
|
147
179
|
}
|
|
148
180
|
}
|
|
149
181
|
exports.ContractAdmin = ContractAdmin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contractAdmin.js","sourceRoot":"","sources":["../../../src/ownership-transfer/contractAdmin.ts"],"names":[],"mappings":";;;;;;AAAA,oBAAoB;AACpB,mCAAiD;AACjD,
|
|
1
|
+
{"version":3,"file":"contractAdmin.js","sourceRoot":"","sources":["../../../src/ownership-transfer/contractAdmin.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,35 +3,40 @@ import { Instance } from "@skalenetwork/skale-contracts-ethers-v6";
|
|
|
3
3
|
export interface InstanceAdminOptions {
|
|
4
4
|
oldOwner: string;
|
|
5
5
|
submitter: SafeSubmitter | EoaSubmitter;
|
|
6
|
-
|
|
6
|
+
renounceRoles: boolean;
|
|
7
7
|
newOwner: string;
|
|
8
8
|
readonly: boolean;
|
|
9
9
|
testMode: boolean;
|
|
10
10
|
rolesToCheck?: string[];
|
|
11
11
|
managerRolesToCheck?: number[];
|
|
12
12
|
}
|
|
13
|
+
interface ContractId {
|
|
14
|
+
name: string;
|
|
15
|
+
address?: string;
|
|
16
|
+
}
|
|
13
17
|
export declare class InstanceAdmin {
|
|
14
|
-
private instance
|
|
18
|
+
private instance?;
|
|
15
19
|
private contractMetadata;
|
|
16
|
-
private
|
|
20
|
+
private contractIds;
|
|
17
21
|
private bytes32RolesToCheck;
|
|
18
22
|
private managerRolesToCheck;
|
|
19
23
|
private oldOwner;
|
|
20
24
|
private newOwner;
|
|
21
25
|
private readonly;
|
|
22
26
|
private submitter;
|
|
23
|
-
private
|
|
27
|
+
private renounceRoles;
|
|
24
28
|
private testMode;
|
|
25
|
-
constructor(
|
|
29
|
+
constructor(contractIds: ContractId[], options: InstanceAdminOptions, instance?: Instance);
|
|
26
30
|
executeOwnershipTransfer(): Promise<void>;
|
|
27
31
|
private initialize;
|
|
28
32
|
private processGrantStepIfRequired;
|
|
29
|
-
private
|
|
30
|
-
private
|
|
33
|
+
private processRenounceStepIfRequired;
|
|
34
|
+
private submitRenounceRolesTransactions;
|
|
31
35
|
private confirmAndSubmitTransactions;
|
|
32
36
|
private submitGrantOwnershipTransactions;
|
|
33
37
|
private ownershipGrantingRequired;
|
|
34
38
|
private ownershipRevokingRequired;
|
|
39
|
+
private resolveContractAddress;
|
|
35
40
|
private loadContractMetadataAndCreateTransactions;
|
|
36
41
|
private confirmData;
|
|
37
42
|
private processOptions;
|
|
@@ -43,3 +48,4 @@ export declare class InstanceAdmin {
|
|
|
43
48
|
private groupMetadataByPattern;
|
|
44
49
|
private promptConfirmation;
|
|
45
50
|
}
|
|
51
|
+
export {};
|
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
/* eslint-disable max-lines */
|
|
3
|
+
// Exceeded by 3 - required for now
|
|
3
4
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
5
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
6
|
};
|
|
6
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
8
|
exports.InstanceAdmin = void 0;
|
|
9
|
+
// Cspell:words keccak
|
|
8
10
|
const contractAdmin_1 = require("./contractAdmin");
|
|
9
11
|
const submitters_1 = require("../submitters");
|
|
10
12
|
const utils_1 = require("./utils");
|
|
13
|
+
const permission_utils_1 = require("./permission-utils");
|
|
11
14
|
const chalk_1 = __importDefault(require("chalk"));
|
|
12
15
|
const hardhat_1 = require("hardhat");
|
|
13
|
-
const permission_utils_1 = require("./permission-utils");
|
|
14
16
|
const ZERO = 0;
|
|
15
17
|
class InstanceAdmin {
|
|
16
|
-
constructor(
|
|
18
|
+
constructor(contractIds, options, instance) {
|
|
17
19
|
this.contractMetadata = new Map();
|
|
18
20
|
this.bytes32RolesToCheck = [];
|
|
19
21
|
this.managerRolesToCheck = [];
|
|
20
22
|
this.instance = instance;
|
|
21
|
-
this.
|
|
23
|
+
this.contractIds = contractIds;
|
|
22
24
|
this.readonly = options.readonly;
|
|
23
25
|
this.newOwner = options.newOwner;
|
|
24
26
|
this.submitter = options.submitter;
|
|
25
27
|
this.oldOwner = options.oldOwner;
|
|
26
|
-
this.
|
|
28
|
+
this.renounceRoles = options.renounceRoles;
|
|
27
29
|
this.testMode = options.testMode;
|
|
28
30
|
this.processOptions(options);
|
|
29
31
|
}
|
|
@@ -34,9 +36,9 @@ class InstanceAdmin {
|
|
|
34
36
|
return;
|
|
35
37
|
}
|
|
36
38
|
await this.processGrantStepIfRequired();
|
|
37
|
-
await this.
|
|
39
|
+
await this.processRenounceStepIfRequired();
|
|
38
40
|
this.displayFindings();
|
|
39
|
-
if (this.ownershipGrantingRequired() || this.ownershipRevokingRequired() && this.
|
|
41
|
+
if (this.ownershipGrantingRequired() || this.ownershipRevokingRequired() && this.renounceRoles) {
|
|
40
42
|
console.error(chalk_1.default.red("Unexpected state: There are still actions requires."));
|
|
41
43
|
}
|
|
42
44
|
else {
|
|
@@ -50,25 +52,25 @@ class InstanceAdmin {
|
|
|
50
52
|
async processGrantStepIfRequired() {
|
|
51
53
|
if (this.ownershipGrantingRequired()) {
|
|
52
54
|
await this.submitGrantOwnershipTransactions();
|
|
53
|
-
if (this.
|
|
55
|
+
if (this.renounceRoles) {
|
|
54
56
|
await this.createRequiredTransactions();
|
|
55
57
|
}
|
|
56
58
|
await this.confirmData();
|
|
57
59
|
}
|
|
58
60
|
}
|
|
59
|
-
async
|
|
60
|
-
if (this.
|
|
61
|
-
await this.
|
|
61
|
+
async processRenounceStepIfRequired() {
|
|
62
|
+
if (this.renounceRoles && this.ownershipRevokingRequired() === true) {
|
|
63
|
+
await this.submitRenounceRolesTransactions();
|
|
62
64
|
await this.createRequiredTransactions();
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
|
-
async
|
|
67
|
+
async submitRenounceRolesTransactions() {
|
|
66
68
|
const txsToSubmit = [];
|
|
67
69
|
for (const contract of this.contractMetadata.values()) {
|
|
68
|
-
txsToSubmit.push(...contract.
|
|
69
|
-
contract.
|
|
70
|
+
txsToSubmit.push(...contract.getRenounceOwnershipTransactions());
|
|
71
|
+
contract.clearRenounceTransactions();
|
|
70
72
|
}
|
|
71
|
-
console.log(chalk_1.default.green(`Submitting ${txsToSubmit.length}
|
|
73
|
+
console.log(chalk_1.default.green(`Submitting ${txsToSubmit.length} renounce ownership transactions...`));
|
|
72
74
|
for (const [index, txData] of txsToSubmit.entries()) {
|
|
73
75
|
console.log(chalk_1.default.grey(` -> Transaction ${index}: ${txData.description || "No description"}`));
|
|
74
76
|
}
|
|
@@ -105,20 +107,32 @@ class InstanceAdmin {
|
|
|
105
107
|
ownershipRevokingRequired() {
|
|
106
108
|
return Array.from(this.contractMetadata.values()).some(contract => contract.requiresOwnershipRevoking());
|
|
107
109
|
}
|
|
110
|
+
async resolveContractAddress(contractName) {
|
|
111
|
+
if (!this.instance) {
|
|
112
|
+
throw new Error(`Instance is not defined. Cannot resolve ${contractName} address.`);
|
|
113
|
+
}
|
|
114
|
+
return await this.instance.getContractAddress(contractName);
|
|
115
|
+
}
|
|
108
116
|
async loadContractMetadataAndCreateTransactions() {
|
|
109
117
|
/* eslint-disable no-await-in-loop */
|
|
110
118
|
// Do not parallelize to avoid rate limit issues which CAN produce wrong outputs
|
|
111
|
-
for (const contractName of this.
|
|
112
|
-
const
|
|
113
|
-
if (!this.contractMetadata.has(
|
|
114
|
-
const pattern = await (0, utils_1.detectPattern)(
|
|
119
|
+
for (const { name: contractName, address } of this.contractIds) {
|
|
120
|
+
const resolvedAddress = address || await this.resolveContractAddress(contractName);
|
|
121
|
+
if (!this.contractMetadata.has(resolvedAddress)) {
|
|
122
|
+
const pattern = await (0, utils_1.detectPattern)(resolvedAddress);
|
|
115
123
|
const details = {
|
|
116
|
-
address,
|
|
124
|
+
address: resolvedAddress,
|
|
117
125
|
name: contractName,
|
|
118
126
|
pattern,
|
|
119
|
-
permissionModel: await (0, permission_utils_1.getPermissionModels)(
|
|
127
|
+
permissionModel: await (0, permission_utils_1.getPermissionModels)(resolvedAddress)
|
|
120
128
|
};
|
|
121
|
-
|
|
129
|
+
const maxPermissionsIfBeacon = 1;
|
|
130
|
+
if (pattern === utils_1.Pattern.BEACON &&
|
|
131
|
+
!details.permissionModel?.includes(permission_utils_1.PermissionModel.OWNABLE) &&
|
|
132
|
+
details.permissionModel?.length !== maxPermissionsIfBeacon) {
|
|
133
|
+
throw new Error(`UpgradeableBeacon at address ${resolvedAddress} should ONLY have OWNABLE permission model.`);
|
|
134
|
+
}
|
|
135
|
+
this.contractMetadata.set(resolvedAddress, new contractAdmin_1.ContractAdmin(details));
|
|
122
136
|
}
|
|
123
137
|
}
|
|
124
138
|
/* eslint-enable no-await-in-loop */
|
|
@@ -142,23 +156,21 @@ class InstanceAdmin {
|
|
|
142
156
|
throw new Error("New owner address must be provided in options when in write mode.");
|
|
143
157
|
}
|
|
144
158
|
this.managerRolesToCheck = (options.managerRolesToCheck ?? []).map(role => {
|
|
145
|
-
if (typeof role !== "
|
|
146
|
-
throw new Error(`Invalid manager role: ${role}. Must be a non-
|
|
159
|
+
if (typeof role !== "bigint" || role <= ZERO) {
|
|
160
|
+
throw new Error(`Invalid manager role: ${role}. Must be a non-zero bigint.`);
|
|
147
161
|
}
|
|
148
162
|
return { identifier: role, name: `Role ${role}` };
|
|
149
163
|
});
|
|
150
|
-
this.managerRolesToCheck.push({ identifier: ZERO, name: "ADMIN_ROLE" });
|
|
164
|
+
this.managerRolesToCheck.push({ identifier: BigInt(ZERO), name: "ADMIN_ROLE" });
|
|
151
165
|
}
|
|
152
166
|
async createRequiredTransactions() {
|
|
153
167
|
console.log(chalk_1.default.grey("INFO: The next Following steps will NOT submit any transactions to the blockchain."));
|
|
154
168
|
// Preferred to create sequentially due to rate limits
|
|
155
169
|
/* eslint-disable no-await-in-loop */
|
|
156
170
|
for (const contract of this.contractMetadata.values()) {
|
|
157
|
-
await contract.createGrantOwnershipTransactions(this.oldOwner, this.newOwner, this.bytes32RolesToCheck
|
|
158
|
-
//TODO: this.managerRolesToCheck
|
|
159
|
-
);
|
|
171
|
+
await contract.createGrantOwnershipTransactions(this.oldOwner, this.newOwner, this.bytes32RolesToCheck, this.managerRolesToCheck);
|
|
160
172
|
if (!contract.requiresOwnershipGranting()) {
|
|
161
|
-
await contract.
|
|
173
|
+
await contract.createRenounceOwnershipTransactions(this.oldOwner, this.bytes32RolesToCheck, this.managerRolesToCheck);
|
|
162
174
|
}
|
|
163
175
|
}
|
|
164
176
|
/* eslint-enable no-await-in-loop */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instanceAdmin.js","sourceRoot":"","sources":["../../../src/ownership-transfer/instanceAdmin.ts"],"names":[],"mappings":";AAAA,sBAAsB
|
|
1
|
+
{"version":3,"file":"instanceAdmin.js","sourceRoot":"","sources":["../../../src/ownership-transfer/instanceAdmin.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,11 +9,9 @@ export declare const isOwnable: (contractAddress: AddressLike) => Promise<boolea
|
|
|
9
9
|
export declare const isAccessControl: (contractAddress: AddressLike) => Promise<boolean>;
|
|
10
10
|
export declare const isAccessManager: (contractAddress: AddressLike) => Promise<boolean>;
|
|
11
11
|
export declare const isAccessManaged: (contractAddress: AddressLike) => Promise<boolean>;
|
|
12
|
-
export declare const tryGetMultiSigInfo: (contractAddress: string) => Promise<{
|
|
13
|
-
owners: string[] | null;
|
|
14
|
-
threshold: bigint | null;
|
|
15
|
-
}>;
|
|
16
12
|
export declare const transferOwnership: (contractAddress: string, newOwner: string, oldOwner: string) => Promise<Transaction | false>;
|
|
17
13
|
export declare const grantRole: (contractAddress: string, role: string, newAccount: AddressLike, oldAccount: AddressLike) => Promise<Transaction | false>;
|
|
18
|
-
export declare const
|
|
14
|
+
export declare const renounceRole: (contractAddress: string, role: string, oldAccount: AddressLike) => Promise<Transaction | boolean>;
|
|
19
15
|
export declare const getPermissionModels: (address: AddressLike) => Promise<PermissionModel[]>;
|
|
16
|
+
export declare const grantAccessManagerRole: (contractAddress: string, role: bigint, newAccount: AddressLike, oldAccount: AddressLike) => Promise<Transaction | false>;
|
|
17
|
+
export declare const renounceAccessManagerRole: (contractAddress: string, role: bigint, oldAccount: AddressLike) => Promise<Transaction | boolean>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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
4
|
const constants_1 = require("./constants");
|
|
5
5
|
const ethers_1 = require("ethers");
|
|
6
6
|
const utils_1 = require("./utils");
|
|
@@ -13,19 +13,12 @@ var PermissionModel;
|
|
|
13
13
|
PermissionModel["ACCESS_MANAGED"] = "ACCESS_MANAGED";
|
|
14
14
|
PermissionModel["ACCESS_MANAGER"] = "ACCESS_MANAGER";
|
|
15
15
|
})(PermissionModel || (exports.PermissionModel = PermissionModel = {}));
|
|
16
|
+
const ZERO = 0;
|
|
16
17
|
const MIN_ROLE_HOLDERS = 2n;
|
|
17
18
|
const verifyOwnableInterface = async (contract, contractAddress) => {
|
|
18
|
-
/*
|
|
19
|
-
* Verify owner() exists and returns non-zero address
|
|
20
|
-
*/
|
|
21
19
|
const owner = await contract.owner();
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
/*
|
|
26
|
-
* Verify transferOwnership() exists by checking bytecode
|
|
27
|
-
*/
|
|
28
|
-
return await (0, utils_1.hasFunctionSelector)(contractAddress, "transferOwnership(address)");
|
|
20
|
+
return owner !== hardhat_1.ethers.ZeroAddress &&
|
|
21
|
+
await (0, utils_1.hasFunctionSelector)(contractAddress, "transferOwnership(address)");
|
|
29
22
|
};
|
|
30
23
|
const isOwnable = async (contractAddress) => {
|
|
31
24
|
try {
|
|
@@ -42,15 +35,9 @@ const isOwnable = async (contractAddress) => {
|
|
|
42
35
|
};
|
|
43
36
|
exports.isOwnable = isOwnable;
|
|
44
37
|
const verifyAccessControlInterface = async (contract, contractAddress) => {
|
|
45
|
-
/*
|
|
46
|
-
* Verify hasRole() view function exists
|
|
47
|
-
*/
|
|
48
38
|
await contract.hasRole(hardhat_1.ethers.ZeroHash, hardhat_1.ethers.ZeroAddress);
|
|
49
|
-
/*
|
|
50
|
-
* Verify grantRole() exists by checking bytecode
|
|
51
|
-
*/
|
|
52
39
|
return await (0, utils_1.hasFunctionSelector)(contractAddress, "grantRole(bytes32,address)") &&
|
|
53
|
-
await (0, utils_1.hasFunctionSelector)(contractAddress, "
|
|
40
|
+
await (0, utils_1.hasFunctionSelector)(contractAddress, "renounceRole(bytes32,address)");
|
|
54
41
|
};
|
|
55
42
|
const isAccessControl = async (contractAddress) => {
|
|
56
43
|
try {
|
|
@@ -69,12 +56,8 @@ exports.isAccessControl = isAccessControl;
|
|
|
69
56
|
const verifyAccessManagerInterface = async (contract, contractAddress) => {
|
|
70
57
|
const zeroRole = 0n;
|
|
71
58
|
await contract.hasRole(zeroRole, hardhat_1.ethers.ZeroAddress);
|
|
72
|
-
/*
|
|
73
|
-
* Verify grantRole(uint64,address,uint32) exists by checking bytecode
|
|
74
|
-
* AccessManager's grantRole includes an executionDelay parameter
|
|
75
|
-
*/
|
|
76
59
|
return await (0, utils_1.hasFunctionSelector)(contractAddress, "grantRole(uint64,address,uint32)") &&
|
|
77
|
-
await (0, utils_1.hasFunctionSelector)(contractAddress, "
|
|
60
|
+
await (0, utils_1.hasFunctionSelector)(contractAddress, "renounceRole(uint64,address)");
|
|
78
61
|
};
|
|
79
62
|
const isAccessManager = async (contractAddress) => {
|
|
80
63
|
try {
|
|
@@ -93,15 +76,10 @@ exports.isAccessManager = isAccessManager;
|
|
|
93
76
|
const isAccessManaged = async (contractAddress) => {
|
|
94
77
|
try {
|
|
95
78
|
const resolvedAddress = await hardhat_1.ethers.resolveAddress(contractAddress);
|
|
96
|
-
|
|
97
|
-
if (!isContract) {
|
|
79
|
+
if (!await (0, utils_1.isContractAddress)(resolvedAddress)) {
|
|
98
80
|
return false;
|
|
99
81
|
}
|
|
100
82
|
const contract = new ethers_1.Contract(resolvedAddress, constants_1.ACCESS_MANAGED_ABI, hardhat_1.ethers.provider);
|
|
101
|
-
/*
|
|
102
|
-
* Try to call authority() - if it succeeds and returns non-zero address,
|
|
103
|
-
* The contract is AccessManaged
|
|
104
|
-
*/
|
|
105
83
|
const authorityAddress = await contract.authority();
|
|
106
84
|
return await (0, exports.isAccessManager)(authorityAddress);
|
|
107
85
|
}
|
|
@@ -110,21 +88,6 @@ const isAccessManaged = async (contractAddress) => {
|
|
|
110
88
|
}
|
|
111
89
|
};
|
|
112
90
|
exports.isAccessManaged = isAccessManaged;
|
|
113
|
-
const tryGetMultiSigInfo = async (contractAddress) => {
|
|
114
|
-
let owners = null;
|
|
115
|
-
let threshold = null;
|
|
116
|
-
try {
|
|
117
|
-
const contract = new ethers_1.Contract(contractAddress, constants_1.MULTISIG_ABI, hardhat_1.ethers.provider);
|
|
118
|
-
owners = await contract.getOwners();
|
|
119
|
-
threshold = await contract.getThreshold();
|
|
120
|
-
return { owners, threshold };
|
|
121
|
-
}
|
|
122
|
-
catch (err) {
|
|
123
|
-
console.warn(`Error calling usual Multi-sig getter functions: ${err}`);
|
|
124
|
-
return { owners, threshold };
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
exports.tryGetMultiSigInfo = tryGetMultiSigInfo;
|
|
128
91
|
const transferOwnership = async (contractAddress, newOwner, oldOwner) => {
|
|
129
92
|
const contract = new ethers_1.Contract(contractAddress, constants_1.OWNABLE_ABI, hardhat_1.ethers.provider);
|
|
130
93
|
if (await contract.owner() === newOwner) {
|
|
@@ -141,16 +104,16 @@ const transferOwnership = async (contractAddress, newOwner, oldOwner) => {
|
|
|
141
104
|
};
|
|
142
105
|
exports.transferOwnership = transferOwnership;
|
|
143
106
|
const grantRole = async (contractAddress, role, newAccount, oldAccount
|
|
107
|
+
// Cleaner, and the 4 are required
|
|
144
108
|
// eslint-disable-next-line max-params
|
|
145
109
|
) => {
|
|
146
110
|
const contract = new ethers_1.Contract(contractAddress, constants_1.ACCESS_CONTROL_ABI, hardhat_1.ethers.provider);
|
|
147
|
-
|
|
148
|
-
* Check if the account already has the role OR if the oldAccount does not have it - no action
|
|
149
|
-
*/
|
|
111
|
+
// If new account already has role or old account never had it in the first place - no action
|
|
150
112
|
if (await contract.hasRole(role, newAccount) || !await contract.hasRole(role, oldAccount)) {
|
|
151
113
|
return false;
|
|
152
114
|
}
|
|
153
115
|
if (!await contract.hasRole(hardhat_1.ethers.ZeroHash, oldAccount)) {
|
|
116
|
+
// Currently we do not support roleAdmins - must be ran by owner
|
|
154
117
|
throw new Error(`Account ${oldAccount} does not have permission to grant roles on contract ${contractAddress}.`);
|
|
155
118
|
}
|
|
156
119
|
const data = contract.interface.encodeFunctionData("grantRole", [role, newAccount]);
|
|
@@ -160,40 +123,75 @@ const grantRole = async (contractAddress, role, newAccount, oldAccount
|
|
|
160
123
|
return transaction;
|
|
161
124
|
};
|
|
162
125
|
exports.grantRole = grantRole;
|
|
163
|
-
const
|
|
126
|
+
const renounceRole = async (contractAddress, role, oldAccount) => {
|
|
164
127
|
const contract = new ethers_1.Contract(contractAddress, constants_1.ACCESS_CONTROL_ABI, hardhat_1.ethers.provider);
|
|
165
128
|
if (!await contract.hasRole(role, oldAccount)) {
|
|
166
129
|
return true;
|
|
167
130
|
}
|
|
168
|
-
|
|
131
|
+
// Prevent revoking last role holder of default admin role
|
|
132
|
+
if (role === hardhat_1.ethers.ZeroHash && (await contract.getRoleMemberCount(role)) < MIN_ROLE_HOLDERS) {
|
|
169
133
|
return false;
|
|
170
134
|
}
|
|
171
|
-
const data = contract.interface.encodeFunctionData("
|
|
135
|
+
const data = contract.interface.encodeFunctionData("renounceRole", [role, oldAccount]);
|
|
172
136
|
const transaction = new ethers_1.Transaction();
|
|
173
137
|
transaction.to = contractAddress;
|
|
174
138
|
transaction.data = data;
|
|
175
139
|
return transaction;
|
|
176
140
|
};
|
|
177
|
-
exports.
|
|
178
|
-
// eslint-disable-next-line max-statements
|
|
141
|
+
exports.renounceRole = renounceRole;
|
|
179
142
|
const getPermissionModels = async (address) => {
|
|
143
|
+
const checks = [
|
|
144
|
+
{ check: exports.isOwnable, model: PermissionModel.OWNABLE },
|
|
145
|
+
{ check: exports.isAccessControl, model: PermissionModel.ROLE_BASED },
|
|
146
|
+
{ check: exports.isAccessManager, model: PermissionModel.ACCESS_MANAGER },
|
|
147
|
+
{ check: exports.isAccessManaged, model: PermissionModel.ACCESS_MANAGED }
|
|
148
|
+
];
|
|
180
149
|
const models = [];
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
}
|
|
187
|
-
if (await (0, exports.isAccessManager)(address)) {
|
|
188
|
-
models.push(PermissionModel.ACCESS_MANAGER);
|
|
189
|
-
}
|
|
190
|
-
if (await (0, exports.isAccessManaged)(address)) {
|
|
191
|
-
models.push(PermissionModel.ACCESS_MANAGED);
|
|
192
|
-
}
|
|
150
|
+
// Change to await in loop if rate-limiting becomes an issue
|
|
151
|
+
await Promise.all(checks.map(async ({ check, model }) => {
|
|
152
|
+
if (await check(address)) {
|
|
153
|
+
models.push(model);
|
|
154
|
+
}
|
|
155
|
+
}));
|
|
193
156
|
if (models.includes(PermissionModel.ACCESS_MANAGER) && models.includes(PermissionModel.ROLE_BASED)) {
|
|
194
157
|
throw new Error(`Address ${address} cannot be both ACCESS_MANAGER and ROLE_BASED permission models.`);
|
|
195
158
|
}
|
|
196
159
|
return models;
|
|
197
160
|
};
|
|
198
161
|
exports.getPermissionModels = getPermissionModels;
|
|
162
|
+
const grantAccessManagerRole = async (contractAddress, role, newAccount, oldAccount
|
|
163
|
+
// eslint-disable-next-line max-params
|
|
164
|
+
) => {
|
|
165
|
+
const contract = new ethers_1.Contract(contractAddress, constants_1.ACCESS_MANAGER_ABI, hardhat_1.ethers.provider);
|
|
166
|
+
// If new account already has role or old account never had it in the first place - no action
|
|
167
|
+
if (await contract.hasRole(role, newAccount) || !await contract.hasRole(role, oldAccount)) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
if (!await contract.hasRole(ZERO, oldAccount)) {
|
|
171
|
+
// Currently we do not support roleAdmins - must be ran by owner
|
|
172
|
+
throw new Error(`Account ${oldAccount} does not have permission to grant roles on contract ${contractAddress}.`);
|
|
173
|
+
}
|
|
174
|
+
const data = contract.interface.encodeFunctionData("grantRole", [role, newAccount, ZERO]);
|
|
175
|
+
const transaction = new ethers_1.Transaction();
|
|
176
|
+
transaction.to = contractAddress;
|
|
177
|
+
transaction.data = data;
|
|
178
|
+
return transaction;
|
|
179
|
+
};
|
|
180
|
+
exports.grantAccessManagerRole = grantAccessManagerRole;
|
|
181
|
+
const renounceAccessManagerRole = async (contractAddress, role, oldAccount) => {
|
|
182
|
+
const contract = new ethers_1.Contract(contractAddress, constants_1.ACCESS_MANAGER_ABI, hardhat_1.ethers.provider);
|
|
183
|
+
if (!await contract.hasRole(role, oldAccount)) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
// Prevent revoking last role holder of default admin role
|
|
187
|
+
if (role === BigInt(ZERO) && (await contract.getRoleMemberCount(role)) < MIN_ROLE_HOLDERS) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
const data = contract.interface.encodeFunctionData("renounceRole", [role, oldAccount]);
|
|
191
|
+
const transaction = new ethers_1.Transaction();
|
|
192
|
+
transaction.to = contractAddress;
|
|
193
|
+
transaction.data = data;
|
|
194
|
+
return transaction;
|
|
195
|
+
};
|
|
196
|
+
exports.renounceAccessManagerRole = renounceAccessManagerRole;
|
|
199
197
|
//# sourceMappingURL=permission-utils.js.map
|
|
@@ -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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"}
|
|
@@ -8,11 +8,11 @@ export declare enum Pattern {
|
|
|
8
8
|
export declare const isContractAddress: (address: string) => Promise<boolean>;
|
|
9
9
|
export declare const extractAddressFromSlot: (slotValue: string) => string;
|
|
10
10
|
export declare const getAdminAddress: (address: string) => Promise<string>;
|
|
11
|
-
export declare const
|
|
11
|
+
export declare const getTUPPImplementationAddress: (address: string) => Promise<string>;
|
|
12
12
|
export declare const isTUPPPattern: (address: string) => Promise<boolean>;
|
|
13
|
+
export declare const hasFunctionSelector: (address: string, signature: string) => Promise<boolean>;
|
|
13
14
|
export declare const isBeaconPattern: (address: string) => Promise<boolean>;
|
|
14
15
|
export declare const identifyProxyPattern: (address: string) => Promise<Pattern>;
|
|
15
16
|
export declare const promptUserConfirmation: (message?: string) => Promise<boolean>;
|
|
16
17
|
export declare const detectPattern: (address: AddressLike) => Promise<Pattern>;
|
|
17
|
-
export declare const hasFunctionSelector: (address: string, signature: string) => Promise<boolean>;
|
|
18
18
|
export declare const removeDuplicateTransactions: (items: TransactionData[]) => TransactionData[];
|
|
@@ -3,7 +3,7 @@ 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.removeDuplicateTransactions = exports.
|
|
6
|
+
exports.removeDuplicateTransactions = exports.detectPattern = exports.promptUserConfirmation = exports.identifyProxyPattern = exports.isBeaconPattern = exports.hasFunctionSelector = exports.isTUPPPattern = exports.getTUPPImplementationAddress = exports.getAdminAddress = exports.extractAddressFromSlot = exports.isContractAddress = exports.Pattern = void 0;
|
|
7
7
|
// Cspell:words TUPP
|
|
8
8
|
const constants_1 = require("./constants");
|
|
9
9
|
const chalk_1 = __importDefault(require("chalk"));
|
|
@@ -35,17 +35,17 @@ const getAdminAddress = async (address) => {
|
|
|
35
35
|
return (0, exports.extractAddressFromSlot)(adminSlotValue);
|
|
36
36
|
};
|
|
37
37
|
exports.getAdminAddress = getAdminAddress;
|
|
38
|
-
const
|
|
38
|
+
const getTUPPImplementationAddress = async (address) => {
|
|
39
39
|
const implementationSlotValue = await hardhat_1.ethers.provider.getStorage(address, constants_1.ERC1967_IMPLEMENTATION_SLOT);
|
|
40
40
|
return (0, exports.extractAddressFromSlot)(implementationSlotValue);
|
|
41
41
|
};
|
|
42
|
-
exports.
|
|
42
|
+
exports.getTUPPImplementationAddress = getTUPPImplementationAddress;
|
|
43
43
|
const validateTUPPProxy = async (proxyAddress, adminAddress) => {
|
|
44
44
|
const isAdminContract = await (0, exports.isContractAddress)(adminAddress);
|
|
45
45
|
if (!isAdminContract) {
|
|
46
46
|
return false;
|
|
47
47
|
}
|
|
48
|
-
const implementationAddress = await (0, exports.
|
|
48
|
+
const implementationAddress = await (0, exports.getTUPPImplementationAddress)(proxyAddress);
|
|
49
49
|
return implementationAddress !== hardhat_1.ethers.ZeroAddress && await (0, exports.isContractAddress)(implementationAddress);
|
|
50
50
|
};
|
|
51
51
|
/*
|
|
@@ -65,6 +65,26 @@ const isTUPPPattern = async (address) => {
|
|
|
65
65
|
}
|
|
66
66
|
};
|
|
67
67
|
exports.isTUPPPattern = isTUPPPattern;
|
|
68
|
+
const resolveImplementationAddress = async (address) => {
|
|
69
|
+
if (await (0, exports.isTUPPPattern)(address)) {
|
|
70
|
+
return (0, exports.getTUPPImplementationAddress)(address);
|
|
71
|
+
}
|
|
72
|
+
// Beacon not required because we only change upgradeability ownership - on UpgradeableBeacon
|
|
73
|
+
return address;
|
|
74
|
+
};
|
|
75
|
+
const hasFunctionSelector = async (address, signature) => {
|
|
76
|
+
const iface = new hardhat_1.ethers.Interface([`function ${signature}`]);
|
|
77
|
+
const toSlice = "0x".length;
|
|
78
|
+
const selector = iface.getFunction(signature)?.selector.slice(toSlice).toLowerCase();
|
|
79
|
+
if (!selector) {
|
|
80
|
+
throw new Error(`Invalid function signature: ${signature}`);
|
|
81
|
+
}
|
|
82
|
+
const implementationAddress = await resolveImplementationAddress(address);
|
|
83
|
+
const bytecode = (await hardhat_1.ethers.provider.getCode(implementationAddress)).toLowerCase();
|
|
84
|
+
// May very rarely cause false positives - But user verifies findings
|
|
85
|
+
return bytecode.includes(selector);
|
|
86
|
+
};
|
|
87
|
+
exports.hasFunctionSelector = hasFunctionSelector;
|
|
68
88
|
/*
|
|
69
89
|
* Checks if the contract follows the Beacon Proxy Pattern.
|
|
70
90
|
* A Beacon proxy has a beacon address in the ERC1967 beacon slot,
|
|
@@ -72,20 +92,14 @@ exports.isTUPPPattern = isTUPPPattern;
|
|
|
72
92
|
*/
|
|
73
93
|
const isBeaconPattern = async (address) => {
|
|
74
94
|
try {
|
|
75
|
-
// Check beacon slot
|
|
76
|
-
const beaconSlotValue = await hardhat_1.ethers.provider.getStorage(address, constants_1.ERC1967_BEACON_SLOT);
|
|
77
|
-
const beaconAddress = (0, exports.extractAddressFromSlot)(beaconSlotValue);
|
|
78
|
-
if (beaconAddress === hardhat_1.ethers.ZeroAddress) {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
95
|
const contract = new hardhat_1.ethers.Contract(address, constants_1.basicBeaconAbi, hardhat_1.ethers.provider);
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
]);
|
|
96
|
+
const implementation = await contract.implementation();
|
|
97
|
+
const owner = await contract.owner();
|
|
98
|
+
const interfaceHasUpgradeTo = await (0, exports.hasFunctionSelector)(address, "upgradeTo(address)");
|
|
86
99
|
return owner !== hardhat_1.ethers.ZeroAddress &&
|
|
87
|
-
implementation
|
|
88
|
-
await (0, exports.isContractAddress)(implementation)
|
|
100
|
+
implementation !== hardhat_1.ethers.ZeroAddress &&
|
|
101
|
+
await (0, exports.isContractAddress)(implementation) &&
|
|
102
|
+
interfaceHasUpgradeTo;
|
|
89
103
|
}
|
|
90
104
|
catch {
|
|
91
105
|
return false;
|
|
@@ -148,29 +162,6 @@ const detectPattern = async (address) => {
|
|
|
148
162
|
}
|
|
149
163
|
};
|
|
150
164
|
exports.detectPattern = detectPattern;
|
|
151
|
-
const hasFunctionSelector = async (address, signature) => {
|
|
152
|
-
const iface = new hardhat_1.ethers.Interface([`function ${signature}`]);
|
|
153
|
-
const { selector } = iface.getFunction(signature) || {};
|
|
154
|
-
if (!selector) {
|
|
155
|
-
throw new Error(`Invalid function signature: ${signature}`);
|
|
156
|
-
}
|
|
157
|
-
try {
|
|
158
|
-
// Empty arguments used — we just want to test if the selector is valid
|
|
159
|
-
const result = await hardhat_1.ethers.provider.call({
|
|
160
|
-
data: selector,
|
|
161
|
-
to: address
|
|
162
|
-
});
|
|
163
|
-
if (result === "0x") {
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
catch (err) {
|
|
169
|
-
// Reverted = function exists, but call params invalid
|
|
170
|
-
return true;
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
exports.hasFunctionSelector = hasFunctionSelector;
|
|
174
165
|
const removeDuplicateTransactions = (items) => {
|
|
175
166
|
const seen = new Set();
|
|
176
167
|
return items.filter((item) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/utils.ts"],"names":[],"mappings":";;;;;;AAAA,oBAAoB;AACpB,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/utils.ts"],"names":[],"mappings":"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"}
|