请注意,还有其他函数的,但我很快发现它们并不相关。现在,我需要解决我要如何选择偿还哪些贷款,以及这样做我需要多少 sETH/sUSD。以下的函数开启工作所需的大部分东西:
然而,存在两个隐藏的困难。首先,这些合约不会告诉你哪些地址有未偿还的贷款,这给我带来一定难度。几分钟内,我找到一个解决方法,就是在 Etherscan 上下载所有与这些合约想法 u 你的交易,并用 Excel 创建一个与这些合约交互过的唯一账户列表。从那里,我建立了以下管道:
第二个难题是偿还一笔贷款能拿回多少抵押的 ETH 并不能马上了解。因为有未偿贷款的函数,你可以粗略估算到,但我需要更精确的数据。要实现这点,我研究了偿还贷款的代码,并了解清楚相关数字是如何产生的。 以上的所有数据都是我可以在链上获取或计算的。但这样做太耗费 gas 了。由于我将与别人竞争合约的 gas 效率,对我来说,尽可能地把逻辑移到链下,以最小化 gas 消耗是极其重要的。 经过几次迭代后,我知道我需要从链上获取的最小数据量,这是我可以链下解析的一些变量,以告知我在智能合约上输入的内容。但是,获取这个信息的函数非常复杂,而且查询所有贷款所花的时间比处理一个区块的时间还长。这是不可行的。为了解决这个问题,我写了一份简短的智能合约,把许多数据请求集中在一起,这提高了超过 10 倍的速度。这是其中一个函数: function batchGetLoanInformation(address[] calldata _addresses, uint256[] calldata _loanIDs, address _contractAddress) external view returns ( uint256[] memory totalRepayment = new uint256[](_addresses.length); uint256[] memory totalCollateralLiquidated = new uint256[](_addresses.length); for (uint i = 0; i < _addresses.length; i++){ uint loanAmount; uint accruedInterest; (,, loanAmount,,,, accruedInterest, ) = collateralContract(_contractAddress).getLoan(_addresses[i], _loanIDs[i]); totalRepayment[i] = loanAmount + accruedInterest; totalCollateralLiquidated[i] = getCollateralAmountSUSD(sUSD, totalRepayment[i], COLLATERAL); } return (totalRepayment, totalCollateralLiquidated); } (责任编辑:admin) |