@layerzerolabs/proxy-v5-6-evm-contracts 1.2.20

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.
Files changed (126) hide show
  1. package/.turbo/turbo-build.log +270 -0
  2. package/.turbo/turbo-lint.log +98 -0
  3. package/.turbo/turbo-test.log +124 -0
  4. package/LICENSE +23 -0
  5. package/artifacts/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json +4 -0
  6. package/artifacts/@openzeppelin/contracts/access/Ownable.sol/Ownable.json +85 -0
  7. package/artifacts/@openzeppelin/contracts/access/Ownable2Step.sol/Ownable2Step.dbg.json +4 -0
  8. package/artifacts/@openzeppelin/contracts/access/Ownable2Step.sol/Ownable2Step.json +124 -0
  9. package/artifacts/@openzeppelin/contracts/interfaces/IERC1967.sol/IERC1967.dbg.json +4 -0
  10. package/artifacts/@openzeppelin/contracts/interfaces/IERC1967.sol/IERC1967.json +56 -0
  11. package/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +4 -0
  12. package/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +81 -0
  13. package/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol/ERC1967Utils.dbg.json +4 -0
  14. package/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol/ERC1967Utils.json +49 -0
  15. package/artifacts/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.dbg.json +4 -0
  16. package/artifacts/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.json +15 -0
  17. package/artifacts/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.dbg.json +4 -0
  18. package/artifacts/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.json +24 -0
  19. package/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.dbg.json +4 -0
  20. package/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +132 -0
  21. package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.dbg.json +4 -0
  22. package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.json +74 -0
  23. package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.dbg.json +4 -0
  24. package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +121 -0
  25. package/artifacts/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json +4 -0
  26. package/artifacts/@openzeppelin/contracts/utils/Address.sol/Address.json +22 -0
  27. package/artifacts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +4 -0
  28. package/artifacts/@openzeppelin/contracts/utils/Context.sol/Context.json +10 -0
  29. package/artifacts/@openzeppelin/contracts/utils/Errors.sol/Errors.dbg.json +4 -0
  30. package/artifacts/@openzeppelin/contracts/utils/Errors.sol/Errors.json +48 -0
  31. package/artifacts/@openzeppelin/contracts/utils/LowLevelCall.sol/LowLevelCall.dbg.json +4 -0
  32. package/artifacts/@openzeppelin/contracts/utils/LowLevelCall.sol/LowLevelCall.json +10 -0
  33. package/artifacts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.dbg.json +4 -0
  34. package/artifacts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.json +10 -0
  35. package/artifacts/build-info/eb640ccbdf084d1d111d9ebf9250fdca.json +1 -0
  36. package/artifacts/contracts/ProxyAdmin2Step.sol/ProxyAdmin2Step.dbg.json +4 -0
  37. package/artifacts/contracts/ProxyAdmin2Step.sol/ProxyAdmin2Step.json +176 -0
  38. package/artifacts/contracts/TransparentUpgradeableProxy2Step.sol/TransparentUpgradeableProxy2Step.dbg.json +4 -0
  39. package/artifacts/contracts/TransparentUpgradeableProxy2Step.sol/TransparentUpgradeableProxy2Step.json +121 -0
  40. package/artifacts/contracts/interfaces/IProxyAdmin2Step.sol/IProxyAdmin2Step.dbg.json +4 -0
  41. package/artifacts/contracts/interfaces/IProxyAdmin2Step.sol/IProxyAdmin2Step.json +16 -0
  42. package/artifacts-flattened-contracts/contracts/ProxyAdmin2Step.flattened.sol +922 -0
  43. package/artifacts-flattened-contracts/contracts/TransparentUpgradeableProxy2Step.flattened.sol +1017 -0
  44. package/artifacts-tron/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json +4 -0
  45. package/artifacts-tron/@openzeppelin/contracts/access/Ownable.sol/Ownable.json +85 -0
  46. package/artifacts-tron/@openzeppelin/contracts/access/Ownable2Step.sol/Ownable2Step.dbg.json +4 -0
  47. package/artifacts-tron/@openzeppelin/contracts/access/Ownable2Step.sol/Ownable2Step.json +124 -0
  48. package/artifacts-tron/@openzeppelin/contracts/interfaces/IERC1967.sol/IERC1967.dbg.json +4 -0
  49. package/artifacts-tron/@openzeppelin/contracts/interfaces/IERC1967.sol/IERC1967.json +56 -0
  50. package/artifacts-tron/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +4 -0
  51. package/artifacts-tron/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +81 -0
  52. package/artifacts-tron/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol/ERC1967Utils.dbg.json +4 -0
  53. package/artifacts-tron/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol/ERC1967Utils.json +49 -0
  54. package/artifacts-tron/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.dbg.json +4 -0
  55. package/artifacts-tron/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.json +15 -0
  56. package/artifacts-tron/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.dbg.json +4 -0
  57. package/artifacts-tron/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.json +24 -0
  58. package/artifacts-tron/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.dbg.json +4 -0
  59. package/artifacts-tron/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +132 -0
  60. package/artifacts-tron/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.dbg.json +4 -0
  61. package/artifacts-tron/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.json +74 -0
  62. package/artifacts-tron/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.dbg.json +4 -0
  63. package/artifacts-tron/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +121 -0
  64. package/artifacts-tron/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json +4 -0
  65. package/artifacts-tron/@openzeppelin/contracts/utils/Address.sol/Address.json +22 -0
  66. package/artifacts-tron/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +4 -0
  67. package/artifacts-tron/@openzeppelin/contracts/utils/Context.sol/Context.json +10 -0
  68. package/artifacts-tron/@openzeppelin/contracts/utils/Errors.sol/Errors.dbg.json +4 -0
  69. package/artifacts-tron/@openzeppelin/contracts/utils/Errors.sol/Errors.json +48 -0
  70. package/artifacts-tron/@openzeppelin/contracts/utils/LowLevelCall.sol/LowLevelCall.dbg.json +4 -0
  71. package/artifacts-tron/@openzeppelin/contracts/utils/LowLevelCall.sol/LowLevelCall.json +10 -0
  72. package/artifacts-tron/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.dbg.json +4 -0
  73. package/artifacts-tron/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.json +10 -0
  74. package/artifacts-tron/build-info/33e2b07450318007b249bcb542a1e222.json +1 -0
  75. package/artifacts-tron/contracts/ProxyAdmin2Step.sol/ProxyAdmin2Step.dbg.json +4 -0
  76. package/artifacts-tron/contracts/ProxyAdmin2Step.sol/ProxyAdmin2Step.json +176 -0
  77. package/artifacts-tron/contracts/TransparentUpgradeableProxy2Step.sol/TransparentUpgradeableProxy2Step.dbg.json +4 -0
  78. package/artifacts-tron/contracts/TransparentUpgradeableProxy2Step.sol/TransparentUpgradeableProxy2Step.json +121 -0
  79. package/artifacts-tron/contracts/interfaces/IProxyAdmin2Step.sol/IProxyAdmin2Step.dbg.json +4 -0
  80. package/artifacts-tron/contracts/interfaces/IProxyAdmin2Step.sol/IProxyAdmin2Step.json +16 -0
  81. package/artifacts-zk/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json +4 -0
  82. package/artifacts-zk/@openzeppelin/contracts/access/Ownable.sol/Ownable.json +86 -0
  83. package/artifacts-zk/@openzeppelin/contracts/access/Ownable2Step.sol/Ownable2Step.dbg.json +4 -0
  84. package/artifacts-zk/@openzeppelin/contracts/access/Ownable2Step.sol/Ownable2Step.json +125 -0
  85. package/artifacts-zk/@openzeppelin/contracts/interfaces/IERC1967.sol/IERC1967.dbg.json +4 -0
  86. package/artifacts-zk/@openzeppelin/contracts/interfaces/IERC1967.sol/IERC1967.json +57 -0
  87. package/artifacts-zk/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +4 -0
  88. package/artifacts-zk/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +82 -0
  89. package/artifacts-zk/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol/ERC1967Utils.dbg.json +4 -0
  90. package/artifacts-zk/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol/ERC1967Utils.json +50 -0
  91. package/artifacts-zk/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.dbg.json +4 -0
  92. package/artifacts-zk/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.json +16 -0
  93. package/artifacts-zk/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.dbg.json +4 -0
  94. package/artifacts-zk/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.json +25 -0
  95. package/artifacts-zk/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.dbg.json +4 -0
  96. package/artifacts-zk/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +133 -0
  97. package/artifacts-zk/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.dbg.json +4 -0
  98. package/artifacts-zk/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.json +75 -0
  99. package/artifacts-zk/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.dbg.json +4 -0
  100. package/artifacts-zk/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +124 -0
  101. package/artifacts-zk/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json +4 -0
  102. package/artifacts-zk/@openzeppelin/contracts/utils/Address.sol/Address.json +23 -0
  103. package/artifacts-zk/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +4 -0
  104. package/artifacts-zk/@openzeppelin/contracts/utils/Context.sol/Context.json +11 -0
  105. package/artifacts-zk/@openzeppelin/contracts/utils/Errors.sol/Errors.dbg.json +4 -0
  106. package/artifacts-zk/@openzeppelin/contracts/utils/Errors.sol/Errors.json +49 -0
  107. package/artifacts-zk/@openzeppelin/contracts/utils/LowLevelCall.sol/LowLevelCall.dbg.json +4 -0
  108. package/artifacts-zk/@openzeppelin/contracts/utils/LowLevelCall.sol/LowLevelCall.json +11 -0
  109. package/artifacts-zk/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.dbg.json +4 -0
  110. package/artifacts-zk/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.json +11 -0
  111. package/artifacts-zk/build-info/9069f70cfc4c7329462d894dfdd2740c.json +1 -0
  112. package/artifacts-zk/contracts/ProxyAdmin2Step.sol/ProxyAdmin2Step.dbg.json +4 -0
  113. package/artifacts-zk/contracts/ProxyAdmin2Step.sol/ProxyAdmin2Step.json +177 -0
  114. package/artifacts-zk/contracts/TransparentUpgradeableProxy2Step.sol/TransparentUpgradeableProxy2Step.dbg.json +4 -0
  115. package/artifacts-zk/contracts/TransparentUpgradeableProxy2Step.sol/TransparentUpgradeableProxy2Step.json +124 -0
  116. package/artifacts-zk/contracts/interfaces/IProxyAdmin2Step.sol/IProxyAdmin2Step.dbg.json +4 -0
  117. package/artifacts-zk/contracts/interfaces/IProxyAdmin2Step.sol/IProxyAdmin2Step.json +17 -0
  118. package/contracts/ProxyAdmin2Step.sol +39 -0
  119. package/contracts/TransparentUpgradeableProxy2Step.sol +109 -0
  120. package/contracts/interfaces/IProxyAdmin2Step.sol +15 -0
  121. package/foundry.toml +23 -0
  122. package/hardhat.config.js +58 -0
  123. package/package.json +42 -0
  124. package/solhint.config.js +3 -0
  125. package/test/TransparentUpgradeableProxy2Step.t.sol +276 -0
  126. package/turbo-snapshot.lock.json +454 -0
