@skalenetwork/upgrade-tools 4.0.0-ownership-helpers.11 → 4.0.0-ownership-helpers.12
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 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/ownership-transfer/contractAdmin.d.ts +44 -0
- package/dist/src/ownership-transfer/contractAdmin.js +149 -0
- package/dist/src/ownership-transfer/contractAdmin.js.map +1 -0
- package/dist/src/ownership-transfer/instanceAdmin.d.ts +41 -0
- package/dist/src/ownership-transfer/instanceAdmin.js +225 -0
- package/dist/src/ownership-transfer/instanceAdmin.js.map +1 -0
- package/dist/src/ownership-transfer/permission-utils.d.ts +2 -2
- package/dist/src/ownership-transfer/permission-utils.js +2 -2
- package/dist/src/ownership-transfer/permission-utils.js.map +1 -1
- package/dist/src/ownership-transfer/utils.d.ts +2 -0
- package/dist/src/ownership-transfer/utils.js +17 -1
- package/dist/src/ownership-transfer/utils.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/ownership-transfer/ownershipAdmin.d.ts +0 -51
- package/dist/src/ownership-transfer/ownershipAdmin.js +0 -361
- package/dist/src/ownership-transfer/ownershipAdmin.js.map +0 -1
package/dist/src/index.d.ts
CHANGED
|
@@ -8,4 +8,4 @@ export * from "./version";
|
|
|
8
8
|
export * from "./upgrader";
|
|
9
9
|
export * from "./upgraders/abstractTransparentProxyUpgrader";
|
|
10
10
|
export * from "./upgraders/beaconUpgrader";
|
|
11
|
-
export * from "./ownership-transfer/
|
|
11
|
+
export * from "./ownership-transfer/instanceAdmin";
|
package/dist/src/index.js
CHANGED
|
@@ -24,5 +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/
|
|
27
|
+
__exportStar(require("./ownership-transfer/instanceAdmin"), exports);
|
|
28
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;AAC1C,
|
|
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,qEAAmD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Pattern } from "./utils";
|
|
2
|
+
import { PermissionModel } from "./permission-utils";
|
|
3
|
+
import { Transaction } from "ethers";
|
|
4
|
+
export interface BytesRole {
|
|
5
|
+
name: string;
|
|
6
|
+
identifier: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ContractMetadataDetails {
|
|
9
|
+
name: string;
|
|
10
|
+
pattern: Pattern;
|
|
11
|
+
address: string;
|
|
12
|
+
permissionModel?: PermissionModel[];
|
|
13
|
+
}
|
|
14
|
+
export interface TransactionData {
|
|
15
|
+
transaction: Transaction;
|
|
16
|
+
description?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class ContractAdmin {
|
|
19
|
+
contractName: string;
|
|
20
|
+
pattern: Pattern;
|
|
21
|
+
address: string;
|
|
22
|
+
permissionModel: PermissionModel[];
|
|
23
|
+
private grantOwnershipRoleTxs;
|
|
24
|
+
private revokeOwnershipTxs;
|
|
25
|
+
constructor(details: ContractMetadataDetails);
|
|
26
|
+
createGrantOwnershipTransactions(oldOwner: string, newOwner: string, bytes32RolesToCheck: BytesRole[]): Promise<void>;
|
|
27
|
+
createRevokeOwnershipTransactions(oldOwner: string, newOwner: string, bytes32RolesToCheck: BytesRole[]): Promise<void>;
|
|
28
|
+
getGrantOwnershipTransactions(): TransactionData[];
|
|
29
|
+
getRevokeOwnershipTransactions(): TransactionData[];
|
|
30
|
+
clearRevokeTransactions(): void;
|
|
31
|
+
clearGrantTransactions(): void;
|
|
32
|
+
requiresOwnershipGranting(): boolean;
|
|
33
|
+
requiresOwnershipRevoking(): boolean;
|
|
34
|
+
displayData(columnWidths: {
|
|
35
|
+
maxNameWidth: number;
|
|
36
|
+
maxAddressWidth: number;
|
|
37
|
+
maxPermissionsWidth: number;
|
|
38
|
+
}): void;
|
|
39
|
+
private createTUPPGrantOwnershipTransaction;
|
|
40
|
+
private createOwnableOwnershipTransaction;
|
|
41
|
+
private createAssignBytes32RolesTransactions;
|
|
42
|
+
private createRevokeBytes32RolesTransactions;
|
|
43
|
+
private isDuplicateTransaction;
|
|
44
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
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.ContractAdmin = void 0;
|
|
7
|
+
// Cspell:words TUPP
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
const permission_utils_1 = require("./permission-utils");
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
class ContractAdmin {
|
|
12
|
+
constructor(details) {
|
|
13
|
+
this.permissionModel = [];
|
|
14
|
+
this.grantOwnershipRoleTxs = [];
|
|
15
|
+
this.revokeOwnershipTxs = [];
|
|
16
|
+
this.contractName = details.name;
|
|
17
|
+
this.pattern = details.pattern;
|
|
18
|
+
this.address = details.address;
|
|
19
|
+
this.permissionModel = details.permissionModel ?? [];
|
|
20
|
+
}
|
|
21
|
+
async createGrantOwnershipTransactions(oldOwner, newOwner, bytes32RolesToCheck) {
|
|
22
|
+
if (!this.grantOwnershipRoleTxs.length) {
|
|
23
|
+
console.log(chalk_1.default.white(`* Creating Transactions to grant Ownership in ${this.contractName}.`));
|
|
24
|
+
if (this.pattern === utils_1.Pattern.TUPP) {
|
|
25
|
+
await this.createTUPPGrantOwnershipTransaction(oldOwner, newOwner);
|
|
26
|
+
}
|
|
27
|
+
if (this.permissionModel.includes(permission_utils_1.PermissionModel.OWNABLE)) {
|
|
28
|
+
await this.createOwnableOwnershipTransaction(oldOwner, newOwner);
|
|
29
|
+
}
|
|
30
|
+
if (this.permissionModel.includes(permission_utils_1.PermissionModel.ROLE_BASED)) {
|
|
31
|
+
await this.createAssignBytes32RolesTransactions(oldOwner, newOwner, bytes32RolesToCheck);
|
|
32
|
+
}
|
|
33
|
+
if (this.permissionModel.includes(permission_utils_1.PermissionModel.ACCESS_MANAGER)) {
|
|
34
|
+
console.log(chalk_1.default.yellow("Not implemented yet: Access Manager role assignments."));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async createRevokeOwnershipTransactions(oldOwner, newOwner, bytes32RolesToCheck) {
|
|
39
|
+
if (this.revokeOwnershipTxs.length) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
console.log(chalk_1.default.white(`* Creating Transactions to revoke Ownership in ${this.contractName}.`));
|
|
43
|
+
if (this.permissionModel.includes(permission_utils_1.PermissionModel.ROLE_BASED)) {
|
|
44
|
+
await this.createRevokeBytes32RolesTransactions(oldOwner, newOwner, bytes32RolesToCheck);
|
|
45
|
+
}
|
|
46
|
+
if (this.permissionModel.includes(permission_utils_1.PermissionModel.ACCESS_MANAGER)) {
|
|
47
|
+
console.log(chalk_1.default.yellow("Not implemented yet: Access Manager role revocations."));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
getGrantOwnershipTransactions() {
|
|
51
|
+
return this.grantOwnershipRoleTxs;
|
|
52
|
+
}
|
|
53
|
+
getRevokeOwnershipTransactions() {
|
|
54
|
+
return this.revokeOwnershipTxs;
|
|
55
|
+
}
|
|
56
|
+
clearRevokeTransactions() {
|
|
57
|
+
this.revokeOwnershipTxs = [];
|
|
58
|
+
}
|
|
59
|
+
clearGrantTransactions() {
|
|
60
|
+
this.grantOwnershipRoleTxs = [];
|
|
61
|
+
}
|
|
62
|
+
requiresOwnershipGranting() {
|
|
63
|
+
return Boolean(this.grantOwnershipRoleTxs.length);
|
|
64
|
+
}
|
|
65
|
+
requiresOwnershipRevoking() {
|
|
66
|
+
return Boolean(this.revokeOwnershipTxs.length);
|
|
67
|
+
}
|
|
68
|
+
displayData(columnWidths) {
|
|
69
|
+
const { maxNameWidth, maxAddressWidth, maxPermissionsWidth } = columnWidths;
|
|
70
|
+
const name = this.contractName.padEnd(maxNameWidth);
|
|
71
|
+
const address = this.address.padEnd(maxAddressWidth);
|
|
72
|
+
const permissions = (this.permissionModel?.join(", ") || "None").padEnd(maxPermissionsWidth);
|
|
73
|
+
let status = chalk_1.default.green("ALL DONE");
|
|
74
|
+
if (this.grantOwnershipRoleTxs.length) {
|
|
75
|
+
status = chalk_1.default.yellow("GRANT OWNERSHIP REQUIRED");
|
|
76
|
+
}
|
|
77
|
+
else if (this.revokeOwnershipTxs.length) {
|
|
78
|
+
status = chalk_1.default.yellow("REVOKE ROLES REQUIRED");
|
|
79
|
+
}
|
|
80
|
+
console.log(chalk_1.default.gray(` ${name} ${address} ${permissions} `) + status);
|
|
81
|
+
}
|
|
82
|
+
// TODO: Handle case where 1 proxy admin manages multiple proxies
|
|
83
|
+
async createTUPPGrantOwnershipTransaction(oldOwner, newOwner) {
|
|
84
|
+
const admin = await (0, utils_1.getAdminAddress)(this.address);
|
|
85
|
+
await this.createOwnableOwnershipTransaction(oldOwner, newOwner, { address: admin, name: `${this.contractName} Proxy Admin` });
|
|
86
|
+
}
|
|
87
|
+
async createOwnableOwnershipTransaction(oldOwner, newOwner, contractId = { address: this.address, name: this.contractName }) {
|
|
88
|
+
const tx = await (0, permission_utils_1.transferOwnership)(contractId.address, newOwner, oldOwner);
|
|
89
|
+
if (tx) {
|
|
90
|
+
if (this.isDuplicateTransaction({ transaction: tx })) {
|
|
91
|
+
// Shares proxy admin with another contract - tx already created
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const description = `-> Tx to change ${contractId.name} Owner at ${contractId.address} to ${newOwner}`;
|
|
95
|
+
console.log(chalk_1.default.yellow(` ${description} created.`));
|
|
96
|
+
this.grantOwnershipRoleTxs.push({
|
|
97
|
+
description,
|
|
98
|
+
transaction: tx
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async createAssignBytes32RolesTransactions(oldOwner, newOwner, bytes32RolesToCheck) {
|
|
103
|
+
for (const role of bytes32RolesToCheck) {
|
|
104
|
+
// eslint-disable-next-line no-await-in-loop
|
|
105
|
+
const tx = await (0, permission_utils_1.grantRole)(this.address, role.identifier, newOwner, oldOwner);
|
|
106
|
+
if (tx) {
|
|
107
|
+
if (this.isDuplicateTransaction({ transaction: tx })) {
|
|
108
|
+
// Unexpected - better check
|
|
109
|
+
throw new Error(`Error: Transaction to grant role ${role} in ${this.contractName} was already created.`);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const description = `-> Tx to grant role ${role.name} to ${newOwner} in ${this.contractName}`;
|
|
113
|
+
console.log(chalk_1.default.yellow(` ${description} created.`));
|
|
114
|
+
this.grantOwnershipRoleTxs.push({ description, transaction: tx });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async createRevokeBytes32RolesTransactions(oldOwner, newOwner, bytes32RolesToCheck) {
|
|
120
|
+
for (const role of bytes32RolesToCheck) {
|
|
121
|
+
// Required to process sequentially due to order of transactions - 0x00 role last
|
|
122
|
+
// eslint-disable-next-line no-await-in-loop
|
|
123
|
+
const tx = await (0, permission_utils_1.revokeRole)(this.address, role.identifier, oldOwner);
|
|
124
|
+
if (typeof tx !== "boolean" && tx) {
|
|
125
|
+
if (this.isDuplicateTransaction({ transaction: tx })) {
|
|
126
|
+
// Unexpected - better check
|
|
127
|
+
throw new Error(`Error: Transaction to revoke role ${role} in ${this.contractName} was already created.`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const description = `-> Tx to revoke role ${role.name} from ${oldOwner} in ${this.contractName}`;
|
|
131
|
+
console.log(chalk_1.default.yellow(` ${description} created.`));
|
|
132
|
+
this.revokeOwnershipTxs.push({ description, transaction: tx });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else if (!tx) {
|
|
136
|
+
console.log(chalk_1.default.yellow(` WARNING: Skipping revocation of role ${role.name} in ${this.contractName} as it requires at least 1 member left.`));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
isDuplicateTransaction(transaction) {
|
|
141
|
+
const isGrantDuplicate = this.grantOwnershipRoleTxs.some((existingTx) => existingTx.transaction.to === transaction.transaction.to &&
|
|
142
|
+
existingTx.transaction.data === transaction.transaction.data);
|
|
143
|
+
const isRevokeDuplicate = this.revokeOwnershipTxs.some((existingTx) => existingTx.transaction.to === transaction.transaction.to &&
|
|
144
|
+
existingTx.transaction.data === transaction.transaction.data);
|
|
145
|
+
return isGrantDuplicate || isRevokeDuplicate;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.ContractAdmin = ContractAdmin;
|
|
149
|
+
//# sourceMappingURL=contractAdmin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractAdmin.js","sourceRoot":"","sources":["../../../src/ownership-transfer/contractAdmin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
revokeRoles: boolean;
|
|
7
|
+
newOwner: string;
|
|
8
|
+
readonly: boolean;
|
|
9
|
+
rolesToCheck?: string[];
|
|
10
|
+
managerRolesToCheck?: number[];
|
|
11
|
+
}
|
|
12
|
+
export declare class InstanceAdmin {
|
|
13
|
+
private instance;
|
|
14
|
+
private contractMetadata;
|
|
15
|
+
private contractNames;
|
|
16
|
+
private bytes32RolesToCheck;
|
|
17
|
+
private managerRolesToCheck;
|
|
18
|
+
private oldOwner;
|
|
19
|
+
private newOwner;
|
|
20
|
+
private readonly;
|
|
21
|
+
private submitter;
|
|
22
|
+
private revokeRoles;
|
|
23
|
+
constructor(instance: Instance, contractNames: string[], options: InstanceAdminOptions);
|
|
24
|
+
private initialize;
|
|
25
|
+
private processGrantStepIfRequired;
|
|
26
|
+
private processRevokeStepIfRequired;
|
|
27
|
+
executeOwnershipTransfer(): Promise<void>;
|
|
28
|
+
private submitRevokeRolesTransactions;
|
|
29
|
+
private submitGrantOwnershipTransactions;
|
|
30
|
+
private ownershipGrantingRequired;
|
|
31
|
+
private ownershipRevokingRequired;
|
|
32
|
+
private loadContractMetadataAndCreateTransactions;
|
|
33
|
+
private confirmData;
|
|
34
|
+
private processOptions;
|
|
35
|
+
private createRequiredTransactions;
|
|
36
|
+
private getColumnWidths;
|
|
37
|
+
private displayPatternGroup;
|
|
38
|
+
private displayFindings;
|
|
39
|
+
private handleUserRejection;
|
|
40
|
+
private groupMetadataByPattern;
|
|
41
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Cspell:words keccak
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.InstanceAdmin = void 0;
|
|
8
|
+
const contractAdmin_1 = require("./contractAdmin");
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
const hardhat_1 = require("hardhat");
|
|
12
|
+
const permission_utils_1 = require("./permission-utils");
|
|
13
|
+
const ZERO = 0;
|
|
14
|
+
class InstanceAdmin {
|
|
15
|
+
constructor(instance, contractNames, options) {
|
|
16
|
+
this.contractMetadata = new Map();
|
|
17
|
+
this.bytes32RolesToCheck = [];
|
|
18
|
+
this.managerRolesToCheck = [];
|
|
19
|
+
this.instance = instance;
|
|
20
|
+
this.contractNames = contractNames;
|
|
21
|
+
this.processOptions(options);
|
|
22
|
+
}
|
|
23
|
+
async initialize() {
|
|
24
|
+
await this.loadContractMetadataAndCreateTransactions();
|
|
25
|
+
await this.confirmData();
|
|
26
|
+
}
|
|
27
|
+
async processGrantStepIfRequired() {
|
|
28
|
+
if (this.ownershipGrantingRequired()) {
|
|
29
|
+
await this.submitGrantOwnershipTransactions();
|
|
30
|
+
// TODO: Create step to wait for txs to be confirmed in case of Multisig submitter
|
|
31
|
+
if (this.revokeRoles) {
|
|
32
|
+
await this.createRequiredTransactions();
|
|
33
|
+
}
|
|
34
|
+
await this.confirmData();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async processRevokeStepIfRequired() {
|
|
38
|
+
if (this.revokeRoles && this.ownershipRevokingRequired() === true) {
|
|
39
|
+
await this.submitRevokeRolesTransactions();
|
|
40
|
+
// TODO: Create step to wait for txs to be confirmed in case of Multisig submitter
|
|
41
|
+
await this.createRequiredTransactions();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async executeOwnershipTransfer() {
|
|
45
|
+
// Confirm data found in initialization
|
|
46
|
+
await this.initialize();
|
|
47
|
+
if (this.readonly) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
await this.processGrantStepIfRequired();
|
|
51
|
+
await this.processRevokeStepIfRequired();
|
|
52
|
+
this.displayFindings();
|
|
53
|
+
if (this.ownershipGrantingRequired() || this.ownershipRevokingRequired() && this.revokeRoles) {
|
|
54
|
+
console.error(chalk_1.default.red("Unexpected state: There are still actions requires."));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.log(chalk_1.default.green("Ownership transfer process completed. - Nothing more to do."));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// eslint-disable-next-line max-statements
|
|
61
|
+
async submitRevokeRolesTransactions() {
|
|
62
|
+
const txsToSubmit = [];
|
|
63
|
+
for (const contract of this.contractMetadata.values()) {
|
|
64
|
+
const revokeTxs = contract.getRevokeOwnershipTransactions();
|
|
65
|
+
txsToSubmit.push(...revokeTxs);
|
|
66
|
+
contract.clearRevokeTransactions();
|
|
67
|
+
}
|
|
68
|
+
console.log(chalk_1.default.green(`Submitting ${txsToSubmit.length} revoke ownership transactions...`));
|
|
69
|
+
for (const [index, txData] of txsToSubmit.entries()) {
|
|
70
|
+
console.log(chalk_1.default.grey(` -> Transaction ${index}: ${txData.description || "No description"}`));
|
|
71
|
+
}
|
|
72
|
+
const confirmation = await (0, utils_1.promptUserConfirmation)("Do you want to proceed with submitting these transactions?");
|
|
73
|
+
if (!confirmation) {
|
|
74
|
+
throw new Error("Transaction submission aborted by user.");
|
|
75
|
+
}
|
|
76
|
+
await this.submitter.submit(txsToSubmit.map(tx => tx.transaction));
|
|
77
|
+
}
|
|
78
|
+
// eslint-disable-next-line max-statements
|
|
79
|
+
async submitGrantOwnershipTransactions() {
|
|
80
|
+
const txsToSubmit = [];
|
|
81
|
+
for (const contract of this.contractMetadata.values()) {
|
|
82
|
+
const grantTxs = contract.getGrantOwnershipTransactions();
|
|
83
|
+
txsToSubmit.push(...grantTxs);
|
|
84
|
+
contract.clearGrantTransactions();
|
|
85
|
+
}
|
|
86
|
+
// Required for ProxyAdmins shared among multiple contracts
|
|
87
|
+
const txsToSubmitFiltered = (0, utils_1.removeDuplicateTransactions)(txsToSubmit);
|
|
88
|
+
console.log(chalk_1.default.green(`Submitting ${txsToSubmitFiltered.length} unique grant ownership transactions...`));
|
|
89
|
+
for (const [index, txData] of txsToSubmitFiltered.entries()) {
|
|
90
|
+
console.log(chalk_1.default.grey(` -> Transaction ${index}: ${txData.description || "No description"}`));
|
|
91
|
+
}
|
|
92
|
+
const confirmation = await (0, utils_1.promptUserConfirmation)("Do you want to proceed with submitting these transactions?");
|
|
93
|
+
if (!confirmation) {
|
|
94
|
+
throw new Error("Transaction submission aborted by user.");
|
|
95
|
+
}
|
|
96
|
+
await this.submitter.submit(txsToSubmitFiltered.map(tx => tx.transaction));
|
|
97
|
+
}
|
|
98
|
+
ownershipGrantingRequired() {
|
|
99
|
+
return Array.from(this.contractMetadata.values()).some(contract => contract.requiresOwnershipGranting());
|
|
100
|
+
}
|
|
101
|
+
ownershipRevokingRequired() {
|
|
102
|
+
return Array.from(this.contractMetadata.values()).some(contract => contract.requiresOwnershipRevoking());
|
|
103
|
+
}
|
|
104
|
+
async loadContractMetadataAndCreateTransactions() {
|
|
105
|
+
/* eslint-disable no-await-in-loop */
|
|
106
|
+
// Do not parallelize to avoid rate limit issues which CAN produce wrong outputs
|
|
107
|
+
for (const contractName of this.contractNames) {
|
|
108
|
+
/*
|
|
109
|
+
* We use getContractAddress to not depend on downloaded ABI artifacts
|
|
110
|
+
* all ABIs are checked locally
|
|
111
|
+
*/
|
|
112
|
+
const address = await this.instance.getContractAddress(contractName);
|
|
113
|
+
if (!this.contractMetadata.has(address)) {
|
|
114
|
+
const pattern = await (0, utils_1.detectPattern)(address);
|
|
115
|
+
const details = {
|
|
116
|
+
address,
|
|
117
|
+
name: contractName,
|
|
118
|
+
pattern,
|
|
119
|
+
permissionModel: await (0, permission_utils_1.getPermissionModels)(address)
|
|
120
|
+
};
|
|
121
|
+
this.contractMetadata.set(address, new contractAdmin_1.ContractAdmin(details));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/* eslint-enable no-await-in-loop */
|
|
125
|
+
await this.createRequiredTransactions();
|
|
126
|
+
}
|
|
127
|
+
async confirmData() {
|
|
128
|
+
this.displayFindings();
|
|
129
|
+
const userConfirmed = await (0, utils_1.promptUserConfirmation)();
|
|
130
|
+
if (!userConfirmed) {
|
|
131
|
+
this.handleUserRejection();
|
|
132
|
+
}
|
|
133
|
+
console.log(chalk_1.default.green("\nUser confirmed. Proceeding...\n"));
|
|
134
|
+
}
|
|
135
|
+
// By 1
|
|
136
|
+
// eslint-disable-next-line max-statements
|
|
137
|
+
processOptions(options) {
|
|
138
|
+
// If true, does not allow to send transactions to blockchain
|
|
139
|
+
this.readonly = options.readonly;
|
|
140
|
+
this.newOwner = options.newOwner;
|
|
141
|
+
this.bytes32RolesToCheck = (options.rolesToCheck ?? []).map(role => ({
|
|
142
|
+
identifier: hardhat_1.ethers.id(role),
|
|
143
|
+
name: role
|
|
144
|
+
}));
|
|
145
|
+
this.submitter = options.submitter;
|
|
146
|
+
// Always have DEFAULT_ADMIN_ROLE at the end!
|
|
147
|
+
this.bytes32RolesToCheck.push({ identifier: hardhat_1.ethers.ZeroHash, name: "DEFAULT_ADMIN_ROLE" });
|
|
148
|
+
if (!this.readonly && this.newOwner === hardhat_1.ethers.ZeroAddress) {
|
|
149
|
+
throw new Error("New owner address must be provided in options when in write mode.");
|
|
150
|
+
}
|
|
151
|
+
this.managerRolesToCheck = (options.managerRolesToCheck ?? []).map(role => {
|
|
152
|
+
if (typeof role !== "number" || !Number.isInteger(role) || role < ZERO) {
|
|
153
|
+
throw new Error(`Invalid manager role: ${role}. Must be a non-negative integer.`);
|
|
154
|
+
}
|
|
155
|
+
return { identifier: role, name: `Role ${role}` };
|
|
156
|
+
});
|
|
157
|
+
// Always have ADMIN_ROLE at the end!
|
|
158
|
+
this.managerRolesToCheck.push({ identifier: ZERO, name: "ADMIN_ROLE" });
|
|
159
|
+
this.oldOwner = options.oldOwner;
|
|
160
|
+
this.revokeRoles = options.revokeRoles;
|
|
161
|
+
}
|
|
162
|
+
async createRequiredTransactions() {
|
|
163
|
+
// Clear previous transactions
|
|
164
|
+
console.log(chalk_1.default.grey("INFO: The next Following steps will NOT submit any transactions to the blockchain."));
|
|
165
|
+
// Required to be processed sequentially - `performance` is not an issue here
|
|
166
|
+
/* eslint-disable no-await-in-loop */
|
|
167
|
+
for (const contract of this.contractMetadata.values()) {
|
|
168
|
+
await contract.createGrantOwnershipTransactions(this.oldOwner, this.newOwner, this.bytes32RolesToCheck
|
|
169
|
+
//TODO: this.managerRolesToCheck
|
|
170
|
+
);
|
|
171
|
+
if (!contract.requiresOwnershipGranting()) {
|
|
172
|
+
await contract.createRevokeOwnershipTransactions(this.oldOwner, this.newOwner, this.bytes32RolesToCheck);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/* eslint-enable no-await-in-loop */
|
|
176
|
+
}
|
|
177
|
+
getColumnWidths() {
|
|
178
|
+
let maxNameWidth = 0;
|
|
179
|
+
let maxAddressWidth = 0;
|
|
180
|
+
let maxPermissionsWidth = 0;
|
|
181
|
+
for (const contract of this.contractMetadata.values()) {
|
|
182
|
+
maxNameWidth = Math.max(maxNameWidth, contract.contractName.length);
|
|
183
|
+
maxAddressWidth = Math.max(maxAddressWidth, contract.address.length);
|
|
184
|
+
const permissions = contract.permissionModel?.join(", ") || "None";
|
|
185
|
+
maxPermissionsWidth = Math.max(maxPermissionsWidth, permissions.length);
|
|
186
|
+
}
|
|
187
|
+
return { maxAddressWidth, maxNameWidth, maxPermissionsWidth };
|
|
188
|
+
}
|
|
189
|
+
// eslint-disable-next-line max-statements
|
|
190
|
+
displayPatternGroup(pattern, contracts) {
|
|
191
|
+
const columnWidths = this.getColumnWidths();
|
|
192
|
+
console.log(chalk_1.default.bold(`\n${pattern} Pattern (${contracts.length} contracts):`));
|
|
193
|
+
for (const contract of contracts) {
|
|
194
|
+
contract.displayData(columnWidths);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
displayFindings() {
|
|
198
|
+
console.log(chalk_1.default.cyan("\n=== Ownership Status Results ===\n"));
|
|
199
|
+
const groupedByPattern = this.groupMetadataByPattern();
|
|
200
|
+
for (const [pattern, contracts] of Object.entries(groupedByPattern)) {
|
|
201
|
+
if (contracts.length) {
|
|
202
|
+
this.displayPatternGroup(pattern, contracts);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
console.log(chalk_1.default.cyan("\n==========================================\n"));
|
|
206
|
+
}
|
|
207
|
+
handleUserRejection() {
|
|
208
|
+
console.log(chalk_1.default.red("User did not confirm. Aborting and clearing all data..."));
|
|
209
|
+
this.contractMetadata.clear();
|
|
210
|
+
throw new Error("User aborted because some data was inaccurate. Data has been cleared.");
|
|
211
|
+
}
|
|
212
|
+
groupMetadataByPattern() {
|
|
213
|
+
const grouped = Object.values(utils_1.Pattern).
|
|
214
|
+
reduce((acc, pattern) => {
|
|
215
|
+
acc[pattern] = [];
|
|
216
|
+
return acc;
|
|
217
|
+
}, {});
|
|
218
|
+
for (const metadata of this.contractMetadata.values()) {
|
|
219
|
+
grouped[metadata.pattern].push(metadata);
|
|
220
|
+
}
|
|
221
|
+
return grouped;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
exports.InstanceAdmin = InstanceAdmin;
|
|
225
|
+
//# 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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"}
|
|
@@ -13,7 +13,7 @@ export declare const tryGetMultiSigInfo: (contractAddress: string) => Promise<{
|
|
|
13
13
|
owners: string[] | null;
|
|
14
14
|
threshold: bigint | null;
|
|
15
15
|
}>;
|
|
16
|
-
export declare const transferOwnership: (contractAddress: string, newOwner: string, oldOwner: string) => Promise<Transaction |
|
|
17
|
-
export declare const grantRole: (contractAddress: string, role: string, newAccount: AddressLike, oldAccount: AddressLike) => Promise<Transaction |
|
|
16
|
+
export declare const transferOwnership: (contractAddress: string, newOwner: string, oldOwner: string) => Promise<Transaction | false>;
|
|
17
|
+
export declare const grantRole: (contractAddress: string, role: string, newAccount: AddressLike, oldAccount: AddressLike) => Promise<Transaction | false>;
|
|
18
18
|
export declare const revokeRole: (contractAddress: string, role: string, oldAccount: AddressLike) => Promise<Transaction | boolean>;
|
|
19
19
|
export declare const getPermissionModels: (address: AddressLike) => Promise<PermissionModel[]>;
|
|
@@ -217,7 +217,7 @@ exports.tryGetMultiSigInfo = tryGetMultiSigInfo;
|
|
|
217
217
|
const transferOwnership = async (contractAddress, newOwner, oldOwner) => {
|
|
218
218
|
const contract = new ethers_1.Contract(contractAddress, OWNABLE_ABI, hardhat_1.ethers.provider);
|
|
219
219
|
if (await contract.owner() === newOwner) {
|
|
220
|
-
return
|
|
220
|
+
return false;
|
|
221
221
|
}
|
|
222
222
|
if (await contract.owner() !== oldOwner) {
|
|
223
223
|
throw new Error(`Current owner of contract ${contractAddress} does not match the provided old owner address.`);
|
|
@@ -249,7 +249,7 @@ const grantRole = async (contractAddress, role, newAccount, oldAccount
|
|
|
249
249
|
* Check if the account already has the role OR if the oldAccount does not have it - no action
|
|
250
250
|
*/
|
|
251
251
|
if (await contract.hasRole(role, newAccount) || !await contract.hasRole(role, oldAccount)) {
|
|
252
|
-
return
|
|
252
|
+
return false;
|
|
253
253
|
}
|
|
254
254
|
if (!await contract.hasRole(hardhat_1.ethers.ZeroHash, oldAccount)) {
|
|
255
255
|
throw new Error(`Account ${oldAccount} does not have permission to grant roles on contract ${contractAddress}.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission-utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/permission-utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"permission-utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/permission-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AddressLike } from "ethers";
|
|
2
|
+
import { TransactionData } from "./contractAdmin";
|
|
2
3
|
export declare enum Pattern {
|
|
3
4
|
TUPP = "TUPP",
|
|
4
5
|
BEACON = "BEACON",
|
|
@@ -14,3 +15,4 @@ export declare const identifyProxyPattern: (address: string) => Promise<Pattern>
|
|
|
14
15
|
export declare const promptUserConfirmation: (message?: string) => Promise<boolean>;
|
|
15
16
|
export declare const detectPattern: (address: AddressLike) => Promise<Pattern>;
|
|
16
17
|
export declare const hasFunctionSelector: (address: string, signature: string) => Promise<boolean>;
|
|
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.hasFunctionSelector = exports.detectPattern = exports.promptUserConfirmation = exports.identifyProxyPattern = exports.isBeaconPattern = exports.isTUPPPattern = exports.getImplementationAddress = exports.getAdminAddress = exports.extractAddressFromSlot = exports.isContractAddress = exports.Pattern = void 0;
|
|
6
|
+
exports.removeDuplicateTransactions = exports.hasFunctionSelector = exports.detectPattern = exports.promptUserConfirmation = exports.identifyProxyPattern = exports.isBeaconPattern = exports.isTUPPPattern = exports.getImplementationAddress = exports.getAdminAddress = exports.extractAddressFromSlot = exports.isContractAddress = exports.Pattern = void 0;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const hardhat_1 = require("hardhat");
|
|
9
9
|
const readline_1 = __importDefault(require("readline"));
|
|
@@ -176,4 +176,20 @@ const hasFunctionSelector = async (address, signature) => {
|
|
|
176
176
|
}
|
|
177
177
|
};
|
|
178
178
|
exports.hasFunctionSelector = hasFunctionSelector;
|
|
179
|
+
const removeDuplicateTransactions = (items) => {
|
|
180
|
+
const seen = new Set();
|
|
181
|
+
return items.filter((item) => {
|
|
182
|
+
/*
|
|
183
|
+
* Create a unique composite key for the 'to' and 'data' pair.
|
|
184
|
+
* We use a separator ('|') to ensure 'a' + 'bc' doesn't clash with 'ab' + 'c'
|
|
185
|
+
*/
|
|
186
|
+
const uniqueKey = `${item.transaction.to}|${item.transaction.data}`;
|
|
187
|
+
if (seen.has(uniqueKey)) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
seen.add(uniqueKey);
|
|
191
|
+
return true;
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
exports.removeDuplicateTransactions = removeDuplicateTransactions;
|
|
179
195
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/utils.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/ownership-transfer/utils.ts"],"names":[],"mappings":";;;;;;AAGA,kDAA0B;AAC1B,qCAA+B;AAC/B,wDAAgC;AAEhC,MAAM,kBAAkB,GAAG,oEAAoE,CAAC;AAChG,MAAM,2BAA2B,GAAG,oEAAoE,CAAC;AACzG,MAAM,mBAAmB,GAAG,oEAAoE,CAAC;AAGjG,MAAM,cAAc,GAAG;IACnB,yCAAyC;IACzC,kDAAkD;CACrD,CAAC;AAEF;;;GAGG;AACH,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,IAAY,OAIX;AAJD,WAAY,OAAO;IACf,wBAAa,CAAA;IACb,4BAAiB,CAAA;IACjB,8BAAmB,CAAA;AACvB,CAAC,EAJW,OAAO,uBAAP,OAAO,QAIlB;AAEM,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAe,EAAoB,EAAE;IACzE,MAAM,IAAI,GAAG,MAAM,gBAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC;AAC3C,CAAC,CAAC;AAHW,QAAA,iBAAiB,qBAG5B;AAEK,MAAM,sBAAsB,GAAG,CAAC,SAAiB,EAAU,EAAE;IAChE,MAAM,UAAU,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC;IAC/D,OAAO,gBAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC,CAAC;AAHW,QAAA,sBAAsB,0BAGjC;AAEK,MAAM,eAAe,GAAG,KAAK,EAAE,OAAe,EAAmB,EAAE;IACtE,MAAM,cAAc,GAAG,MAAM,gBAAM,CAAC,QAAQ,CAAC,UAAU,CACnD,OAAO,EACP,kBAAkB,CACrB,CAAC;IACF,OAAO,IAAA,8BAAsB,EAAC,cAAc,CAAC,CAAC;AAClD,CAAC,CAAC;AANW,QAAA,eAAe,mBAM1B;AAEK,MAAM,wBAAwB,GAAG,KAAK,EAAE,OAAe,EAAmB,EAAE;IAC/E,MAAM,uBAAuB,GAAG,MAAM,gBAAM,CAAC,QAAQ,CAAC,UAAU,CAC5D,OAAO,EACP,2BAA2B,CAC9B,CAAC;IACF,OAAO,IAAA,8BAAsB,EAAC,uBAAuB,CAAC,CAAC;AAC3D,CAAC,CAAC;AANW,QAAA,wBAAwB,4BAMnC;AAEF,MAAM,iBAAiB,GAAG,KAAK,EAC3B,YAAoB,EACpB,YAAoB,EACJ,EAAE;IAClB,MAAM,eAAe,GAAG,MAAM,IAAA,yBAAiB,EAAC,YAAY,CAAC,CAAC;IAE9D,IAAI,CAAC,eAAe,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,qBAAqB,GAAG,MAAM,IAAA,gCAAwB,EAAC,YAAY,CAAC,CAAC;IAC3E,OAAO,qBAAqB,KAAK,gBAAM,CAAC,WAAW,IAAI,MAAM,IAAA,yBAAiB,EAAC,qBAAqB,CAAC,CAAC;AAC1G,CAAC,CAAC;AAEF;;;GAGG;AACI,MAAM,aAAa,GAAG,KAAK,EAAE,OAAe,EAAoB,EAAE;IACrE,IAAI,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,IAAA,uBAAe,EAAC,OAAO,CAAC,CAAC;QAEpD,IAAI,YAAY,KAAK,gBAAM,CAAC,WAAW,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,MAAM,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAZW,QAAA,aAAa,iBAYxB;AAEF;;;;GAIG;AACI,MAAM,eAAe,GAAG,KAAK,EAAE,OAAe,EAAoB,EAAE;IACvE,IAAI,CAAC;QACD,oBAAoB;QACpB,MAAM,eAAe,GAAG,MAAM,gBAAM,CAAC,QAAQ,CAAC,UAAU,CACpD,OAAO,EACP,mBAAmB,CACtB,CAAC;QAEF,MAAM,aAAa,GAAG,IAAA,8BAAsB,EAAC,eAAe,CAAC,CAAC;QAE9D,IAAI,aAAa,KAAK,gBAAM,CAAC,WAAW,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,gBAAM,CAAC,QAAQ,CAChC,OAAO,EACP,cAAc,EACd,gBAAM,CAAC,QAAQ,CAClB,CAAC;QAEF,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9C,QAAQ,CAAC,KAAK,EAAE;YAChB,QAAQ,CAAC,cAAc,EAAE;SAC5B,CAAC,CAAC;QAEH,OAAO,KAAK,KAAK,gBAAM,CAAC,WAAW;YAC/B,cAAc,KAAK,aAAa;YAChC,MAAM,IAAA,yBAAiB,EAAC,cAAc,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AA/BW,QAAA,eAAe,mBA+B1B;AAEF;;;;;GAKG;AACI,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAe,EAAoB,EAAE;IAC5E,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,OAAO,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAe,EAAC,OAAO,CAAC,CAAC;IAChD,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,OAAO,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC;AAC3B,CAAC,CAAC;AAZW,QAAA,oBAAoB,wBAY/B;AAEF;;;;GAIG;AACI,MAAM,sBAAsB,GAAG,CAAC,OAAgB,EAAoB,EAAE;IACzE,MAAM,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,KAAK;QACtB,QAAQ,EAAE,OAAO,CAAC,MAAM;KAC3B,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,OAAO,IAAI,gCAAgC,CAAC;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,EAAE,CAAC,QAAQ,CACP,eAAK,CAAC,MAAM,CAAC,GAAG,GAAG,uBAAuB,CAAC,EAC3C,CAAC,MAAM,EAAE,EAAE;YACP,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrD,OAAO,CAAC,gBAAgB,KAAK,KAAK,IAAI,gBAAgB,KAAK,GAAG,CAAC,CAAC;QACpE,CAAC,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAhBW,QAAA,sBAAsB,0BAgBjC;AAGF;;GAEG;AACI,MAAM,aAAa,GAAG,KAAK,EAAE,OAAoB,EAAoB,EAAE;IAC1E,IAAI,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,gBAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,MAAM,IAAA,yBAAiB,EAAC,eAAe,CAAC,CAAC;QAE5D,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,iCAAiC,CAAC,CAAA;QACxE,CAAC;QAED,OAAO,MAAM,IAAA,4BAAoB,EAAC,eAAe,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;QACxE,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3B,CAAC;AACL,CAAC,CAAA;AAdY,QAAA,aAAa,iBAczB;AAEM,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAe,EAAE,SAAiB,EAAoB,EAAE;IAC9F,MAAM,KAAK,GAAG,IAAI,gBAAM,CAAC,SAAS,CAAC,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,EAAC,QAAQ,EAAC,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAEtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC;QACD,uEAAuE;QACvE,MAAM,MAAM,GAAG,MAAM,gBAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtC,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,OAAO;SACd,CAAC,CAAC;QACH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,sDAAsD;QACtD,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAA;AAtBY,QAAA,mBAAmB,uBAsB/B;AAEM,MAAM,2BAA2B,GAAG,CAAC,KAAwB,EAAqB,EAAE;IACvF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB;;;WAGG;QACH,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAEpE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC,CAAA;AAhBY,QAAA,2BAA2B,+BAgBvC"}
|
package/package.json
CHANGED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { EoaSubmitter, SafeSubmitter } from "../submitters";
|
|
2
|
-
import { Instance } from "@skalenetwork/skale-contracts-ethers-v6";
|
|
3
|
-
export interface OwnershipAdminOptions {
|
|
4
|
-
oldOwner: string;
|
|
5
|
-
submitter: SafeSubmitter | EoaSubmitter;
|
|
6
|
-
revokeRoles: boolean;
|
|
7
|
-
newOwner: string;
|
|
8
|
-
readonly: boolean;
|
|
9
|
-
rolesToCheck?: string[];
|
|
10
|
-
managerRolesToCheck?: number[];
|
|
11
|
-
}
|
|
12
|
-
export declare class OwnershipAdmin {
|
|
13
|
-
private instance;
|
|
14
|
-
private contractMetadata;
|
|
15
|
-
private contractNames;
|
|
16
|
-
private transactionsByContractName;
|
|
17
|
-
private revokeTransactionsByContractName;
|
|
18
|
-
private transactions;
|
|
19
|
-
private revokeRolesTransactions;
|
|
20
|
-
private bytes32RolesToCheck;
|
|
21
|
-
private managerRolesToCheck;
|
|
22
|
-
private newOwnerConfirmed;
|
|
23
|
-
private oldOwner;
|
|
24
|
-
private newOwner;
|
|
25
|
-
private readonly;
|
|
26
|
-
private submitter;
|
|
27
|
-
private revokeRoles;
|
|
28
|
-
constructor(instance: Instance, contractNames: string[], options: OwnershipAdminOptions);
|
|
29
|
-
loadContractMetadataAndCreateTransactions(): Promise<void>;
|
|
30
|
-
createRevokeRolesTransactions(): Promise<void>;
|
|
31
|
-
submitGrantOwnershipTransactions(): Promise<void>;
|
|
32
|
-
submitRevokeRolesTransactions(): Promise<void>;
|
|
33
|
-
confirmData(): Promise<void>;
|
|
34
|
-
private processOptions;
|
|
35
|
-
private createRequiredTransactions;
|
|
36
|
-
private getColumnWidths;
|
|
37
|
-
private displayPatternGroup;
|
|
38
|
-
private displayFindings;
|
|
39
|
-
private handleUserRejection;
|
|
40
|
-
private groupMetadataByPattern;
|
|
41
|
-
private createTUPPOwnershipTransaction;
|
|
42
|
-
private createOwnableOwnershipTransaction;
|
|
43
|
-
private createAssignRolesTransactions;
|
|
44
|
-
private createRevokeBytes32RolesTransactions;
|
|
45
|
-
private createTxsToGrantContractOwnership;
|
|
46
|
-
private promptConfirmNewOwner;
|
|
47
|
-
private isDuplicateTransaction;
|
|
48
|
-
private submitTransactions;
|
|
49
|
-
private submitTransactionsForContract;
|
|
50
|
-
private removeSubmittedTransactions;
|
|
51
|
-
}
|
|
@@ -1,361 +0,0 @@
|
|
|
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.OwnershipAdmin = void 0;
|
|
7
|
-
const utils_1 = require("./utils");
|
|
8
|
-
const permission_utils_1 = require("./permission-utils");
|
|
9
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
-
const hardhat_1 = require("hardhat");
|
|
11
|
-
const ZERO = 0;
|
|
12
|
-
class OwnershipAdmin {
|
|
13
|
-
constructor(instance, contractNames, options) {
|
|
14
|
-
this.contractMetadata = new Map();
|
|
15
|
-
this.transactionsByContractName = new Map();
|
|
16
|
-
this.revokeTransactionsByContractName = new Map();
|
|
17
|
-
this.transactions = [];
|
|
18
|
-
this.revokeRolesTransactions = [];
|
|
19
|
-
this.bytes32RolesToCheck = [];
|
|
20
|
-
this.managerRolesToCheck = [];
|
|
21
|
-
this.newOwnerConfirmed = false;
|
|
22
|
-
this.instance = instance;
|
|
23
|
-
this.contractNames = contractNames;
|
|
24
|
-
this.processOptions(options);
|
|
25
|
-
}
|
|
26
|
-
async loadContractMetadataAndCreateTransactions() {
|
|
27
|
-
/* eslint-disable no-await-in-loop */
|
|
28
|
-
// Do not parallelize to avoid rate limit issues which CAN produce wrong outputs
|
|
29
|
-
for (const contractName of this.contractNames) {
|
|
30
|
-
/*
|
|
31
|
-
* We use getContractAddress to not depend on downloaded ABI artifacts
|
|
32
|
-
* all ABIs are checked locally
|
|
33
|
-
*/
|
|
34
|
-
const address = await this.instance.getContractAddress(contractName);
|
|
35
|
-
if (!this.contractMetadata.has(address)) {
|
|
36
|
-
const pattern = await (0, utils_1.detectPattern)(address);
|
|
37
|
-
const details = {
|
|
38
|
-
address,
|
|
39
|
-
name: contractName,
|
|
40
|
-
pattern,
|
|
41
|
-
permissionModel: await (0, permission_utils_1.getPermissionModels)(address)
|
|
42
|
-
};
|
|
43
|
-
this.contractMetadata.set(address, details);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/* eslint-enable no-await-in-loop */
|
|
47
|
-
if (this.contractMetadata.size !== this.contractNames.length) {
|
|
48
|
-
throw new Error("Some contract names did not yield metadata. Names duplicated? Aborting...");
|
|
49
|
-
}
|
|
50
|
-
await this.createRequiredTransactions();
|
|
51
|
-
await this.confirmData();
|
|
52
|
-
}
|
|
53
|
-
async createRevokeRolesTransactions() {
|
|
54
|
-
for (const contract of this.contractMetadata.values()) {
|
|
55
|
-
if (!this.revokeTransactionsByContractName.has(contract.name)) {
|
|
56
|
-
this.revokeTransactionsByContractName.set(contract.name, []);
|
|
57
|
-
}
|
|
58
|
-
if (contract.permissionModel?.includes(permission_utils_1.PermissionModel.ROLE_BASED)) {
|
|
59
|
-
// Required to be in order - Admin last
|
|
60
|
-
// eslint-disable-next-line no-await-in-loop
|
|
61
|
-
const txs = await this.createRevokeBytes32RolesTransactions(contract);
|
|
62
|
-
txs.forEach(txData => {
|
|
63
|
-
this.revokeRolesTransactions.push(txData.transaction);
|
|
64
|
-
this.revokeTransactionsByContractName.get(contract.name).push(txData);
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
if (contract.permissionModel?.includes(permission_utils_1.PermissionModel.ACCESS_MANAGER)) {
|
|
68
|
-
console.log(chalk_1.default.yellow("Not implemented yet: Access Manager role revocations."));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
await this.confirmData();
|
|
72
|
-
}
|
|
73
|
-
async submitGrantOwnershipTransactions() {
|
|
74
|
-
await this.submitTransactions(this.transactions, this.transactionsByContractName);
|
|
75
|
-
}
|
|
76
|
-
async submitRevokeRolesTransactions() {
|
|
77
|
-
await this.submitTransactions(this.revokeRolesTransactions, this.revokeTransactionsByContractName);
|
|
78
|
-
}
|
|
79
|
-
async confirmData() {
|
|
80
|
-
this.displayFindings();
|
|
81
|
-
const userConfirmed = await (0, utils_1.promptUserConfirmation)();
|
|
82
|
-
if (!userConfirmed) {
|
|
83
|
-
this.handleUserRejection();
|
|
84
|
-
}
|
|
85
|
-
console.log(chalk_1.default.green("\nUser confirmed. Proceeding...\n"));
|
|
86
|
-
}
|
|
87
|
-
// By 1
|
|
88
|
-
// eslint-disable-next-line max-statements
|
|
89
|
-
processOptions(options) {
|
|
90
|
-
// If true, does not allow to send transactions to blockchain
|
|
91
|
-
this.readonly = options.readonly;
|
|
92
|
-
this.newOwner = options.newOwner;
|
|
93
|
-
this.bytes32RolesToCheck = (options.rolesToCheck ?? []).map(role => ({
|
|
94
|
-
identifier: hardhat_1.ethers.id(role),
|
|
95
|
-
name: role
|
|
96
|
-
}));
|
|
97
|
-
this.submitter = options.submitter;
|
|
98
|
-
// Always have DEFAULT_ADMIN_ROLE at the end!
|
|
99
|
-
this.bytes32RolesToCheck.push({ identifier: hardhat_1.ethers.ZeroHash, name: "DEFAULT_ADMIN_ROLE" });
|
|
100
|
-
if (!this.readonly && this.newOwner === hardhat_1.ethers.ZeroAddress) {
|
|
101
|
-
throw new Error("New owner address must be provided in options when in write mode.");
|
|
102
|
-
}
|
|
103
|
-
this.managerRolesToCheck = (options.managerRolesToCheck ?? []).map(role => {
|
|
104
|
-
if (typeof role !== "number" || !Number.isInteger(role) || role < ZERO) {
|
|
105
|
-
throw new Error(`Invalid manager role: ${role}. Must be a non-negative integer.`);
|
|
106
|
-
}
|
|
107
|
-
return { identifier: role, name: `Role ${role}` };
|
|
108
|
-
});
|
|
109
|
-
// Always have ADMIN_ROLE at the end!
|
|
110
|
-
this.managerRolesToCheck.push({ identifier: ZERO, name: "ADMIN_ROLE" });
|
|
111
|
-
this.oldOwner = options.oldOwner;
|
|
112
|
-
this.revokeRoles = options.revokeRoles;
|
|
113
|
-
}
|
|
114
|
-
async createRequiredTransactions() {
|
|
115
|
-
// Clear previous transactions
|
|
116
|
-
console.log(chalk_1.default.grey("INFO: The next Following steps will NOT submit any transactions to the blockchain."));
|
|
117
|
-
if (!this.readonly && !this.newOwnerConfirmed) {
|
|
118
|
-
await this.promptConfirmNewOwner();
|
|
119
|
-
}
|
|
120
|
-
for (const contract of this.contractMetadata.values()) {
|
|
121
|
-
// eslint-disable-next-line no-await-in-loop
|
|
122
|
-
const txs = await this.createTxsToGrantContractOwnership(contract);
|
|
123
|
-
this.transactionsByContractName.set(contract.name, txs);
|
|
124
|
-
txs.forEach(txData => this.transactions.push(txData.transaction));
|
|
125
|
-
}
|
|
126
|
-
if (!this.transactions.length) {
|
|
127
|
-
console.log(chalk_1.default.green("No ownership transfer transactions required."));
|
|
128
|
-
await this.createRevokeRolesTransactions();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
getColumnWidths() {
|
|
132
|
-
let maxNameWidth = 0;
|
|
133
|
-
let maxAddressWidth = 0;
|
|
134
|
-
let maxPermissionsWidth = 0;
|
|
135
|
-
for (const contract of this.contractMetadata.values()) {
|
|
136
|
-
maxNameWidth = Math.max(maxNameWidth, contract.name.length);
|
|
137
|
-
maxAddressWidth = Math.max(maxAddressWidth, contract.address.length);
|
|
138
|
-
const permissions = contract.permissionModel?.join(", ") || "None";
|
|
139
|
-
maxPermissionsWidth = Math.max(maxPermissionsWidth, permissions.length);
|
|
140
|
-
}
|
|
141
|
-
return { maxAddressWidth, maxNameWidth, maxPermissionsWidth };
|
|
142
|
-
}
|
|
143
|
-
// eslint-disable-next-line max-statements
|
|
144
|
-
displayPatternGroup(pattern, contracts) {
|
|
145
|
-
const { maxNameWidth, maxAddressWidth, maxPermissionsWidth } = this.getColumnWidths();
|
|
146
|
-
console.log(chalk_1.default.bold(`\n${pattern} Pattern (${contracts.length} contracts):`));
|
|
147
|
-
for (const contract of contracts) {
|
|
148
|
-
const name = contract.name.padEnd(maxNameWidth);
|
|
149
|
-
const address = contract.address.padEnd(maxAddressWidth);
|
|
150
|
-
const permissions = (contract.permissionModel?.join(", ") || "None").padEnd(maxPermissionsWidth);
|
|
151
|
-
let status = chalk_1.default.green("ALL DONE");
|
|
152
|
-
if (this.transactionsByContractName.get(contract.name)?.length) {
|
|
153
|
-
status = chalk_1.default.yellow("GRANT OWNERSHIP REQUIRED");
|
|
154
|
-
}
|
|
155
|
-
else if (this.revokeTransactionsByContractName.get(contract.name)?.length) {
|
|
156
|
-
status = chalk_1.default.yellow("REVOKE ROLES REQUIRED");
|
|
157
|
-
}
|
|
158
|
-
console.log(chalk_1.default.gray(` ${name} ${address} ${permissions} `) + status);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
displayFindings() {
|
|
162
|
-
console.log(chalk_1.default.cyan("\n=== Ownership Status Results ===\n"));
|
|
163
|
-
const groupedByPattern = this.groupMetadataByPattern();
|
|
164
|
-
for (const [pattern, contracts] of Object.entries(groupedByPattern)) {
|
|
165
|
-
if (contracts.length) {
|
|
166
|
-
this.displayPatternGroup(pattern, contracts);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
console.log(chalk_1.default.cyan("\n==========================================\n"));
|
|
170
|
-
}
|
|
171
|
-
handleUserRejection() {
|
|
172
|
-
console.log(chalk_1.default.red("User did not confirm. Aborting and clearing all data..."));
|
|
173
|
-
this.contractMetadata.clear();
|
|
174
|
-
this.transactions.length = 0;
|
|
175
|
-
throw new Error("User aborted the operation. Data has been cleared.");
|
|
176
|
-
}
|
|
177
|
-
groupMetadataByPattern() {
|
|
178
|
-
const grouped = Object.values(utils_1.Pattern).
|
|
179
|
-
reduce((acc, pattern) => {
|
|
180
|
-
acc[pattern] = [];
|
|
181
|
-
return acc;
|
|
182
|
-
}, {});
|
|
183
|
-
for (const metadata of this.contractMetadata.values()) {
|
|
184
|
-
grouped[metadata.pattern].push(metadata);
|
|
185
|
-
}
|
|
186
|
-
return grouped;
|
|
187
|
-
}
|
|
188
|
-
async createTUPPOwnershipTransaction(contractData) {
|
|
189
|
-
const admin = await (0, utils_1.getAdminAddress)(contractData.address);
|
|
190
|
-
const tx = await (0, permission_utils_1.transferOwnership)(admin, this.newOwner, this.oldOwner);
|
|
191
|
-
if (typeof tx === "boolean" && tx) {
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
else if (this.isDuplicateTransaction(tx)) {
|
|
195
|
-
// Shares proxy admin with another contract - tx already created
|
|
196
|
-
return true;
|
|
197
|
-
}
|
|
198
|
-
console.log(chalk_1.default.yellow(` -> Tx to change Proxy Admin Owner at ${admin} created.`));
|
|
199
|
-
return {
|
|
200
|
-
description: `-> Tx to change Proxy Admin Owner at ${admin} to ${this.newOwner}`,
|
|
201
|
-
transaction: tx
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
async createOwnableOwnershipTransaction(contractData) {
|
|
205
|
-
const tx = await (0, permission_utils_1.transferOwnership)(contractData.address, this.newOwner, this.oldOwner);
|
|
206
|
-
if (typeof tx === "boolean" && tx) {
|
|
207
|
-
return true;
|
|
208
|
-
}
|
|
209
|
-
else if (this.isDuplicateTransaction(tx)) {
|
|
210
|
-
throw new Error(`Error: Transaction to change Owner of ${contractData.name} was already created.`);
|
|
211
|
-
}
|
|
212
|
-
console.log(chalk_1.default.yellow(` -> Tx to change Owner of ${contractData.name} at ${contractData.address} created.`));
|
|
213
|
-
return {
|
|
214
|
-
description: `-> Tx to change Owner of ${contractData.name} at ${contractData.address} to ${this.newOwner}.`,
|
|
215
|
-
transaction: tx
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
async createAssignRolesTransactions(contractData) {
|
|
219
|
-
const txs = [];
|
|
220
|
-
/* eslint-disable no-await-in-loop */
|
|
221
|
-
// Required to process sequentially due to order of transactions
|
|
222
|
-
for (const role of this.bytes32RolesToCheck) {
|
|
223
|
-
const tx = await (0, permission_utils_1.grantRole)(contractData.address, role.identifier, this.newOwner, this.oldOwner);
|
|
224
|
-
if (typeof tx === "boolean" && tx) {
|
|
225
|
-
// eslint-disable-next-line no-continue
|
|
226
|
-
continue;
|
|
227
|
-
}
|
|
228
|
-
else if (this.isDuplicateTransaction(tx)) {
|
|
229
|
-
// Unexpected - better check
|
|
230
|
-
throw new Error(`Error: Transaction to grant role ${role} in ${contractData.name} was already created.`);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
const description = `-> Tx to grant role ${role.name} to ${this.newOwner} in ${contractData.name}`;
|
|
234
|
-
console.log(chalk_1.default.yellow(` ${description} created.`));
|
|
235
|
-
txs.push({ description, transaction: tx });
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return txs;
|
|
239
|
-
}
|
|
240
|
-
async createRevokeBytes32RolesTransactions(contractData) {
|
|
241
|
-
const txs = [];
|
|
242
|
-
/* eslint-disable no-await-in-loop */
|
|
243
|
-
// Required to process sequentially due to order of transactions
|
|
244
|
-
for (const role of this.bytes32RolesToCheck) {
|
|
245
|
-
const tx = await (0, permission_utils_1.revokeRole)(contractData.address, role.identifier, this.oldOwner);
|
|
246
|
-
if (typeof tx === "boolean" && !tx) {
|
|
247
|
-
console.log(chalk_1.default.yellow(` WARNING: Skipping revocation of role ${role.name} in ${contractData.name} as it requires at least 1 member left.`));
|
|
248
|
-
}
|
|
249
|
-
else if (typeof tx !== "boolean" && this.isDuplicateTransaction(tx)) {
|
|
250
|
-
// Unexpected - better check
|
|
251
|
-
throw new Error(`Error: Transaction to revoke role ${role} in ${contractData.name} was already created.`);
|
|
252
|
-
}
|
|
253
|
-
else if (typeof tx !== "boolean") {
|
|
254
|
-
const description = `-> Tx to revoke role ${role.name} from ${this.oldOwner} in ${contractData.name}`;
|
|
255
|
-
console.log(chalk_1.default.yellow(` ${description} created.`));
|
|
256
|
-
txs.push({ description, transaction: tx });
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
return txs;
|
|
260
|
-
}
|
|
261
|
-
// eslint-disable-next-line max-statements
|
|
262
|
-
async createTxsToGrantContractOwnership(contractData) {
|
|
263
|
-
console.log(chalk_1.default.white(`* Creating Transactions to change Ownership of ${contractData.name}.`));
|
|
264
|
-
const txs = [];
|
|
265
|
-
if (contractData.pattern === utils_1.Pattern.TUPP) {
|
|
266
|
-
const tx = await this.createTUPPOwnershipTransaction(contractData);
|
|
267
|
-
if (tx !== true) {
|
|
268
|
-
txs.push(tx);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
if (contractData.permissionModel?.includes(permission_utils_1.PermissionModel.OWNABLE)) {
|
|
272
|
-
const tx = await this.createOwnableOwnershipTransaction(contractData);
|
|
273
|
-
if (tx !== true) {
|
|
274
|
-
txs.push(tx);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
if (contractData.permissionModel?.includes(permission_utils_1.PermissionModel.ROLE_BASED)) {
|
|
278
|
-
const txList = await this.createAssignRolesTransactions(contractData);
|
|
279
|
-
if (txList.length) {
|
|
280
|
-
txList.forEach(tx => txs.push(tx));
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
if (contractData.permissionModel?.includes(permission_utils_1.PermissionModel.ACCESS_MANAGER)) {
|
|
284
|
-
console.log(chalk_1.default.yellow("Not implemented yet: Access Manager role assignments."));
|
|
285
|
-
}
|
|
286
|
-
return txs;
|
|
287
|
-
}
|
|
288
|
-
// eslint-disable-next-line max-statements
|
|
289
|
-
async promptConfirmNewOwner() {
|
|
290
|
-
console.log(chalk_1.default.white(`You have specified the new owner address as ${this.newOwner}.`));
|
|
291
|
-
const isContract = await (0, utils_1.isContractAddress)(this.newOwner);
|
|
292
|
-
if (isContract) {
|
|
293
|
-
console.log(chalk_1.default.yellow(` INFO: It appears to be a contract address.`));
|
|
294
|
-
const { owners, threshold } = await (0, permission_utils_1.tryGetMultiSigInfo)(this.newOwner);
|
|
295
|
-
let message = chalk_1.default.red(`WARNING: The script was unable to collect owners details.`);
|
|
296
|
-
if (owners) {
|
|
297
|
-
const ownersList = owners.join(", ");
|
|
298
|
-
message = chalk_1.default.green(`INFO: Found owners of new Owner Multi-Sig: ${ownersList}`);
|
|
299
|
-
}
|
|
300
|
-
console.log(message);
|
|
301
|
-
message = chalk_1.default.red(`WARNING: The script was unable to determine the Multi-Sig threshold.`);
|
|
302
|
-
if (threshold) {
|
|
303
|
-
message = chalk_1.default.green(`INFO: Multi-Sig threshold is set to ${threshold}.`);
|
|
304
|
-
}
|
|
305
|
-
console.log(message);
|
|
306
|
-
}
|
|
307
|
-
if (!await (0, utils_1.promptUserConfirmation)("")) {
|
|
308
|
-
throw new Error("User did not confirm the new owner address. Aborting...");
|
|
309
|
-
}
|
|
310
|
-
this.newOwnerConfirmed = true;
|
|
311
|
-
}
|
|
312
|
-
isDuplicateTransaction(transaction) {
|
|
313
|
-
return this.transactions.some((existingTx) => existingTx.to === transaction.to &&
|
|
314
|
-
existingTx.data === transaction.data) || this.revokeRolesTransactions.some((existingTx) => existingTx.to === transaction.to &&
|
|
315
|
-
existingTx.data === transaction.data);
|
|
316
|
-
}
|
|
317
|
-
async submitTransactions(txList, txByContractName) {
|
|
318
|
-
if (this.readonly) {
|
|
319
|
-
console.log(chalk_1.default.yellow("INFO: Read-only mode is enabled. No transactions will be submitted."));
|
|
320
|
-
console.log(chalk_1.default.yellow("INFO: We will still iterate through transactions to demonstrate the flow."));
|
|
321
|
-
}
|
|
322
|
-
if (!txList.length) {
|
|
323
|
-
console.log(chalk_1.default.yellow("No transactions to submit."));
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
for (const [contract, txs] of txByContractName.entries()) {
|
|
327
|
-
if (txs.length) {
|
|
328
|
-
// We should process contract by contract - prompting user each time
|
|
329
|
-
// eslint-disable-next-line no-await-in-loop
|
|
330
|
-
await this.submitTransactionsForContract(contract, txs);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
async submitTransactionsForContract(contractName, txs) {
|
|
335
|
-
console.log(chalk_1.default.cyan(`\nSubmitting transactions for contract ${contractName}...\n`));
|
|
336
|
-
for (const [index, txData] of txs.entries()) {
|
|
337
|
-
console.log(chalk_1.default.blue(`Transaction ${index}: ${txData.description || "No description"}`));
|
|
338
|
-
}
|
|
339
|
-
const userConfirmed = await (0, utils_1.promptUserConfirmation)("Do you confirm submitting these transactions to the blockchain?");
|
|
340
|
-
if (!userConfirmed) {
|
|
341
|
-
console.log(chalk_1.default.red("User did not confirm. Skipping submission for this contract."));
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
if (!this.readonly) {
|
|
345
|
-
await this.submitter.submit(txs.map(txData => txData.transaction));
|
|
346
|
-
}
|
|
347
|
-
this.removeSubmittedTransactions(contractName, txs.map(txData => txData.transaction));
|
|
348
|
-
}
|
|
349
|
-
removeSubmittedTransactions(contractName, transactions) {
|
|
350
|
-
if (this.transactionsByContractName.get(contractName)?.map(tx => tx.transaction).some((tx) => transactions.includes(tx))) {
|
|
351
|
-
this.transactions = this.transactions.filter((tx) => !transactions.includes(tx));
|
|
352
|
-
this.transactionsByContractName.set(contractName, []);
|
|
353
|
-
}
|
|
354
|
-
else if (this.revokeTransactionsByContractName.get(contractName)?.map(tx => tx.transaction).some((tx) => transactions.includes(tx))) {
|
|
355
|
-
this.revokeRolesTransactions = this.revokeRolesTransactions.filter((tx) => !transactions.includes(tx));
|
|
356
|
-
this.revokeTransactionsByContractName.set(contractName, []);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
exports.OwnershipAdmin = OwnershipAdmin;
|
|
361
|
-
//# sourceMappingURL=ownershipAdmin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ownershipAdmin.js","sourceRoot":"","sources":["../../../src/ownership-transfer/ownershipAdmin.ts"],"names":[],"mappings":"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"}
|