add randomSeed assss optional paramter to hint functions

This commit is contained in:
Edward Mulraney 2021-06-26 11:31:34 +01:00
parent 4df8b8bf56
commit b471eab625
2 changed files with 157 additions and 151 deletions

View File

@ -167,18 +167,19 @@ contract Resolver is Helpers {
return System(borrowFee, ethTvl, tcr, isInRecoveryMode); return System(borrowFee, ethTvl, tcr, isInRecoveryMode);
} }
function getTrovePositionHints(uint collateral, uint debt, uint searchIterations) external view returns ( function getTrovePositionHints(uint collateral, uint debt, uint searchIterations, uint randomSeed) external view returns (
address upperHint, address upperHint,
address lowerHint address lowerHint
) { ) {
// See: https://github.com/liquity/dev#supplying-hints-to-trove-operations // See: https://github.com/liquity/dev#supplying-hints-to-trove-operations
uint nominalCr = hintHelpers.computeNominalCR(collateral, debt); uint nominalCr = hintHelpers.computeNominalCR(collateral, debt);
searchIterations = searchIterations == 0 ? mul(10, sqrt(sortedTroves.getSize())) : searchIterations; searchIterations = searchIterations == 0 ? mul(10, sqrt(sortedTroves.getSize())) : searchIterations;
(address hintAddress, ,) = hintHelpers.getApproxHint(nominalCr, searchIterations, 3); randomSeed = randomSeed == 0 ? block.number : randomSeed;
(address hintAddress, ,) = hintHelpers.getApproxHint(nominalCr, searchIterations, randomSeed);
return sortedTroves.findInsertPosition(nominalCr, hintAddress, hintAddress); return sortedTroves.findInsertPosition(nominalCr, hintAddress, hintAddress);
} }
function getRedemptionPositionHints(uint amount, uint oracleEthPrice, uint searchIterations) external view returns ( function getRedemptionPositionHints(uint amount, uint oracleEthPrice, uint searchIterations, uint randomSeed) external view returns (
uint partialHintNicr, uint partialHintNicr,
address firstHint, address firstHint,
address upperHint, address upperHint,
@ -187,7 +188,8 @@ contract Resolver is Helpers {
// See: https://github.com/liquity/dev#hints-for-redeemcollateral // See: https://github.com/liquity/dev#hints-for-redeemcollateral
(firstHint, partialHintNicr, ) = hintHelpers.getRedemptionHints(amount, oracleEthPrice, 0); (firstHint, partialHintNicr, ) = hintHelpers.getRedemptionHints(amount, oracleEthPrice, 0);
searchIterations = searchIterations == 0 ? mul(10, sqrt(sortedTroves.getSize())) : searchIterations; searchIterations = searchIterations == 0 ? mul(10, sqrt(sortedTroves.getSize())) : searchIterations;
(address hintAddress, ,) = hintHelpers.getApproxHint(partialHintNicr, searchIterations, 3); randomSeed = randomSeed == 0 ? block.number : randomSeed;
(address hintAddress, ,) = hintHelpers.getApproxHint(partialHintNicr, searchIterations, randomSeed);
(upperHint, lowerHint) = sortedTroves.findInsertPosition(partialHintNicr, hintAddress, hintAddress); (upperHint, lowerHint) = sortedTroves.findInsertPosition(partialHintNicr, hintAddress, hintAddress);
} }
} }

View File

@ -164,12 +164,14 @@ describe("InstaLiquityResolver", () => {
describe("getTrovePositionHints()", () => { describe("getTrovePositionHints()", () => {
it("returns the upper and lower address of Troves nearest to the given Trove", async () => { it("returns the upper and lower address of Troves nearest to the given Trove", async () => {
const collateral = hre.ethers.utils.parseEther("10"); const collateral = hre.ethers.utils.parseEther("10");
const debt = hre.ethers.utils.parseUnits("5000", 18); const debt = hre.ethers.utils.parseUnits("5000", 18); // 5,000 LUSD
const searchIterations = 10; const searchIterations = 10;
const randomSeed = 3;
const [upperHint, lowerHint] = await liquity.getTrovePositionHints( const [upperHint, lowerHint] = await liquity.getTrovePositionHints(
collateral, collateral,
debt, debt,
searchIterations searchIterations,
randomSeed
); );
expect(upperHint).eq(expectedTrovePositionHints.upperHint); expect(upperHint).eq(expectedTrovePositionHints.upperHint);
@ -182,6 +184,7 @@ describe("InstaLiquityResolver", () => {
const amount = hre.ethers.utils.parseUnits("10000", 18); // 10,000 LUSD const amount = hre.ethers.utils.parseUnits("10000", 18); // 10,000 LUSD
const oracleEthPrice = await liquityPriceOracle.callStatic.fetchPrice(); const oracleEthPrice = await liquityPriceOracle.callStatic.fetchPrice();
const searchIterations = 10; const searchIterations = 10;
const randomSeed = 3;
const [ const [
partialRedemptionHintNicr, partialRedemptionHintNicr,
firstHint, firstHint,
@ -190,7 +193,8 @@ describe("InstaLiquityResolver", () => {
] = await liquity.getRedemptionPositionHints( ] = await liquity.getRedemptionPositionHints(
amount, amount,
oracleEthPrice, oracleEthPrice,
searchIterations searchIterations,
randomSeed
); );
expect(partialRedemptionHintNicr).eq( expect(partialRedemptionHintNicr).eq(