| 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
                        ));
    }
}
  |