-
Notifications
You must be signed in to change notification settings - Fork 43
/
uups-upgradeable.ts
81 lines (75 loc) · 2.93 KB
/
uups-upgradeable.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import {SignerWithAddress} from '@nomiclabs/hardhat-ethers/signers';
import {expect} from 'chai';
import {Contract} from 'ethers';
import {ethers} from 'hardhat';
/// Used as a common test suite to test upgradeability of the contracts.
/// Presumes that `upgrade` object is set on `this` inside the actual test file.
/// this.upgrade consists of:
/// contract - address of the contract on which it tests if `upgradeTo` works as intended.
/// dao - dao contact that the contract belongs to.
/// user - ethers user object. Presumed that it doesn't have permission to call `upgradeTo`.
export function shouldUpgradeCorrectly(
upgradePermissionId: string,
upgradeRevertPermissionMessage: string
) {
let uupsCompatibleBase: string;
function DaoUnauthorizedRevertArgs(
contract: Contract,
user: SignerWithAddress,
dao: Contract
) {
return [dao.address, contract.address, user.address, upgradePermissionId];
}
function UnauthorizedRevertArgs(dao: Contract, user: SignerWithAddress) {
return [dao.address, user.address, upgradePermissionId];
}
describe('UUPS Upgradeability Test', async () => {
before(async () => {
const factory = await ethers.getContractFactory(
'PluginUUPSUpgradeableV1Mock'
);
uupsCompatibleBase = (await factory.deploy()).address;
});
it('reverts if user without permission tries to upgrade', async function () {
const {user, contract, dao} = this.upgrade;
const connect = contract.connect(user);
const tx1 = connect.upgradeTo(ethers.constants.AddressZero);
const tx2 = connect.upgradeToAndCall(ethers.constants.AddressZero, '0x');
if (upgradeRevertPermissionMessage == 'DaoUnauthorized') {
await expect(tx1)
.to.be.revertedWithCustomError(
contract,
upgradeRevertPermissionMessage
)
.withArgs(...DaoUnauthorizedRevertArgs(contract, user, dao));
await expect(tx2)
.to.be.revertedWithCustomError(
contract,
upgradeRevertPermissionMessage
)
.withArgs(...DaoUnauthorizedRevertArgs(contract, user, dao));
} else {
await expect(tx1)
.to.be.revertedWithCustomError(
contract,
upgradeRevertPermissionMessage
)
.withArgs(...UnauthorizedRevertArgs(dao, user));
await expect(tx2)
.to.be.revertedWithCustomError(
contract,
upgradeRevertPermissionMessage
)
.withArgs(...UnauthorizedRevertArgs(dao, user));
}
});
it('updates correctly to new implementation', async function () {
const {user, contract, dao} = this.upgrade;
await dao.grant(contract.address, user.address, upgradePermissionId);
const connect = contract.connect(user);
await expect(connect.upgradeTo(uupsCompatibleBase))
.to.emit(contract, 'Upgraded')
.withArgs(uupsCompatibleBase);
});
});
}