@skalenetwork/upgrade-tools 0.0.1-custom.7 → 0.0.1-develop.0
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/hardhat.config.d.ts +2 -0
- package/dist/hardhat.config.js +20 -1
- package/dist/{abi.d.ts → src/abi.d.ts} +0 -0
- package/dist/{abi.js → src/abi.js} +0 -0
- package/dist/src/deploy.d.ts +5 -0
- package/dist/{deploy.js → src/deploy.js} +3 -1
- package/dist/{gnosis-safe.d.ts → src/gnosis-safe.d.ts} +1 -1
- package/dist/{gnosis-safe.js → src/gnosis-safe.js} +12 -32
- package/dist/{index.d.ts → src/index.d.ts} +1 -0
- package/dist/{index.js → src/index.js} +6 -1
- package/dist/{multiSend.d.ts → src/multiSend.d.ts} +0 -0
- package/dist/{multiSend.js → src/multiSend.js} +0 -0
- package/dist/{types.d.ts → src/types.d.ts} +0 -0
- package/dist/{types.js → src/types.js} +0 -0
- package/dist/src/upgrade.d.ts +7 -0
- package/dist/src/upgrade.js +203 -0
- package/dist/{verification.d.ts → src/verification.d.ts} +0 -0
- package/dist/{verification.js → src/verification.js} +0 -0
- package/dist/{version.d.ts → src/version.d.ts} +0 -0
- package/dist/{version.js → src/version.js} +0 -0
- package/dist/typechain-types/AccessControlEnumerableUpgradeable.d.ts +183 -0
- package/dist/{upgrade.js → typechain-types/AccessControlEnumerableUpgradeable.js} +0 -1
- package/dist/typechain-types/AccessControlUpgradeable.d.ts +167 -0
- package/dist/typechain-types/AccessControlUpgradeable.js +2 -0
- package/dist/typechain-types/AdminUpgradeabilityProxy.d.ts +145 -0
- package/dist/typechain-types/AdminUpgradeabilityProxy.js +2 -0
- package/dist/typechain-types/ContextUpgradeable.d.ts +40 -0
- package/dist/typechain-types/ContextUpgradeable.js +2 -0
- package/dist/typechain-types/ERC165Upgradeable.d.ts +53 -0
- package/dist/typechain-types/ERC165Upgradeable.js +2 -0
- package/dist/typechain-types/IAccessControlEnumerableUpgradeable.d.ts +159 -0
- package/dist/typechain-types/IAccessControlEnumerableUpgradeable.js +2 -0
- package/dist/typechain-types/IAccessControlUpgradeable.d.ts +143 -0
- package/dist/typechain-types/IAccessControlUpgradeable.js +2 -0
- package/dist/typechain-types/IERC165Upgradeable.d.ts +43 -0
- package/dist/typechain-types/IERC165Upgradeable.js +2 -0
- package/dist/typechain-types/ISafeMock.d.ts +86 -0
- package/dist/typechain-types/ISafeMock.js +2 -0
- package/dist/typechain-types/Initializable.d.ts +40 -0
- package/dist/typechain-types/Initializable.js +2 -0
- package/dist/typechain-types/OwnableUpgradeable.d.ts +97 -0
- package/dist/typechain-types/OwnableUpgradeable.js +2 -0
- package/dist/typechain-types/ProxyAdmin.d.ts +153 -0
- package/dist/typechain-types/ProxyAdmin.js +2 -0
- package/dist/typechain-types/SafeMock.d.ts +172 -0
- package/dist/typechain-types/SafeMock.js +2 -0
- package/dist/typechain-types/common.d.ts +21 -0
- package/dist/typechain-types/common.js +2 -0
- package/dist/typechain-types/factories/AccessControlEnumerableUpgradeable__factory.d.ts +35 -0
- package/dist/typechain-types/factories/AccessControlEnumerableUpgradeable__factory.js +279 -0
- package/dist/typechain-types/factories/AccessControlUpgradeable__factory.d.ts +35 -0
- package/dist/typechain-types/factories/AccessControlUpgradeable__factory.js +236 -0
- package/dist/typechain-types/factories/AdminUpgradeabilityProxy__factory.d.ts +74 -0
- package/dist/typechain-types/factories/AdminUpgradeabilityProxy__factory.js +187 -0
- package/dist/typechain-types/factories/ContextUpgradeable__factory.d.ts +18 -0
- package/dist/typechain-types/factories/ContextUpgradeable__factory.js +32 -0
- package/dist/typechain-types/factories/ERC165Upgradeable__factory.d.ts +35 -0
- package/dist/typechain-types/factories/ERC165Upgradeable__factory.js +51 -0
- package/dist/typechain-types/factories/IAccessControlEnumerableUpgradeable__factory.d.ts +35 -0
- package/dist/typechain-types/factories/IAccessControlEnumerableUpgradeable__factory.js +234 -0
- package/dist/typechain-types/factories/IAccessControlUpgradeable__factory.d.ts +35 -0
- package/dist/typechain-types/factories/IAccessControlUpgradeable__factory.js +191 -0
- package/dist/typechain-types/factories/IERC165Upgradeable__factory.d.ts +22 -0
- package/dist/typechain-types/factories/IERC165Upgradeable__factory.js +38 -0
- package/dist/typechain-types/factories/ISafeMock__factory.d.ts +22 -0
- package/dist/typechain-types/factories/ISafeMock__factory.js +114 -0
- package/dist/typechain-types/factories/Initializable__factory.d.ts +18 -0
- package/dist/typechain-types/factories/Initializable__factory.js +32 -0
- package/dist/typechain-types/factories/OwnableUpgradeable__factory.d.ts +42 -0
- package/dist/typechain-types/factories/OwnableUpgradeable__factory.js +84 -0
- package/dist/typechain-types/factories/ProxyAdmin__factory.d.ts +49 -0
- package/dist/typechain-types/factories/ProxyAdmin__factory.js +192 -0
- package/dist/typechain-types/factories/SafeMock__factory.d.ts +56 -0
- package/dist/typechain-types/factories/SafeMock__factory.js +247 -0
- package/dist/typechain-types/index.d.ts +26 -0
- package/dist/typechain-types/index.js +29 -0
- package/package.json +30 -9
- package/dist/deploy.d.ts +0 -3
- package/dist/upgrade.d.ts +0 -2
package/dist/hardhat.config.d.ts
CHANGED
package/dist/hardhat.config.js
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("@typechain/hardhat");
|
|
3
4
|
require("@nomiclabs/hardhat-ethers");
|
|
4
|
-
|
|
5
|
+
require("@openzeppelin/hardhat-upgrades");
|
|
6
|
+
const config = {
|
|
7
|
+
solidity: {
|
|
8
|
+
compilers: [
|
|
9
|
+
{
|
|
10
|
+
version: '0.8.11',
|
|
11
|
+
settings: {
|
|
12
|
+
optimizer: {
|
|
13
|
+
enabled: true,
|
|
14
|
+
runs: 200
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
typechain: {
|
|
21
|
+
externalArtifacts: ['node_modules/@openzeppelin/upgrades-core/artifacts/*.json']
|
|
22
|
+
}
|
|
23
|
+
};
|
|
5
24
|
exports.default = config;
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function deployLibraries(libraryNames: string[]): Promise<Map<string, string>>;
|
|
2
|
+
export declare function getLinkedContractFactory(contractName: string, libraries: Map<string, string>): Promise<import("ethers").ContractFactory>;
|
|
3
|
+
export declare function getContractKeyInAbiFile(contract: string): string;
|
|
4
|
+
export declare function getManifestFile(): Promise<string>;
|
|
5
|
+
export declare function getContractFactory(contract: string): Promise<import("ethers").ContractFactory>;
|
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.getContractFactory = exports.getManifestFile = exports.getContractKeyInAbiFile = void 0;
|
|
12
|
+
exports.getContractFactory = exports.getManifestFile = exports.getContractKeyInAbiFile = exports.getLinkedContractFactory = exports.deployLibraries = void 0;
|
|
13
13
|
const upgrades_core_1 = require("@openzeppelin/upgrades-core");
|
|
14
14
|
const hardhat_1 = require("hardhat");
|
|
15
15
|
const fs_1 = require("fs");
|
|
@@ -30,6 +30,7 @@ function deployLibraries(libraryNames) {
|
|
|
30
30
|
return libraries;
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
|
+
exports.deployLibraries = deployLibraries;
|
|
33
34
|
function _linkBytecode(artifact, libraries) {
|
|
34
35
|
let bytecode = artifact.bytecode;
|
|
35
36
|
for (const [, fileReferences] of Object.entries(artifact.linkReferences)) {
|
|
@@ -56,6 +57,7 @@ function getLinkedContractFactory(contractName, libraries) {
|
|
|
56
57
|
return ContractFactory;
|
|
57
58
|
});
|
|
58
59
|
}
|
|
60
|
+
exports.getLinkedContractFactory = getLinkedContractFactory;
|
|
59
61
|
function getContractKeyInAbiFile(contract) {
|
|
60
62
|
return contract.replace(/([a-zA-Z])(?=[A-Z])/g, '$1_').toLowerCase();
|
|
61
63
|
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -33,9 +37,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
33
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
38
|
exports.sendSafeTransaction = exports.createMultiSendTransaction = exports.getSafeRelayUrl = exports.getSafeTransactionUrl = void 0;
|
|
35
39
|
const axios_1 = __importDefault(require("axios"));
|
|
36
|
-
const ethers_eip712_1 = require("ethers-eip712");
|
|
37
40
|
const ethUtil = __importStar(require("ethereumjs-util"));
|
|
38
41
|
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const ethers_1 = require("ethers");
|
|
39
43
|
var Network;
|
|
40
44
|
(function (Network) {
|
|
41
45
|
Network[Network["MAINNET"] = 1] = "MAINNET";
|
|
@@ -43,7 +47,6 @@ var Network;
|
|
|
43
47
|
Network[Network["GANACHE"] = 1337] = "GANACHE";
|
|
44
48
|
Network[Network["HARDHAT"] = 31337] = "HARDHAT";
|
|
45
49
|
})(Network || (Network = {}));
|
|
46
|
-
const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
47
50
|
const ADDRESSES = {
|
|
48
51
|
multiSend: {
|
|
49
52
|
[Network.MAINNET]: "0x8D29bE29923b68abfDD21e541b9374737B49cdAD",
|
|
@@ -68,7 +71,7 @@ function getMultiSendAddress(chainId) {
|
|
|
68
71
|
return ADDRESSES.multiSend[chainId];
|
|
69
72
|
}
|
|
70
73
|
else if ([Network.GANACHE, Network.HARDHAT].includes(chainId)) {
|
|
71
|
-
return
|
|
74
|
+
return ethers_1.ethers.constants.AddressZero;
|
|
72
75
|
}
|
|
73
76
|
else {
|
|
74
77
|
throw Error(`Can't get multiSend contract at network with chainId = ${chainId}`);
|
|
@@ -114,6 +117,8 @@ function createMultiSendTransaction(ethers, safeAddress, privateKey, transaction
|
|
|
114
117
|
const multiSendAddress = getMultiSendAddress(chainId);
|
|
115
118
|
const multiSendAbi = [{ "constant": false, "inputs": [{ "internalType": "bytes", "name": "transactions", "type": "bytes" }], "name": "multiSend", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }];
|
|
116
119
|
const multiSend = new ethers.Contract(multiSendAddress, new ethers.utils.Interface(multiSendAbi), ethers.provider);
|
|
120
|
+
const safeAbi = [{ "constant": true, "inputs": [{ "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "enum Enum.Operation", "name": "operation", "type": "uint8" }, { "internalType": "uint256", "name": "safeTxGas", "type": "uint256" }, { "internalType": "uint256", "name": "baseGas", "type": "uint256" }, { "internalType": "uint256", "name": "gasPrice", "type": "uint256" }, { "internalType": "address", "name": "gasToken", "type": "address" }, { "internalType": "address", "name": "refundReceiver", "type": "address" }, { "internalType": "uint256", "name": "_nonce", "type": "uint256" }], "name": "getTransactionHash", "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "payable": false, "stateMutability": "view", "type": "function" }];
|
|
121
|
+
const safe = new ethers.Contract(safeAddress, new ethers.utils.Interface(safeAbi), ethers.provider);
|
|
117
122
|
let nonce = 0;
|
|
118
123
|
if (!isSafeMock) {
|
|
119
124
|
try {
|
|
@@ -132,39 +137,14 @@ function createMultiSendTransaction(ethers, safeAddress, privateKey, transaction
|
|
|
132
137
|
"value": 0,
|
|
133
138
|
"data": multiSend.interface.encodeFunctionData("multiSend", [concatTransactions(transactions)]),
|
|
134
139
|
"operation": 1,
|
|
135
|
-
"gasToken":
|
|
140
|
+
"gasToken": ethers.constants.AddressZero,
|
|
136
141
|
"safeTxGas": 0,
|
|
137
142
|
"baseGas": 0,
|
|
138
143
|
"gasPrice": 0,
|
|
139
|
-
"refundReceiver":
|
|
144
|
+
"refundReceiver": ethers.constants.AddressZero,
|
|
140
145
|
"nonce": nonce, // Nonce of the Safe, transaction cannot be executed until Safe's nonce is not equal to this nonce
|
|
141
146
|
};
|
|
142
|
-
const
|
|
143
|
-
types: {
|
|
144
|
-
EIP712Domain: [
|
|
145
|
-
{ name: "verifyingContract", type: "address" },
|
|
146
|
-
],
|
|
147
|
-
SafeTx: [
|
|
148
|
-
{ type: "address", name: "to" },
|
|
149
|
-
{ type: "uint256", name: "value" },
|
|
150
|
-
{ type: "bytes", name: "data" },
|
|
151
|
-
{ type: "uint8", name: "operation" },
|
|
152
|
-
{ type: "uint256", name: "safeTxGas" },
|
|
153
|
-
{ type: "uint256", name: "baseGas" },
|
|
154
|
-
{ type: "uint256", name: "gasPrice" },
|
|
155
|
-
{ type: "address", name: "gasToken" },
|
|
156
|
-
{ type: "address", name: "refundReceiver" },
|
|
157
|
-
{ type: "uint256", name: "nonce" },
|
|
158
|
-
]
|
|
159
|
-
},
|
|
160
|
-
primaryType: 'SafeTx',
|
|
161
|
-
domain: {
|
|
162
|
-
verifyingContract: safeAddress
|
|
163
|
-
},
|
|
164
|
-
message: Object.assign(Object.assign({}, tx), { data: ethers.utils.arrayify(tx.data) })
|
|
165
|
-
};
|
|
166
|
-
const digest = ethers_eip712_1.TypedDataUtils.encodeDigest(typedData);
|
|
167
|
-
const digestHex = ethers.utils.hexlify(digest);
|
|
147
|
+
const digestHex = yield safe.getTransactionHash(tx.to, tx.value, tx.data, tx.operation, tx.safeTxGas, tx.baseGas, tx.gasPrice, tx.gasToken, tx.refundReceiver, tx.nonce);
|
|
168
148
|
const privateKeyBuffer = ethUtil.toBuffer(privateKey);
|
|
169
149
|
const { r, s, v } = ethUtil.ecsign(ethUtil.toBuffer(digestHex), privateKeyBuffer);
|
|
170
150
|
const signature = ethUtil.toRpcSig(v, r, s).toString();
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -15,5 +19,6 @@ __exportStar(require("./deploy"), exports);
|
|
|
15
19
|
__exportStar(require("./gnosis-safe"), exports);
|
|
16
20
|
__exportStar(require("./multiSend"), exports);
|
|
17
21
|
__exportStar(require("./upgrade"), exports);
|
|
22
|
+
__exportStar(require("./types"), exports);
|
|
18
23
|
__exportStar(require("./verification"), exports);
|
|
19
24
|
__exportStar(require("./version"), exports);
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SkaleABIFile } from "./types";
|
|
2
|
+
import { Contract } from "ethers";
|
|
3
|
+
import { OwnableUpgradeable } from "../typechain-types";
|
|
4
|
+
export declare function getContractFactoryAndUpdateManifest(contract: string): Promise<import("ethers").ContractFactory>;
|
|
5
|
+
declare type DeploymentAction<ContractManagerType extends Contract> = (safeTransactions: string[], abi: SkaleABIFile, contractManager: ContractManagerType) => Promise<void>;
|
|
6
|
+
export declare function upgrade<ContractManagerType extends OwnableUpgradeable>(projectName: string, targetVersion: string, getDeployedVersion: (abi: SkaleABIFile) => Promise<string | undefined>, setVersion: (safeTransaction: string[], abi: SkaleABIFile, newVersion: string) => Promise<void>, safeMockAccessRequirements: string[], contractNamesToUpgrade: string[], deployNewContracts: DeploymentAction<ContractManagerType>, initialize: DeploymentAction<ContractManagerType>): Promise<void>;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.upgrade = exports.getContractFactoryAndUpdateManifest = void 0;
|
|
16
|
+
const deploy_1 = require("./deploy");
|
|
17
|
+
const fs_1 = require("fs");
|
|
18
|
+
const hardhat_1 = require("hardhat");
|
|
19
|
+
const hardhat_2 = __importDefault(require("hardhat"));
|
|
20
|
+
const upgrades_core_1 = require("@openzeppelin/upgrades-core");
|
|
21
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
22
|
+
const admin_1 = require("@openzeppelin/hardhat-upgrades/dist/admin");
|
|
23
|
+
const version_1 = require("./version");
|
|
24
|
+
const abi_1 = require("./abi");
|
|
25
|
+
const verification_1 = require("./verification");
|
|
26
|
+
const multiSend_1 = require("./multiSend");
|
|
27
|
+
const gnosis_safe_1 = require("./gnosis-safe");
|
|
28
|
+
function getContractFactoryAndUpdateManifest(contract) {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
const manifest = JSON.parse(yield fs_1.promises.readFile(yield (0, deploy_1.getManifestFile)(), "utf-8"));
|
|
31
|
+
const { linkReferences } = yield hardhat_1.artifacts.readArtifact(contract);
|
|
32
|
+
if (!Object.keys(linkReferences).length)
|
|
33
|
+
return yield hardhat_1.ethers.getContractFactory(contract);
|
|
34
|
+
const librariesToUpgrade = [];
|
|
35
|
+
const oldLibraries = {};
|
|
36
|
+
if (manifest.libraries === undefined) {
|
|
37
|
+
Object.assign(manifest, { libraries: {} });
|
|
38
|
+
}
|
|
39
|
+
for (const key of Object.keys(linkReferences)) {
|
|
40
|
+
const libraryName = Object.keys(linkReferences[key])[0];
|
|
41
|
+
const { bytecode } = yield hardhat_1.artifacts.readArtifact(libraryName);
|
|
42
|
+
if (manifest.libraries[libraryName] === undefined) {
|
|
43
|
+
librariesToUpgrade.push(libraryName);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const libraryBytecodeHash = manifest.libraries[libraryName].bytecodeHash;
|
|
47
|
+
if ((0, upgrades_core_1.hashBytecode)(bytecode) !== libraryBytecodeHash) {
|
|
48
|
+
librariesToUpgrade.push(libraryName);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
oldLibraries[libraryName] = manifest.libraries[libraryName].address;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const libraries = yield (0, deploy_1.deployLibraries)(librariesToUpgrade);
|
|
55
|
+
for (const [libraryName, libraryAddress] of libraries.entries()) {
|
|
56
|
+
const { bytecode } = yield hardhat_1.artifacts.readArtifact(libraryName);
|
|
57
|
+
manifest.libraries[libraryName] = { "address": libraryAddress, "bytecodeHash": (0, upgrades_core_1.hashBytecode)(bytecode) };
|
|
58
|
+
}
|
|
59
|
+
Object.assign(libraries, oldLibraries);
|
|
60
|
+
yield fs_1.promises.writeFile(yield (0, deploy_1.getManifestFile)(), JSON.stringify(manifest, null, 4));
|
|
61
|
+
return yield (0, deploy_1.getLinkedContractFactory)(contract, libraries);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
exports.getContractFactoryAndUpdateManifest = getContractFactoryAndUpdateManifest;
|
|
65
|
+
function upgrade(projectName, targetVersion, getDeployedVersion, setVersion, safeMockAccessRequirements, contractNamesToUpgrade, deployNewContracts, initialize) {
|
|
66
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
if (!process.env.ABI) {
|
|
68
|
+
console.log(chalk_1.default.red("Set path to file with ABI and addresses to ABI environment variables"));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const abiFilename = process.env.ABI;
|
|
72
|
+
const abi = JSON.parse(yield fs_1.promises.readFile(abiFilename, "utf-8"));
|
|
73
|
+
const proxyAdmin = yield (0, admin_1.getManifestAdmin)(hardhat_2.default);
|
|
74
|
+
const contractManagerName = "ContractManager";
|
|
75
|
+
const contractManagerFactory = yield hardhat_1.ethers.getContractFactory(contractManagerName);
|
|
76
|
+
const contractManager = (contractManagerFactory.attach(abi[(0, deploy_1.getContractKeyInAbiFile)(contractManagerName) + "_address"]));
|
|
77
|
+
const deployedVersion = yield getDeployedVersion(abi);
|
|
78
|
+
const version = yield (0, version_1.getVersion)();
|
|
79
|
+
if (deployedVersion) {
|
|
80
|
+
if (deployedVersion !== targetVersion) {
|
|
81
|
+
console.log(chalk_1.default.red(`This script can't upgrade version ${deployedVersion} to ${version}`));
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log(chalk_1.default.yellow(`Can't check currently deployed version of ${projectName}`));
|
|
87
|
+
}
|
|
88
|
+
console.log(`Will mark updated version as ${version}`);
|
|
89
|
+
const [deployer] = yield hardhat_1.ethers.getSigners();
|
|
90
|
+
let safe = yield proxyAdmin.owner();
|
|
91
|
+
const safeTransactions = [];
|
|
92
|
+
let safeMock = undefined;
|
|
93
|
+
if ((yield hardhat_1.ethers.provider.getCode(safe)) === "0x") {
|
|
94
|
+
console.log("Owner is not a contract");
|
|
95
|
+
if (deployer.address !== safe) {
|
|
96
|
+
console.log(chalk_1.default.red(`Used address does not have permissions to upgrade ${projectName}`));
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
console.log(chalk_1.default.blue("Deploy SafeMock to simulate upgrade via multisig"));
|
|
100
|
+
const safeMockFactory = yield hardhat_1.ethers.getContractFactory("SafeMock");
|
|
101
|
+
safeMock = yield safeMockFactory.deploy();
|
|
102
|
+
yield safeMock.deployTransaction.wait();
|
|
103
|
+
console.log(chalk_1.default.blue("Transfer ownership to SafeMock"));
|
|
104
|
+
safe = safeMock.address;
|
|
105
|
+
yield (yield proxyAdmin.transferOwnership(safe)).wait();
|
|
106
|
+
yield (yield contractManager.transferOwnership(safe)).wait();
|
|
107
|
+
for (const contractName of safeMockAccessRequirements) {
|
|
108
|
+
const contractFactory = yield getContractFactoryAndUpdateManifest(contractName);
|
|
109
|
+
const contractAddress = abi[(0, deploy_1.getContractKeyInAbiFile)(contractName) + "_address"];
|
|
110
|
+
const contract = contractFactory.attach(contractAddress);
|
|
111
|
+
console.log(chalk_1.default.blue(`Grant access to ${contractName}`));
|
|
112
|
+
yield (yield contract.grantRole(yield contract.DEFAULT_ADMIN_ROLE(), safe)).wait();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
try {
|
|
117
|
+
const safeMockFactory = yield hardhat_1.ethers.getContractFactory("SafeMock");
|
|
118
|
+
const checkSafeMock = safeMockFactory.attach(safe);
|
|
119
|
+
if (yield checkSafeMock.IS_SAFE_MOCK()) {
|
|
120
|
+
safeMock = checkSafeMock;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
console.log(chalk_1.default.yellow("Owner is not SafeMock"));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Deploy new contracts
|
|
128
|
+
yield deployNewContracts(safeTransactions, abi, contractManager);
|
|
129
|
+
// deploy new implementations
|
|
130
|
+
const contractsToUpgrade = [];
|
|
131
|
+
for (const contract of contractNamesToUpgrade) {
|
|
132
|
+
const contractFactory = yield getContractFactoryAndUpdateManifest(contract);
|
|
133
|
+
let _contract = contract;
|
|
134
|
+
if (contract === "BountyV2") {
|
|
135
|
+
if (!abi[(0, deploy_1.getContractKeyInAbiFile)(contract) + "_address"])
|
|
136
|
+
_contract = "Bounty";
|
|
137
|
+
}
|
|
138
|
+
const proxyAddress = abi[(0, deploy_1.getContractKeyInAbiFile)(_contract) + "_address"];
|
|
139
|
+
console.log(`Prepare upgrade of ${contract}`);
|
|
140
|
+
const newImplementationAddress = yield hardhat_1.upgrades.prepareUpgrade(proxyAddress, contractFactory, {
|
|
141
|
+
unsafeAllowLinkedLibraries: true,
|
|
142
|
+
unsafeAllowRenames: true
|
|
143
|
+
});
|
|
144
|
+
const currentImplementationAddress = yield (0, upgrades_core_1.getImplementationAddress)(hardhat_1.network.provider, proxyAddress);
|
|
145
|
+
if (newImplementationAddress !== currentImplementationAddress) {
|
|
146
|
+
contractsToUpgrade.push({
|
|
147
|
+
proxyAddress,
|
|
148
|
+
implementationAddress: newImplementationAddress,
|
|
149
|
+
name: contract,
|
|
150
|
+
abi: (0, abi_1.getAbi)(contractFactory.interface)
|
|
151
|
+
});
|
|
152
|
+
yield (0, verification_1.verify)(contract, newImplementationAddress, []);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.log(chalk_1.default.gray(`Contract ${contract} is up to date`));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Switch proxies to new implementations
|
|
159
|
+
for (const contract of contractsToUpgrade) {
|
|
160
|
+
console.log(chalk_1.default.yellowBright(`Prepare transaction to upgrade ${contract.name} at ${contract.proxyAddress} to ${contract.implementationAddress}`));
|
|
161
|
+
safeTransactions.push((0, multiSend_1.encodeTransaction)(0, proxyAdmin.address, 0, proxyAdmin.interface.encodeFunctionData("upgrade", [contract.proxyAddress, contract.implementationAddress])));
|
|
162
|
+
abi[(0, deploy_1.getContractKeyInAbiFile)(contract.name) + "_abi"] = contract.abi;
|
|
163
|
+
}
|
|
164
|
+
yield initialize(safeTransactions, abi, contractManager);
|
|
165
|
+
// write version
|
|
166
|
+
yield setVersion(safeTransactions, abi, version);
|
|
167
|
+
yield fs_1.promises.writeFile(`data/transactions-${version}-${hardhat_1.network.name}.json`, JSON.stringify(safeTransactions, null, 4));
|
|
168
|
+
let privateKey = hardhat_1.network.config.accounts[0];
|
|
169
|
+
if (hardhat_1.network.config.accounts === "remote") {
|
|
170
|
+
// Don't have an information about private key
|
|
171
|
+
// Use random one because we most probable run tests
|
|
172
|
+
privateKey = hardhat_1.ethers.Wallet.createRandom().privateKey;
|
|
173
|
+
}
|
|
174
|
+
const safeTx = yield (0, gnosis_safe_1.createMultiSendTransaction)(hardhat_1.ethers, safe, privateKey, safeTransactions, safeMock !== undefined);
|
|
175
|
+
if (!safeMock) {
|
|
176
|
+
const chainId = (yield hardhat_1.ethers.provider.getNetwork()).chainId;
|
|
177
|
+
yield (0, gnosis_safe_1.sendSafeTransaction)(safe, chainId, safeTx);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.log(chalk_1.default.blue("Send upgrade transactions to safe mock"));
|
|
181
|
+
try {
|
|
182
|
+
yield (yield deployer.sendTransaction({
|
|
183
|
+
to: safeMock.address,
|
|
184
|
+
value: safeTx.value,
|
|
185
|
+
data: safeTx.data,
|
|
186
|
+
})).wait();
|
|
187
|
+
console.log(chalk_1.default.blue("Transactions have been sent"));
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
console.log(chalk_1.default.blue("Return ownership to wallet"));
|
|
191
|
+
yield (yield safeMock.transferProxyAdminOwnership(contractManager.address, deployer.address)).wait();
|
|
192
|
+
yield (yield safeMock.transferProxyAdminOwnership(proxyAdmin.address, deployer.address)).wait();
|
|
193
|
+
if ((yield proxyAdmin.owner()) !== deployer.address) {
|
|
194
|
+
console.log(chalk_1.default.blue("Something went wrong with ownership transfer"));
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
yield fs_1.promises.writeFile(`data/${projectName}-${version}-${hardhat_1.network.name}-abi.json`, JSON.stringify(abi, null, 4));
|
|
200
|
+
console.log("Done");
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
exports.upgrade = upgrade;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { BaseContract, BigNumber, BigNumberish, BytesLike, CallOverrides, ContractTransaction, Overrides, PopulatedTransaction, Signer, utils } from "ethers";
|
|
2
|
+
import { FunctionFragment, Result, EventFragment } from "@ethersproject/abi";
|
|
3
|
+
import { Listener, Provider } from "@ethersproject/providers";
|
|
4
|
+
import { TypedEventFilter, TypedEvent, TypedListener, OnEvent } from "./common";
|
|
5
|
+
export interface AccessControlEnumerableUpgradeableInterface extends utils.Interface {
|
|
6
|
+
contractName: "AccessControlEnumerableUpgradeable";
|
|
7
|
+
functions: {
|
|
8
|
+
"DEFAULT_ADMIN_ROLE()": FunctionFragment;
|
|
9
|
+
"getRoleAdmin(bytes32)": FunctionFragment;
|
|
10
|
+
"getRoleMember(bytes32,uint256)": FunctionFragment;
|
|
11
|
+
"getRoleMemberCount(bytes32)": FunctionFragment;
|
|
12
|
+
"grantRole(bytes32,address)": FunctionFragment;
|
|
13
|
+
"hasRole(bytes32,address)": FunctionFragment;
|
|
14
|
+
"renounceRole(bytes32,address)": FunctionFragment;
|
|
15
|
+
"revokeRole(bytes32,address)": FunctionFragment;
|
|
16
|
+
"supportsInterface(bytes4)": FunctionFragment;
|
|
17
|
+
};
|
|
18
|
+
encodeFunctionData(functionFragment: "DEFAULT_ADMIN_ROLE", values?: undefined): string;
|
|
19
|
+
encodeFunctionData(functionFragment: "getRoleAdmin", values: [BytesLike]): string;
|
|
20
|
+
encodeFunctionData(functionFragment: "getRoleMember", values: [BytesLike, BigNumberish]): string;
|
|
21
|
+
encodeFunctionData(functionFragment: "getRoleMemberCount", values: [BytesLike]): string;
|
|
22
|
+
encodeFunctionData(functionFragment: "grantRole", values: [BytesLike, string]): string;
|
|
23
|
+
encodeFunctionData(functionFragment: "hasRole", values: [BytesLike, string]): string;
|
|
24
|
+
encodeFunctionData(functionFragment: "renounceRole", values: [BytesLike, string]): string;
|
|
25
|
+
encodeFunctionData(functionFragment: "revokeRole", values: [BytesLike, string]): string;
|
|
26
|
+
encodeFunctionData(functionFragment: "supportsInterface", values: [BytesLike]): string;
|
|
27
|
+
decodeFunctionResult(functionFragment: "DEFAULT_ADMIN_ROLE", data: BytesLike): Result;
|
|
28
|
+
decodeFunctionResult(functionFragment: "getRoleAdmin", data: BytesLike): Result;
|
|
29
|
+
decodeFunctionResult(functionFragment: "getRoleMember", data: BytesLike): Result;
|
|
30
|
+
decodeFunctionResult(functionFragment: "getRoleMemberCount", data: BytesLike): Result;
|
|
31
|
+
decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result;
|
|
32
|
+
decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result;
|
|
33
|
+
decodeFunctionResult(functionFragment: "renounceRole", data: BytesLike): Result;
|
|
34
|
+
decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result;
|
|
35
|
+
decodeFunctionResult(functionFragment: "supportsInterface", data: BytesLike): Result;
|
|
36
|
+
events: {
|
|
37
|
+
"Initialized(uint8)": EventFragment;
|
|
38
|
+
"RoleAdminChanged(bytes32,bytes32,bytes32)": EventFragment;
|
|
39
|
+
"RoleGranted(bytes32,address,address)": EventFragment;
|
|
40
|
+
"RoleRevoked(bytes32,address,address)": EventFragment;
|
|
41
|
+
};
|
|
42
|
+
getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment;
|
|
43
|
+
getEvent(nameOrSignatureOrTopic: "RoleAdminChanged"): EventFragment;
|
|
44
|
+
getEvent(nameOrSignatureOrTopic: "RoleGranted"): EventFragment;
|
|
45
|
+
getEvent(nameOrSignatureOrTopic: "RoleRevoked"): EventFragment;
|
|
46
|
+
}
|
|
47
|
+
export declare type InitializedEvent = TypedEvent<[number], {
|
|
48
|
+
version: number;
|
|
49
|
+
}>;
|
|
50
|
+
export declare type InitializedEventFilter = TypedEventFilter<InitializedEvent>;
|
|
51
|
+
export declare type RoleAdminChangedEvent = TypedEvent<[
|
|
52
|
+
string,
|
|
53
|
+
string,
|
|
54
|
+
string
|
|
55
|
+
], {
|
|
56
|
+
role: string;
|
|
57
|
+
previousAdminRole: string;
|
|
58
|
+
newAdminRole: string;
|
|
59
|
+
}>;
|
|
60
|
+
export declare type RoleAdminChangedEventFilter = TypedEventFilter<RoleAdminChangedEvent>;
|
|
61
|
+
export declare type RoleGrantedEvent = TypedEvent<[
|
|
62
|
+
string,
|
|
63
|
+
string,
|
|
64
|
+
string
|
|
65
|
+
], {
|
|
66
|
+
role: string;
|
|
67
|
+
account: string;
|
|
68
|
+
sender: string;
|
|
69
|
+
}>;
|
|
70
|
+
export declare type RoleGrantedEventFilter = TypedEventFilter<RoleGrantedEvent>;
|
|
71
|
+
export declare type RoleRevokedEvent = TypedEvent<[
|
|
72
|
+
string,
|
|
73
|
+
string,
|
|
74
|
+
string
|
|
75
|
+
], {
|
|
76
|
+
role: string;
|
|
77
|
+
account: string;
|
|
78
|
+
sender: string;
|
|
79
|
+
}>;
|
|
80
|
+
export declare type RoleRevokedEventFilter = TypedEventFilter<RoleRevokedEvent>;
|
|
81
|
+
export interface AccessControlEnumerableUpgradeable extends BaseContract {
|
|
82
|
+
contractName: "AccessControlEnumerableUpgradeable";
|
|
83
|
+
connect(signerOrProvider: Signer | Provider | string): this;
|
|
84
|
+
attach(addressOrName: string): this;
|
|
85
|
+
deployed(): Promise<this>;
|
|
86
|
+
interface: AccessControlEnumerableUpgradeableInterface;
|
|
87
|
+
queryFilter<TEvent extends TypedEvent>(event: TypedEventFilter<TEvent>, fromBlockOrBlockhash?: string | number | undefined, toBlock?: string | number | undefined): Promise<Array<TEvent>>;
|
|
88
|
+
listeners<TEvent extends TypedEvent>(eventFilter?: TypedEventFilter<TEvent>): Array<TypedListener<TEvent>>;
|
|
89
|
+
listeners(eventName?: string): Array<Listener>;
|
|
90
|
+
removeAllListeners<TEvent extends TypedEvent>(eventFilter: TypedEventFilter<TEvent>): this;
|
|
91
|
+
removeAllListeners(eventName?: string): this;
|
|
92
|
+
off: OnEvent<this>;
|
|
93
|
+
on: OnEvent<this>;
|
|
94
|
+
once: OnEvent<this>;
|
|
95
|
+
removeListener: OnEvent<this>;
|
|
96
|
+
functions: {
|
|
97
|
+
DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>;
|
|
98
|
+
getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<[string]>;
|
|
99
|
+
getRoleMember(role: BytesLike, index: BigNumberish, overrides?: CallOverrides): Promise<[string]>;
|
|
100
|
+
getRoleMemberCount(role: BytesLike, overrides?: CallOverrides): Promise<[BigNumber]>;
|
|
101
|
+
grantRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
102
|
+
from?: string | Promise<string>;
|
|
103
|
+
}): Promise<ContractTransaction>;
|
|
104
|
+
hasRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<[boolean]>;
|
|
105
|
+
renounceRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
106
|
+
from?: string | Promise<string>;
|
|
107
|
+
}): Promise<ContractTransaction>;
|
|
108
|
+
revokeRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
109
|
+
from?: string | Promise<string>;
|
|
110
|
+
}): Promise<ContractTransaction>;
|
|
111
|
+
supportsInterface(interfaceId: BytesLike, overrides?: CallOverrides): Promise<[boolean]>;
|
|
112
|
+
};
|
|
113
|
+
DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<string>;
|
|
114
|
+
getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<string>;
|
|
115
|
+
getRoleMember(role: BytesLike, index: BigNumberish, overrides?: CallOverrides): Promise<string>;
|
|
116
|
+
getRoleMemberCount(role: BytesLike, overrides?: CallOverrides): Promise<BigNumber>;
|
|
117
|
+
grantRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
118
|
+
from?: string | Promise<string>;
|
|
119
|
+
}): Promise<ContractTransaction>;
|
|
120
|
+
hasRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<boolean>;
|
|
121
|
+
renounceRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
122
|
+
from?: string | Promise<string>;
|
|
123
|
+
}): Promise<ContractTransaction>;
|
|
124
|
+
revokeRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
125
|
+
from?: string | Promise<string>;
|
|
126
|
+
}): Promise<ContractTransaction>;
|
|
127
|
+
supportsInterface(interfaceId: BytesLike, overrides?: CallOverrides): Promise<boolean>;
|
|
128
|
+
callStatic: {
|
|
129
|
+
DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<string>;
|
|
130
|
+
getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<string>;
|
|
131
|
+
getRoleMember(role: BytesLike, index: BigNumberish, overrides?: CallOverrides): Promise<string>;
|
|
132
|
+
getRoleMemberCount(role: BytesLike, overrides?: CallOverrides): Promise<BigNumber>;
|
|
133
|
+
grantRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<void>;
|
|
134
|
+
hasRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<boolean>;
|
|
135
|
+
renounceRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<void>;
|
|
136
|
+
revokeRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<void>;
|
|
137
|
+
supportsInterface(interfaceId: BytesLike, overrides?: CallOverrides): Promise<boolean>;
|
|
138
|
+
};
|
|
139
|
+
filters: {
|
|
140
|
+
"Initialized(uint8)"(version?: null): InitializedEventFilter;
|
|
141
|
+
Initialized(version?: null): InitializedEventFilter;
|
|
142
|
+
"RoleAdminChanged(bytes32,bytes32,bytes32)"(role?: BytesLike | null, previousAdminRole?: BytesLike | null, newAdminRole?: BytesLike | null): RoleAdminChangedEventFilter;
|
|
143
|
+
RoleAdminChanged(role?: BytesLike | null, previousAdminRole?: BytesLike | null, newAdminRole?: BytesLike | null): RoleAdminChangedEventFilter;
|
|
144
|
+
"RoleGranted(bytes32,address,address)"(role?: BytesLike | null, account?: string | null, sender?: string | null): RoleGrantedEventFilter;
|
|
145
|
+
RoleGranted(role?: BytesLike | null, account?: string | null, sender?: string | null): RoleGrantedEventFilter;
|
|
146
|
+
"RoleRevoked(bytes32,address,address)"(role?: BytesLike | null, account?: string | null, sender?: string | null): RoleRevokedEventFilter;
|
|
147
|
+
RoleRevoked(role?: BytesLike | null, account?: string | null, sender?: string | null): RoleRevokedEventFilter;
|
|
148
|
+
};
|
|
149
|
+
estimateGas: {
|
|
150
|
+
DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<BigNumber>;
|
|
151
|
+
getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<BigNumber>;
|
|
152
|
+
getRoleMember(role: BytesLike, index: BigNumberish, overrides?: CallOverrides): Promise<BigNumber>;
|
|
153
|
+
getRoleMemberCount(role: BytesLike, overrides?: CallOverrides): Promise<BigNumber>;
|
|
154
|
+
grantRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
155
|
+
from?: string | Promise<string>;
|
|
156
|
+
}): Promise<BigNumber>;
|
|
157
|
+
hasRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<BigNumber>;
|
|
158
|
+
renounceRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
159
|
+
from?: string | Promise<string>;
|
|
160
|
+
}): Promise<BigNumber>;
|
|
161
|
+
revokeRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
162
|
+
from?: string | Promise<string>;
|
|
163
|
+
}): Promise<BigNumber>;
|
|
164
|
+
supportsInterface(interfaceId: BytesLike, overrides?: CallOverrides): Promise<BigNumber>;
|
|
165
|
+
};
|
|
166
|
+
populateTransaction: {
|
|
167
|
+
DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<PopulatedTransaction>;
|
|
168
|
+
getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<PopulatedTransaction>;
|
|
169
|
+
getRoleMember(role: BytesLike, index: BigNumberish, overrides?: CallOverrides): Promise<PopulatedTransaction>;
|
|
170
|
+
getRoleMemberCount(role: BytesLike, overrides?: CallOverrides): Promise<PopulatedTransaction>;
|
|
171
|
+
grantRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
172
|
+
from?: string | Promise<string>;
|
|
173
|
+
}): Promise<PopulatedTransaction>;
|
|
174
|
+
hasRole(role: BytesLike, account: string, overrides?: CallOverrides): Promise<PopulatedTransaction>;
|
|
175
|
+
renounceRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
176
|
+
from?: string | Promise<string>;
|
|
177
|
+
}): Promise<PopulatedTransaction>;
|
|
178
|
+
revokeRole(role: BytesLike, account: string, overrides?: Overrides & {
|
|
179
|
+
from?: string | Promise<string>;
|
|
180
|
+
}): Promise<PopulatedTransaction>;
|
|
181
|
+
supportsInterface(interfaceId: BytesLike, overrides?: CallOverrides): Promise<PopulatedTransaction>;
|
|
182
|
+
};
|
|
183
|
+
}
|