| 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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 |
1×
1×
1×
2×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
5×
5×
5×
1×
1×
1×
1×
1×
1×
| // SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "../BaseLogic.sol";
contract TestModule is BaseLogic {
constructor(uint moduleId) BaseLogic(moduleId, bytes32(0)) {}
function setModuleId(address moduleAddr, uint32 id) external {
trustedSenders[moduleAddr].moduleId = id;
}
function setModuleImpl(address moduleAddr, address impl) external {
moduleLookup[trustedSenders[moduleAddr].moduleId] = impl;
trustedSenders[moduleAddr].moduleImpl = impl;
}
function setPricingType(address eToken, uint16 val) external {
eTokenLookup[eToken].pricingType = val;
}
function testCreateProxyOnInternalModule() external {
_createProxy(MAX_EXTERNAL_MODULEID + 1);
}
function testDecreaseBorrow(address eToken, address account, uint amount) external {
AssetStorage storage assetStorage = eTokenLookup[eToken];
AssetCache memory assetCache = loadAssetCache(assetStorage.underlying, assetStorage);
amount = decodeExternalAmount(assetCache, amount);
decreaseBorrow(assetStorage, assetCache, assetStorage.dTokenAddress, account, amount);
}
function testTransferBorrow(address eToken, address from, address to, uint amount) external {
AssetStorage storage assetStorage = eTokenLookup[eToken];
AssetCache memory assetCache = loadAssetCache(assetStorage.underlying, assetStorage);
amount = decodeExternalAmount(assetCache, amount);
transferBorrow(assetStorage, assetCache, assetStorage.dTokenAddress, from, to, amount);
}
function testEmitViaProxyTransfer(address proxyAddr, address from, address to, uint value) external {
emitViaProxy_Transfer(proxyAddr, from, to, value);
}
function testEmitViaProxyApproval(address proxyAddr, address owner, address spender, uint value) external {
emitViaProxy_Approval(proxyAddr, owner, spender, value);
}
function testDispatchEmptyData() external {
trustedSenders[address(this)].moduleId = 200;
(bool success, bytes memory data) = address(this).call(abi.encodeWithSignature("dispatch()"));
Eif (!success) revertBytes(data);
}
function testUnrecognizedETokenCaller() external {
(bool success, bytes memory data) = moduleLookup[MODULEID__ETOKEN].delegatecall(abi.encodeWithSelector(IERC20.totalSupply.selector));
Eif (!success) revertBytes(data);
}
function testUnrecognizedDTokenCaller() external {
(bool success, bytes memory data) = moduleLookup[MODULEID__DTOKEN].delegatecall(abi.encodeWithSelector(IERC20.totalSupply.selector));
Eif (!success) revertBytes(data);
}
function testCall() external {
upgradeAdmin = upgradeAdmin; // suppress visibility warning
}
function issueLogToProxy(bytes memory payload) private {
(, address proxyAddr) = unpackTrailingParams();
(bool success,) = proxyAddr.call(payload);
Erequire(success, "e/log-proxy-fail");
}
function testProxyLogs() external {
bytes memory extraData = "hello";
issueLogToProxy(abi.encodePacked(
uint8(0),
extraData
));
issueLogToProxy(abi.encodePacked(
uint8(1),
bytes32(uint(1)),
extraData
));
issueLogToProxy(abi.encodePacked(
uint8(2),
bytes32(uint(1)),
bytes32(uint(2)),
extraData
));
issueLogToProxy(abi.encodePacked(
uint8(3),
bytes32(uint(1)),
bytes32(uint(2)),
bytes32(uint(3)),
extraData
));
issueLogToProxy(abi.encodePacked(
uint8(4),
bytes32(uint(1)),
bytes32(uint(2)),
bytes32(uint(3)),
bytes32(uint(4)),
extraData
));
}
}
|