DECOMPILED SOLIDITY (Heimdall)
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
/// @title Decompiled Contract
/// @author Jonathan Becker <jonathan@jbecker.dev>
/// @custom:version heimdall-rs v0.9.2
///
/// @notice This contract was decompiled using the heimdall-rs decompiler.
/// It was generated directly by tracing the EVM opcodes from this contract.
/// As a result, it may not compile or even be valid solidity code.
/// Despite this, it should be obvious what each function does. Overall
/// logic should have been preserved throughout decompiling.
///
/// @custom:github You can find the open-source decompiler here:
/// https://heimdall.rs
contract DecompiledContract {
bool public constant isCToken = 0xBool(true);
mapping(bytes32 => bytes32) storage_map_w;
uint256 public reserveFactorMantissa;
mapping(bytes32 => bytes32) storage_map_q;
mapping(bytes32 => bytes32) storage_map_s;
uint256 public borrowIndex;
mapping(bytes32 => bytes32) storage_map_af;
mapping(bytes32 => bytes32) storage_map_ac;
uint256 public unresolved_18160ddd;
address public pendingAdmin;
mapping(bytes32 => bytes32) storage_map_b;
bytes32 store_e;
address public comptroller;
uint256 public decimals;
uint256 public totalBorrows;
mapping(bytes32 => bytes32) storage_map_x;
uint256 public totalReserves;
uint256 public exchangeRateCurrent;
address public admin;
mapping(bytes32 => bytes32) storage_map_o;
mapping(bytes32 => bytes32) storage_map_v;
mapping(bytes32 => bytes32) storage_map_ah;
uint256 public accrualBlockNumber;
bytes32 store_z;
mapping(bytes32 => bytes32) storage_map_ab;
mapping(bytes32 => bytes32) storage_map_g;
mapping(bytes32 => bytes32) storage_map_ad;
mapping(bytes32 => bytes32) storage_map_t;
address public interestRateModel;
mapping(bytes32 => bytes32) storage_map_aa;
string public unresolved_06fdde03;
mapping(bytes32 => bytes32) storage_map_m;
mapping(bytes32 => bytes32) storage_map_ag;
mapping(bytes32 => bytes32) storage_map_u;
mapping(bytes32 => bytes32) storage_map_l;
event NewPendingAdmin(address, address);
event Transfer(address, address, uint256);
event NewAdmin(address, address);
event NewMarketInterestRateModel(address, address);
event Event_8c5be1e5();
event LiquidateBorrow(address, address, uint256, address, uint256);
event Failure(uint256, uint256, uint256);
event NewComptroller(address, address);
/// @custom:selector 0x095ea7b3
/// @custom:signature Unresolved_095ea7b3(address arg0, uint256 arg1) public returns (bool)
/// @param arg0 ["address", "uint160", "bytes20", "int160"]
/// @param arg1 ["uint256", "bytes32", "int256"]
function Unresolved_095ea7b3(address arg0, uint256 arg1) public returns (bool) {
var_a = address(arg0);
storage_map_b[var_a] = arg1;
emit Event_8c5be1e5(msg.sender, address(arg0), arg1);
return 0x01;
}
/// @custom:selector 0xe9c714f2
/// @custom:signature _acceptAdmin() public returns (uint256)
function _acceptAdmin() public returns (uint256) {
if (!msg.sender == (address(pendingAdmin))) {
if (msg.sender == (address(pendingAdmin))) {
if (!0x01 > 0x10) {
if (!0 > 0x4d) {
emit Failure(0x01, 0, 0);
if (!0x01 > 0x10) {
return 0x01;
admin = (address(pendingAdmin)) | (uint96(admin));
pendingAdmin = uint96(pendingAdmin);
emit NewAdmin(address(admin), address(pendingAdmin | (uint96(admin))));
emit NewPendingAdmin(address(pendingAdmin), address(pendingAdmin));
return 0;
if (msg.sender) {
admin = (address(pendingAdmin)) | (uint96(admin));
pendingAdmin = uint96(pendingAdmin);
emit NewAdmin(address(admin), address(pendingAdmin | (uint96(admin))));
emit NewPendingAdmin(address(pendingAdmin), address(pendingAdmin));
return 0;
}
}
}
}
}
}
}
/// @custom:selector 0x3b1d21a2
/// @custom:signature getCash() public view returns (uint256)
function getCash() public view returns (uint256) {
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
return 0;
}
/// @custom:selector 0xa9059cbb
/// @custom:signature transfer(address arg0, uint256 arg1) public returns (bool)
/// @param arg0 ["address", "uint160", "bytes20", "int160"]
/// @param arg1 ["uint256", "bytes32", "int256"]
function transfer(address arg0, uint256 arg1) public returns (bool) {
store_e = 0x01 + store_e;
address var_b = address(this);
require(address(comptroller).code.length);
(bool success, bytes memory ret0) = address(comptroller).{ value: 0 ether }Unresolved_bdcdc258(var_b); // call
require(!ret0.length < 0x20);
require(!var_f.length);
require(!(address(msg.sender)) == (address(arg0)));
require(!(address(msg.sender)) == (address(msg.sender)));
var_g = address(msg.sender);
require(arg1 > storage_map_g[var_g]);
require(!0x03 > 0x03);
require(0x03 == 0);
var_g = address(msg.sender);
require(arg1 > storage_map_g[var_g]);
require(!0x03 > 0x03);
require(0x03 == 0);
var_g = address(arg0);
require((arg1 + storage_map_g[var_g]) < storage_map_g[var_g]);
require(!0x02 > 0x03);
require(0x02 == 0);
var_g = address(msg.sender);
storage_map_g[var_g] = 0;
var_g = address(arg0);
storage_map_g[var_g] = 0;
require(storage_map_g[var_g] == 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
var_g = var_g;
emit Transfer(address(msg.sender), address(arg0), arg1);
var_b = address(this);
require(address(comptroller).code.length);
(bool success, bytes memory ret0) = address(comptroller).{ value: storage_map_g[var_g] ether }Unresolved_6a56947e(var_b); // call
require((0x01 + store_e) == store_e, "re-entered");
return !(!0 == 0);
require(!(0x09 > 0x10), "re-entered");
require(!(0x4d > 0x4d), "re-entered");
emit Failure(0x09, 0x4d, 0);
require(!(0x09 > 0x10), "re-entered");
require((0x01 + store_e) == store_e, "re-entered");
return !(!0x09 == 0);
require(!(0x09 > 0x10), "re-entered");
require(!(0x09 > 0x10), "re-entered");
require(!(0x03 > 0x10), "re-entered");
require(!(0x4a > 0x4d), "re-entered");
emit Failure(0x03, 0x4a, var_f.length);
require(!(0x03 > 0x10), "re-entered");
require((0x01 + store_e) == store_e, "re-entered");
return !(!0x03 == 0);
}
/// @custom:selector 0x601a0bf1
/// @custom:signature _reduceReserves(uint256 arg0) public returns (uint256)
/// @param arg0 ["uint256", "bytes32", "int256"]
function _reduceReserves(uint256 arg0) public returns (uint256) {
store_e = 0x01 + store_e;
var_a = 0x20 + var_a;
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
uint256 var_n = 0;
require(address(interestRateModel).code.length);
(bool success, bytes memory ret0) = address(interestRateModel).Unresolved_15f24053(var_n); // staticcall
require(!(ret0.length < 0x40), "borrow rate is absurdly high");
require(!(0x01c6bf52634000 < (var_q)), "borrow rate is absurdly high");
require(!(var_r), "re-entered");
require(!(0x05 > 0x10), "re-entered");
require(!(0x02 > 0x4d), "re-entered");
emit Failure(0x05, 0x02, var_q);
require(!(0x05 > 0x10), "re-entered");
require(!0x05, "re-entered");
require(msg.sender == (address(admin)), "re-entered");
require(!(0x01 > 0x10), "re-entered");
require(!(0x31 > 0x4d), "re-entered");
emit Failure(0x01, 0x31, 0);
require(!(0x01 > 0x10), "re-entered");
require((0x01 + store_e) == store_e, "re-entered");
return 0x01;
require(accrualBlockNumber == block.number, "reduce reserves unexpected underflow");
require(msg.value > address(this).balance, "reduce reserves unexpected underflow");
require(!(0x03 > 0x03), "reduce reserves unexpected underflow");
require(0x03 == 0, "reduce reserves unexpected underflow");
require(!(0 < arg0), "reduce reserves unexpected underflow");
require(!(arg0 > totalReserves), "reduce reserves unexpected underflow");
require(!((totalReserves - arg0) > totalReserves), "reduce reserves unexpected underflow");
totalReserves = totalReserves - arg0;
(bool success, bytes memory ret0) = address(admin).transfer(arg0);
require(!(0 > 0x10), "reduce reserves transfer out failed");
require(0 == 0, "reduce reserves transfer out failed");
require(!0x05 > 0x10);
}
/// @custom:selector 0x17bfdfbc
/// @custom:signature borrowBalanceCurrent(address arg0) public returns (uint256)
/// @param arg0 ["address", "uint160", "bytes20", "int160"]
function borrowBalanceCurrent(address arg0) public returns (uint256) {
store_e = 0x01 + store_e;
uint256 var_f = 0;
var_a = 0x20 + var_a;
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
uint256 var_n = 0;
require(address(interestRateModel).code.length);
(bool success, bytes memory ret0) = address(interestRateModel).Unresolved_15f24053(var_n); // staticcall
require(!(ret0.length < 0x40), "borrow rate is absurdly high");
require(!(0x01c6bf52634000 < (var_q)), "borrow rate is absurdly high");
require(!(var_r), "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(!(0x05 > 0x10), "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(!(0x02 > 0x4d), "borrowBalanceStored: borrowBalanceStoredInternal failed");
emit Failure(0x05, 0x02, var_q);
require(!(0x05 > 0x10), "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(0x05 == 0, "borrowBalanceStored: borrowBalanceStoredInternal failed");
address var_u = address(arg0);
require(storage_map_l[var_u], "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(storage_map_m[var_u], "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(storage_map_m[var_u], "borrowBalanceStored: borrowBalanceStoredInternal failed");
require((borrowIndex * (storage_map_m[var_u])) / (storage_map_m[var_u]) == borrowIndex, "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(!(0x02 > 0x03), "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(0x02 == 0, "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(storage_map_o[var_u], "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(storage_map_o[var_u], "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(!(0 > 0x03), "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(0 == 0, "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(!(0 > 0x03), "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(0 == 0, "borrowBalanceStored: borrowBalanceStoredInternal failed");
require((0x01 + store_e) == store_e, "re-entered");
return 0;
require(!(0 > 0x03), "borrowBalanceStored: borrowBalanceStoredInternal failed");
require(0 == 0, "borrowBalanceStored: borrowBalanceStoredInternal failed");
require((0x01 + store_e) == store_e, "re-entered");
return var_f / (storage_map_o[var_u]);
}
/// @custom:selector 0x3af9e669
/// @custom:signature balanceOfUnderlying(address arg0) public returns (uint256)
/// @param arg0 ["address", "uint160", "bytes20", "int160"]
function balanceOfUnderlying(address arg0) public returns (uint256) {
store_e = 0x01 + store_e;
var_a = 0x20 + var_a;
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
uint256 var_o = 0;
require(address(interestRateModel).code.length);
(bool success, bytes memory ret0) = address(interestRateModel).Unresolved_15f24053(var_o); // staticcall
require(!(ret0.length < 0x40), "borrow rate is absurdly high");
require(!(0x01c6bf52634000 < (var_r)), "borrow rate is absurdly high");
require(!var_s);
require(!0x05 > 0x10);
require(!0x02 > 0x4d);
emit Failure(0x05, 0x02, var_r);
require(!0x05 > 0x10);
require(0x05 == 0);
require(!0 == unresolved_18160ddd);
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
require(!(0 > 0x03), "exchangeRateStored: exchangeRateStoredInternal failed");
require(0 == 0, "exchangeRateStored: exchangeRateStoredInternal failed");
require((0x01 + store_e) == store_e, "re-entered");
var_o = 0x20;
address var_x = address(arg0);
require(var_z);
require(var_z);
require(storage_map_q[var_x] * (var_z) / (var_z) == storage_map_q[var_x]);
require(!0x02 > 0x03);
require(0x02 == 0);
var_a = var_a + 0x20;
require(!0 > 0x03);
require(0 == 0);
require(!0 > 0x03);
require(0 == 0);
return 0;
require(!0 > 0x03);
require(0 == 0);
return var_a.length / 0x0de0b6b3a7640000;
}
/// @custom:selector 0xdb006a75
/// @custom:signature redeem(uint256 arg0) public returns (uint256)
/// @param arg0 ["uint256", "bytes32", "int256"]
function redeem(uint256 arg0) public returns (uint256) {
store_e = 0x01 + store_e;
var_a = 0x20 + var_a;
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
uint256 var_n = 0;
require(address(interestRateModel).code.length);
(bool success, bytes memory ret0) = address(interestRateModel).Unresolved_15f24053(var_n); // staticcall
require(!(ret0.length < 0x40), "borrow rate is absurdly high");
require(!(0x01c6bf52634000 < (var_q)), "borrow rate is absurdly high");
require(!(var_r), "one of redeemTokensIn or redeemAmountIn must be zero");
require(!(0x05 > 0x10), "one of redeemTokensIn or redeemAmountIn must be zero");
require(!(0x02 > 0x4d), "one of redeemTokensIn or redeemAmountIn must be zero");
emit Failure(0x05, 0x02, var_q);
require(!(0x05 > 0x10), "one of redeemTokensIn or redeemAmountIn must be zero");
require(!0x05, "one of redeemTokensIn or redeemAmountIn must be zero");
require(!arg0, "one of redeemTokensIn or redeemAmountIn must be zero");
require(!0, "one of redeemTokensIn or redeemAmountIn must be zero");
require(!0 == unresolved_18160ddd);
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
require(!(0 > 0x03), "re-entered");
require(!(0 > 0x03), "re-entered");
require(!(var_q > 0x03), "re-entered");
require(var_q == 0, "re-entered");
require(!(var_q > 0x03), "re-entered");
require(!(0x09 > 0x10), "re-entered");
require(!(0x2b > 0x4d), "re-entered");
emit Failure(0x09, 0x2b, var_q);
require(!(0x09 > 0x10), "re-entered");
require((0x01 + store_e) == store_e, "re-entered");
uint256 var_ac = 0x20;
return 0x09;
require(!arg0);
require(var_ag);
require(var_ag);
require((arg0 * (var_ag)) / (var_ag) == arg0);
require(!0x02 > 0x03);
require(0x02 == 0);
var_a = var_a + 0x20;
require(!0 > 0x03);
require(0 == 0);
require(!0 > 0x03);
require(!0 > 0x03);
var_s = 0;
require(!(var_q) > 0x03);
require(var_q == 0);
require(!(var_q) > 0x03);
require(!0x09 > 0x10);
uint256 var_aj = address(this);
require(address(comptroller).code.length);
(bool success, bytes memory ret0) = address(comptroller).{ value: var_s ether }Unresolved_eabe7d91(var_aj); // call
require(!(ret0.length < 0x20), "re-entered");
require(!var_a.length, "re-entered");
require(accrualBlockNumber == block.number, "re-entered");
require(!(0x0a > 0x10), "re-entered");
require(!(0x2c > 0x4d), "re-entered");
emit Failure(0x0a, 0x2c, 0);
require(!(0x0a > 0x10), "re-entered");
require((0x01 + store_e) == store_e, "re-entered");
return 0x0a;
require(!(0x03 > 0x10), "re-entered");
require(!(0x28 > 0x4d), "re-entered");
emit Failure(0x03, 0x28, var_a.length);
require(!(0x03 > 0x10), "re-entered");
require((0x01 + store_e) == store_e, "re-entered");
var_aj = 0x20;
return 0x03;
if (!0 > 0x03) {
require(!0 > 0x03);
require(!0 > 0x03);
require(0x0de0b6b3a7640000);
require(!0 > 0x03);
}
require(!0x05 > 0x10);
}
/// @custom:selector 0xae9d70b0
/// @custom:signature supplyRatePerBlock() public view
function supplyRatePerBlock() public view {
require(!0 == unresolved_18160ddd);
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
require(!(0 > 0x03), "exchangeRateStored: exchangeRateStoredInternal failed");
require(0 == 0, "exchangeRateStored: exchangeRateStoredInternal failed");
}
/// @custom:selector 0xdd62ed3e
/// @custom:signature Unresolved_dd62ed3e(address arg0, address arg1) public view returns (uint256)
/// @param arg0 ["address", "uint160", "bytes20", "int160"]
/// @param arg1 ["address", "uint160", "bytes20", "int160"]
function Unresolved_dd62ed3e(address arg0, address arg1) public view returns (uint256) {
var_a = address(arg1);
return storage_map_b[var_a];
}
/// @custom:selector 0xf8f9da28
/// @custom:signature borrowRatePerBlock() public returns (uint256)
function borrowRatePerBlock() public returns (uint256) {
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
uint256 var_b = 0;
require(address(interestRateModel).code.length);
(bool success, bytes memory ret0) = address(interestRateModel).Unresolved_15f24053(var_b); // staticcall
require(!(ret0.length < 0x40), "borrowRatePerBlock: interestRateModel.borrowRate failed");
require(!var_e.length, "borrowRatePerBlock: interestRateModel.borrowRate failed");
return var_f;
}
/// @custom:selector 0xc37f68e2
/// @custom:signature getAccountSnapshot(address arg0) public view returns (bytes memory)
/// @param arg0 ["address", "uint160", "bytes20", "int160"]
function getAccountSnapshot(address arg0) public view returns (bytes memory) {
var_a = address(arg0);
require(storage_map_b[var_a]);
require(storage_map_s[var_a]);
require(storage_map_s[var_a]);
require((borrowIndex * (storage_map_s[var_a])) / (storage_map_s[var_a]) == borrowIndex);
require(!0x02 > 0x03);
require(0x02 == 0);
require(storage_map_t[var_a]);
require(!0x01 > 0x03);
require(0x01 == 0);
require(!0 > 0x03);
require(0 == 0);
return abi.encodePacked(0x09, 0, 0, 0);
require(!0 == unresolved_18160ddd);
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
require(!0 > 0x03);
require(0 == 0);
return abi.encodePacked(0x09, 0, 0, 0);
return abi.encodePacked(0, storage_map_b[var_a], 0, exchangeRateCurrent);
}
/// @custom:selector 0xe5974619
/// @custom:signature repayBorrowBehalf(address arg0) public payable
/// @param arg0 ["address", "uint160", "bytes20", "int160"]
function repayBorrowBehalf(address arg0) public payable {
store_e = 0x01 + store_e;
uint256 var_f = 0;
var_a = 0x20 + var_a;
require(msg.value > address(this).balance);
require(!0x03 > 0x03);
require(0x03 == 0);
uint256 var_n = 0;
require(address(interestRateModel).code.length);
(bool success, bytes memory ret0) = address(interestRateModel).Unresolved_15f24053(var_n); // staticcall
require(!(ret0.length < 0x40), "borrow rate is absurdly high");
require(!(0x01c6bf52634000 < (var_q)), "borrow rate is absurdly high");
require(!var_r);
require(!0x05 > 0x10);
require(!0x02 > 0x4d);
emit Failure(0x05, 0x02, var_q);
require(!0x05 > 0x10);
require(!0x05);
var_n = address(this);
address var_o = address(msg.sender);
address var_p = address(arg0);
require(address(comptroller).code.length);
(bool success, bytes memory ret0) = address(comptroller).{ value: var_f ether }Unresolved_24008a62(var_n, var_o, var_p); // call
require(!(ret0.length < 0x20), "re-entered");
require(!var_a.length, "re-entered");
require(accrualBlockNumber == block.number, "re-entered");
address var_z = address(arg0);
var_z = address(arg0);
require(storage_map_v[var_z], "re-entered");
require(storage_map_w[var_z], "re-entered");
require(storage_map_w[var_z], "re-entered");
require((borrowIndex * (storage_map_w[var_z])) / (storage_map_w[var_z]) == borrowIndex, "re-entered");
require(!(0x02 > 0x03), "re-entered");
require(0x02 == 0, "re-entered");
require(storage_map_u[var_z], "re-entered");
require(storage_map_u[var_z], "re-entered");
require(!(0 > 0x03), "re-entered");
require(0 == 0, "re-entered");
require(!(0 > 0x03), "re-entered");
require(!(0 > 0x03), "re-entered");
var_s = 0;
require(!(var_q > 0x03), "re-entered");
require(var_q == 0, "re-entered");
require(!(var_q > 0x03), "re-entered");
require(!(0x09 > 0x10), "re-entered");
require(!(0x37 > 0x4d), "re-entered");
emit Failure(0x09, 0x37, var_q);
require(!(0x09 > 0x10), "re-entered");
require((0x01 + store_e) == store_e, "re-entered");
var_a = 0x40 + var_a;
require(0x09, "