@@ -0,0 +1,58 @@
1
+ require('@matterlabs/hardhat-zksync-solc');
2
+ // `hardhat-deploy` is required by `@layerzerolabs/hardhat-tron`.
3
+ require('hardhat-deploy');
4
+ require('@layerzerolabs/hardhat-tron');
5
+
6
+ module.exports = {
7
+ paths: {
8
+ cache: 'hh-cache',
9
+ },
10
+ solidity: {
11
+ compilers: [
12
+ {
13
+ version: '0.8.26',
14
+ settings: {
15
+ evmVersion: 'cancun',
16
+ viaIR: true,
17
+ optimizer: {
18
+ enabled: true,
19
+ runs: 20_000,
20
+ },
21
+ // Making the implicit `hardhat-deploy` behaviour explicit.
22
+ // https://github.com/wighawag/hardhat-deploy/blob/v0.12.4/src/index.ts#L317
23
+ metadata: { useLiteralContent: true },
24
+ },
25
+ },
26
+ ],
27
+ },
28
+ zksolc: {
29
+ version: '1.5.15',
30
+ compilerSource: 'binary',
31
+ settings: {},
32
+ },
33
+ tronSolc: {
34
+ enable: true,
35
+ compilers: [
36
+ {
37
+ version: '0.8.24',
38
+ settings: {
39
+ optimizer: {
40
+ enabled: true,
41
+ runs: 20_000,
42
+ },
43
+ },
44
+ },
45
+ ],
46
+ },
47
+ networks: {
48
+ 'zksync-mainnet': {
49
+ url: 'https://zksync2-mainnet.zksync.io',
50
+ ethNetwork: 'https://eth-mainnet.public.blastapi.io',
51
+ zksync: true,
52
+ },
53
+ 'tron-mainnet': {
54
+ url: 'http://127.0.0.1:8514/jsonrpc',
55
+ tron: true,
56
+ },
57
+ },
58
+ };
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@layerzerolabs/proxy-v5-6-evm-contracts",
3
+ "version": "1.2.20",
4
+ "private": false,
5
+ "description": "",
6
+ "license": "MIT",
7
+ "devDependencies": {
8
+ "@layerzerolabs/hardhat-tron": "3.0.168",
9
+ "@layerzerolabs/toolbox-foundry": "^0.1.13",
10
+ "@matterlabs/hardhat-zksync-solc": "^1.4.0",
11
+ "@openzeppelin/contracts": "5.6.1",
12
+ "hardhat-deploy": "^0.12.4",
13
+ "solhint": "^6.0.1",
14
+ "@layerzerolabs/solhint-configuration": "1.2.20",
15
+ "@layerzerolabs/vm-tooling-evm": "1.2.20"
16
+ },
17
+ "publishConfig": {
18
+ "access": "restricted"
19
+ },
20
+ "externalRepoConfig": {
21
+ "targets": [
22
+ "audit-external",
23
+ "console-pen-test",
24
+ "monorepo-external"
25
+ ]
26
+ },
27
+ "scripts": {
28
+ "build": "pnpm compile:evm && pnpm compile:zksync && pnpm compile:tron && pnpm flatten:all",
29
+ "clean": "rm -rf ./node_modules .turbo ./dist && pnpm generated:clean",
30
+ "compile:evm": "pnpm lz-tool hardhat compile --config ./hardhat.config.js",
31
+ "compile:tron": "pnpm lz-tool hardhat compile --config ./hardhat.config.js --network tron-mainnet",
32
+ "compile:zksync": "pnpm lz-tool hardhat compile --config ./hardhat.config.js --network zksync-mainnet",
33
+ "flatten:all": "mkdir -p ./artifacts-flattened-contracts/contracts && pnpm flatten:proxyadmin2step && pnpm flatten:transparentupgradeableproxy2step",
34
+ "flatten:proxyadmin2step": "pnpm exec lz-tool -e sol_merger.sh hardhat ./contracts/ProxyAdmin2Step.sol ./artifacts-flattened-contracts/contracts/ProxyAdmin2Step.flattened.sol",
35
+ "flatten:transparentupgradeableproxy2step": "pnpm exec lz-tool -e sol_merger.sh hardhat ./contracts/TransparentUpgradeableProxy2Step.sol ./artifacts-flattened-contracts/contracts/TransparentUpgradeableProxy2Step.flattened.sol",
36
+ "generated:clean": "rm -rf ./artifacts* ./hh-cache* ./out ./cache",
37
+ "lint": "solhint --config solhint.config.js 'contracts/**/*.sol' 'test/**/*.sol' --fix --noPrompt",
38
+ "test": "pnpm lz-tool forge test",
39
+ "test:snapshot:check": "pnpm exec turbo-snapshot check",
40
+ "test:snapshot:update": "pnpm exec turbo-snapshot update"
41
+ }
42
+ }
@@ -0,0 +1,3 @@
1
+ const baseConfig = require('@layerzerolabs/solhint-configuration');
2
+
3
+ module.exports = baseConfig;
@@ -0,0 +1,276 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.22;
3
+
4
+ import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
5
+ import { Ownable2Step } from "@openzeppelin/contracts/access/Ownable2Step.sol";
6
+ import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
7
+ import { ERC1967Utils } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol";
8
+ import { ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
9
+ import { Test } from "forge-std/Test.sol";
10
+
11
+ import { IProxyAdmin2Step } from "../contracts/interfaces/IProxyAdmin2Step.sol";
12
+ import { ProxyAdmin2Step } from "../contracts/ProxyAdmin2Step.sol";
13
+ import { TransparentUpgradeableProxy2Step } from "../contracts/TransparentUpgradeableProxy2Step.sol";
14
+
15
+ contract ImplementationV1 {
16
+ uint256 public value;
17
+ bool public initialized;
18
+
19
+ function initialize() external {
20
+ initialized = true;
21
+ }
22
+
23
+ function setValue(uint256 _value) external {
24
+ value = _value;
25
+ }
26
+ }
27
+
28
+ contract ImplementationV2 {
29
+ uint256 public value;
30
+
31
+ function setValue(uint256 _value) external {
32
+ value = _value * 2;
33
+ }
34
+ }
35
+
36
+ contract TransparentUpgradeableProxy2StepTest is Test {
37
+ ImplementationV1 implV1;
38
+ ImplementationV2 implV2;
39
+ TransparentUpgradeableProxy2Step proxy;
40
+ ProxyAdmin2Step proxyAdmin;
41
+
42
+ address alice = makeAddr("alice");
43
+ address bob = makeAddr("bob");
44
+ address charlie = makeAddr("charlie");
45
+ address dave = makeAddr("dave");
46
+
47
+ function _getProxyAdminAddress(address _proxy) internal view returns (address) {
48
+ bytes32 adminSlot = vm.load(_proxy, ERC1967Utils.ADMIN_SLOT);
49
+ return address(uint160(uint256(adminSlot)));
50
+ }
51
+
52
+ function setUp() public {
53
+ implV1 = new ImplementationV1();
54
+ implV2 = new ImplementationV2();
55
+
56
+ proxy = new TransparentUpgradeableProxy2Step(
57
+ address(implV1),
58
+ dave,
59
+ abi.encodeCall(ImplementationV1.initialize, ())
60
+ );
61
+ proxyAdmin = ProxyAdmin2Step(_getProxyAdminAddress(address(proxy)));
62
+ }
63
+
64
+ // ============ Constructor ============
65
+
66
+ function test_constructor_DeploysProxyAdmin2StepOwnedByInitialOwner() public view {
67
+ assertEq(proxyAdmin.owner(), dave);
68
+ assertEq(proxyAdmin.pendingOwner(), address(0));
69
+ assertEq(ImplementationV1(address(proxy)).value(), 0);
70
+ assertTrue(ImplementationV1(address(proxy)).initialized());
71
+ }
72
+
73
+ function test_constructor_RevertsOnEmptyData() public {
74
+ vm.expectRevert(ERC1967Proxy.ERC1967ProxyUninitialized.selector);
75
+ new TransparentUpgradeableProxy2Step(address(implV1), dave, "");
76
+ }
77
+
78
+ // ============ transferOwnership ============
79
+
80
+ function test_transferOwnership_Success() public {
81
+ vm.expectEmit(true, true, true, true, address(proxyAdmin));
82
+ emit Ownable2Step.OwnershipTransferStarted(dave, alice);
83
+
84
+ vm.prank(dave);
85
+ proxyAdmin.transferOwnership(alice);
86
+
87
+ assertEq(proxyAdmin.owner(), dave);
88
+ assertEq(proxyAdmin.pendingOwner(), alice);
89
+ }
90
+
91
+ function test_transferOwnership_Success_OverwritesPending() public {
92
+ vm.prank(dave);
93
+ proxyAdmin.transferOwnership(alice);
94
+ assertEq(proxyAdmin.pendingOwner(), alice);
95
+
96
+ vm.prank(dave);
97
+ proxyAdmin.transferOwnership(bob);
98
+ assertEq(proxyAdmin.owner(), dave);
99
+ assertEq(proxyAdmin.pendingOwner(), bob);
100
+ }
101
+
102
+ function test_transferOwnership_Success_CancelsBySettingZero() public {
103
+ vm.prank(dave);
104
+ proxyAdmin.transferOwnership(alice);
105
+ assertEq(proxyAdmin.pendingOwner(), alice);
106
+
107
+ vm.expectEmit(true, true, true, true, address(proxyAdmin));
108
+ emit Ownable2Step.OwnershipTransferStarted(dave, address(0));
109
+
110
+ vm.prank(dave);
111
+ proxyAdmin.transferOwnership(address(0));
112
+
113
+ assertEq(proxyAdmin.owner(), dave);
114
+ assertEq(proxyAdmin.pendingOwner(), address(0));
115
+
116
+ vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, alice));
117
+ vm.prank(alice);
118
+ proxyAdmin.acceptOwnership();
119
+ }
120
+
121
+ function test_transferOwnership_Revert_Unauthorized() public {
122
+ vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, alice));
123
+ vm.prank(alice);
124
+ proxyAdmin.transferOwnership(bob);
125
+ }
126
+
127
+ function test_transferOwnership_Fuzz(address _newOwner) public {
128
+ vm.prank(dave);
129
+ proxyAdmin.transferOwnership(_newOwner);
130
+
131
+ assertEq(proxyAdmin.pendingOwner(), _newOwner);
132
+ assertEq(proxyAdmin.owner(), dave);
133
+ }
134
+
135
+ // ============ acceptOwnership ============
136
+
137
+ function test_acceptOwnership_Success() public {
138
+ vm.prank(dave);
139
+ proxyAdmin.transferOwnership(alice);
140
+
141
+ vm.expectEmit(true, true, true, true, address(proxyAdmin));
142
+ emit Ownable.OwnershipTransferred(dave, alice);
143
+
144
+ vm.prank(alice);
145
+ proxyAdmin.acceptOwnership();
146
+
147
+ assertEq(proxyAdmin.owner(), alice);
148
+ assertEq(proxyAdmin.pendingOwner(), address(0));
149
+ }
150
+
151
+ function test_acceptOwnership_Revert_NotPendingOwner() public {
152
+ vm.prank(dave);
153
+ proxyAdmin.transferOwnership(alice);
154
+
155
+ vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, bob));
156
+ vm.prank(bob);
157
+ proxyAdmin.acceptOwnership();
158
+
159
+ assertEq(proxyAdmin.owner(), dave);
160
+ assertEq(proxyAdmin.pendingOwner(), alice);
161
+ }
162
+
163
+ function test_acceptOwnership_Revert_NoPendingTransfer() public {
164
+ vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, alice));
165
+ vm.prank(alice);
166
+ proxyAdmin.acceptOwnership();
167
+ }
168
+
169
+ function test_acceptOwnership_Fuzz(address _newOwner) public {
170
+ vm.assume(_newOwner != address(0));
171
+ vm.assume(_newOwner != dave);
172
+
173
+ vm.prank(dave);
174
+ proxyAdmin.transferOwnership(_newOwner);
175
+ vm.prank(_newOwner);
176
+ proxyAdmin.acceptOwnership();
177
+
178
+ assertEq(proxyAdmin.owner(), _newOwner);
179
+ assertEq(proxyAdmin.pendingOwner(), address(0));
180
+
181
+ vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, dave));
182
+ vm.prank(dave);
183
+ proxyAdmin.upgradeAndCall(ITransparentUpgradeableProxy(address(proxy)), address(implV2), "");
184
+
185
+ vm.prank(_newOwner);
186
+ proxyAdmin.upgradeAndCall(ITransparentUpgradeableProxy(address(proxy)), address(implV2), "");
187
+ assertEq(address(uint160(uint256(vm.load(address(proxy), ERC1967Utils.IMPLEMENTATION_SLOT)))), address(implV2));
188
+ }
189
+
190
+ function test_acceptOwnership_Fuzz_Revert_NotPendingOwner(address _newOwner, address _caller) public {
191
+ vm.assume(_newOwner != address(0));
192
+ vm.assume(_caller != _newOwner);
193
+
194
+ vm.prank(dave);
195
+ proxyAdmin.transferOwnership(_newOwner);
196
+
197
+ vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, _caller));
198
+ vm.prank(_caller);
199
+ proxyAdmin.acceptOwnership();
200
+
201
+ assertEq(proxyAdmin.owner(), dave);
202
+ assertEq(proxyAdmin.pendingOwner(), _newOwner);
203
+ }
204
+
205
+ // ============ upgradeAndCall ============
206
+
207
+ function test_upgradeAndCall_Success() public {
208
+ vm.prank(dave);
209
+ proxyAdmin.upgradeAndCall(ITransparentUpgradeableProxy(address(proxy)), address(implV2), "");
210
+
211
+ ImplementationV2(address(proxy)).setValue(4);
212
+ assertEq(ImplementationV2(address(proxy)).value(), 8);
213
+ }
214
+
215
+ function test_upgradeAndCall_Success_AfterOwnershipTransfer() public {
216
+ vm.prank(dave);
217
+ proxyAdmin.transferOwnership(alice);
218
+ vm.prank(alice);
219
+ proxyAdmin.acceptOwnership();
220
+
221
+ vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, dave));
222
+ vm.prank(dave);
223
+ proxyAdmin.upgradeAndCall(ITransparentUpgradeableProxy(address(proxy)), address(implV2), "");
224
+
225
+ vm.prank(alice);
226
+ proxyAdmin.upgradeAndCall(ITransparentUpgradeableProxy(address(proxy)), address(implV2), "");
227
+
228
+ ImplementationV2(address(proxy)).setValue(3);
229
+ assertEq(ImplementationV2(address(proxy)).value(), 6);
230
+ }
231
+
232
+ function test_upgradeAndCall_Revert_Unauthorized() public {
233
+ vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, charlie));
234
+ vm.prank(charlie);
235
+ proxyAdmin.upgradeAndCall(ITransparentUpgradeableProxy(address(proxy)), address(implV2), "");
236
+ }
237
+
238
+ // ============ Fallback ============
239
+
240
+ function test_fallback_Revert_ProxyDeniedAdminAccess() public {
241
+ vm.expectRevert(TransparentUpgradeableProxy2Step.ProxyDeniedAdminAccess.selector);
242
+ vm.prank(address(proxyAdmin));
243
+ ImplementationV1(address(proxy)).setValue(1);
244
+ }
245
+
246
+ // ============ renounceOwnership ============
247
+
248
+ function test_renounceOwnership_Revert() public {
249
+ vm.expectRevert(IProxyAdmin2Step.CannotRenounceOwnership.selector);
250
+ vm.prank(dave);
251
+ proxyAdmin.renounceOwnership();
252
+
253
+ assertEq(proxyAdmin.owner(), dave);
254
+ assertEq(proxyAdmin.pendingOwner(), address(0));
255
+ }
256
+
257
+ function test_renounceOwnership_Revert_DuringPendingTransfer() public {
258
+ vm.prank(dave);
259
+ proxyAdmin.transferOwnership(alice);
260
+
261
+ vm.expectRevert(IProxyAdmin2Step.CannotRenounceOwnership.selector);
262
+ vm.prank(dave);
263
+ proxyAdmin.renounceOwnership();
264
+
265
+ assertEq(proxyAdmin.owner(), dave);
266
+ assertEq(proxyAdmin.pendingOwner(), alice);
267
+ }
268
+
269
+ function test_renounceOwnership_Fuzz_Revert(address _caller) public {
270
+ vm.expectRevert(IProxyAdmin2Step.CannotRenounceOwnership.selector);
271
+ vm.prank(_caller);
272
+ proxyAdmin.renounceOwnership();
273
+
274
+ assertEq(proxyAdmin.owner(), dave);
275
+ }
276
+ }