集成 Comptroller

介绍

Comptroller 是 JustLend DAO 协议的风险管理模块。 它决定了用户应该保留多少抵押品以避免清算。

Comptroller 作为一个可升级的合约来实现。 入口是 Unitroller; 实施是 Comptroller

相关方法

市场

enterMarkets()

function enterMarkets(address[] memory cTokens) public returns (uint[] memory)

调用此方法会进入一个或多个市场进行抵押或借贷。

参数类型描述

cTokens

address[]

待加入市场的地址列表

返回值:对于每个市场,返回 0 即为成功加入,否则返回相应错误码

const result = comptroller.enterMarket(addresses).send({
  feeLimit:10_000_000_000,
  callValue:0,
  shouldPollResponse:true
});

exitMarket()

function exitMarket(address cTokenAddress) external returns (uint)

调用这个方法将退出后一个当前加入的市场。

参数类型描述

cTokenAddress

address

待退出市场的地址

返回值:成功时返回 0,否则返回相应错误码

const result = comptroller.exitMarket(address).send({
  feeLimit:10_000_000_000,
  callValue:0,
  shouldPollResponse:true
});

getAssetsIn()

function getAssetsIn(address account) external view returns (CToken[] memory)

调用这个方法将返回已加入的市场列表。

参数类型描述

account

address

待查询加入市场信息的地址

返回值:已加入的市场列表

const result = comptroller.getAssetsIn(account).call();

markets()

function markets(address cTokenAddress) view returns (bool, uint, bool)

调用这个方法将返回指定市场的状态(isListed, collateralFactorMantissa, comped)

参数类型描述

cTokenAddress

address

市场地址

返回值类型描述

isListed

bool

是否能被 comptroller 识别

collateralFactorMantissa

uint

可借的数目(乘以 1e18)

comped

bool

借款和抵押人是否能获得 JST 分红

const {0: isListed, 1: collateralFactorMantissa, 2: isComped} = comptroller.markets(address).call();

抵押和清算

getAccountLiquidity()

function getAccountLiquidity(address account) public view returns (uint256, uint256, uint256)

调用这个方法将返回用户的流动性及短缺数(由于comptroller选用无符号的 uint,用 shortfall 来体现短缺)。

参数类型描述

account

address

待查询的地址

返回值类型描述

error

uint

0 时即为成功,否则返回相应错误码

liquidity

uint

当前的流动性

shortfall

uint

流动性短缺。该值不为 0 时表示当前用户可能会被清算

const {0: error, 1: liquidity, 2: shortfall} = comptroller.getAccountLiquidity(account).call();

closeFactorMantissa()

function closeFactorMantissa() view returns (uint256)

调用此方法获取可清算账户应在单次清算中偿还的百分比。范围为 0%-100%。该方法的计算结果适用于单一资产。

返回值:close factor, 乘以 1e18

const result = comptroller.closeFactorMantissa().call();

liquidationIncentiveMantissa()

function liquidationIncentiveMantissa() view returns (uint256)

调用这种方法可以获得清算人的激励,这个激励是针对水下账户的。其中一部分将根据抵押份额分配给 jToken 储备金。

返回值:清算激励,乘以 1e18

const result = comptroller.liquidationIncentiveMantissa().call();

重要事件

事件描述

MarketEntered(address cToken, address account)

成功加入市场时发出

MarketExited(address cToken, address account)

成功退出市场时发出

错误码

序号描述

0

NO_ERROR

成功

1

UNAUTHORIZED

调用者无权限

2

COMPTROLLER_MISMATCH

清算不能由不同的 comptroller执行

3

INSUFFICIENT_SHORTFALL

账户余额不足

4

INSUFFICIENT_LIQUIDITY

账户流动性不足

5

INVALID_CLOSE_FACTOR

close factor 非法

6

INVALID_COLLATERAL_FACTOR

collateral factor 非法

7

INVALID_LIQUIDATION_INCENTIVE

清算激励非法

8

MARKET_NOT_ENTERED

账户尚未加入该市场

9

MARKET_NOT_LISTED

该市场尚未被 comtroller 列出

10

MARKET_ALREADY_LISTED

该市场已被列出

11

MATH_ERROR

数学计算错误

12

NONZERO_BORROW_BALANCE

已有借入余额,无法完成操作

13

PRICE_ERROR

comptroller 无法获取价格

14

REJECTION

comptroller 拒绝了请求

15

SNAPSHOT_ERROR

comptroller 无法从市场上获得账户借款和汇率。

16

TOO_MANY_ASSETS

加入的市场数目超过限制

17

TOO_MUCH_REPAY

偿还数额超过限制

失败信息

序号

0

ACCEPT_ADMIN_PENDING_ADMIN_CHECK

1

ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK

2

EXIT_MARKET_BALANCE_OWED

3

EXIT_MARKET_REJECTION

4

SET_CLOSE_FACTOR_OWNER_CHECK

5

SET_CLOSE_FACTOR_VALIDATION

6

SET_COLLATERAL_FACTOR_OWNER_CHECK

7

SET_COLLATERAL_FACTOR_NO_EXISTS

8

SET_COLLATERAL_FACTOR_VALIDATION

9

SET_COLLATERAL_FACTOR_WITHOUT_PRICE

10

SET_IMPLEMENTATION_OWNER_CHECK

11

SET_LIQUIDATION_INCENTIVE_OWNER_CHECK

12

SET_LIQUIDATION_INCENTIVE_VALIDATION

13

SET_MAX_ASSETS_OWNER_CHECK

14

SET_PENDING_ADMIN_OWNER_CHECK

15

SET_PENDING_IMPLEMENTATION_OWNER_CHECK

16

SET_PRICE_ORACLE_OWNER_CHECK

17

SUPPORT_MARKET_EXISTS

18

SUPPORT_MARKET_OWNER_CHECK

Last updated