mirror of
https://github.com/Instadapp/assembly.git
synced 2024-07-29 22:37:06 +00:00
105 lines
2.7 KiB
TypeScript
105 lines
2.7 KiB
TypeScript
import {
|
|
defineStrategy,
|
|
StrategyProtocol,
|
|
StrategyComponentType,
|
|
defineStrategyComponent
|
|
} from "../../helpers";
|
|
|
|
export default defineStrategy({
|
|
protocol: StrategyProtocol.LIQUITY,
|
|
name: "Close Trove",
|
|
description:
|
|
"Close trove: Payback debt, withdraw Collateral & Liquidation Reserve.",
|
|
author: "Instadapp Team",
|
|
|
|
submitText: "Close Trove",
|
|
|
|
details: `<p class="text-center">This strategy executes:</p>
|
|
<ul>
|
|
<li>Close Trove</li>
|
|
</ul>`,
|
|
|
|
components: [
|
|
defineStrategyComponent({
|
|
type: StrategyComponentType.HEADING,
|
|
name: "Payback"
|
|
}),
|
|
defineStrategyComponent({
|
|
type: StrategyComponentType.VALUE,
|
|
name: "Net Debt",
|
|
update: ({ position, positionExtra, component, formatting, toBN }) => {
|
|
const troveOverallDetails = positionExtra["troveOverallDetails"];
|
|
|
|
const netDebt = toBN(position.debt).minus(
|
|
troveOverallDetails.liquidationReserve
|
|
);
|
|
|
|
component.value = `${formatting.formatDecimal(netDebt, 2)} LUSD`;
|
|
}
|
|
}),
|
|
defineStrategyComponent({
|
|
type: StrategyComponentType.HEADING,
|
|
name: "Withdraw"
|
|
}),
|
|
defineStrategyComponent({
|
|
type: StrategyComponentType.VALUE,
|
|
name: "Collateral",
|
|
update: ({ position, component, formatting }) => {
|
|
component.value = `${formatting.formatDecimal(position.collateral, 2)} ETH`;
|
|
}
|
|
}),
|
|
defineStrategyComponent({
|
|
type: StrategyComponentType.VALUE,
|
|
name: "Liquidation Reserve",
|
|
update: ({ positionExtra, component, formatting }) => {
|
|
const troveOverallDetails = positionExtra["troveOverallDetails"];
|
|
component.value = `${formatting.formatDecimal(
|
|
troveOverallDetails.liquidationReserve,
|
|
2
|
|
)} LUSD`;
|
|
}
|
|
})
|
|
],
|
|
|
|
validate: async ({
|
|
position,
|
|
positionExtra,
|
|
toBN,
|
|
getTokenByKey,
|
|
dsaBalances
|
|
}) => {
|
|
const troveOpened =
|
|
!toBN(position.collateral).isZero() && !toBN(position.debt).isZero();
|
|
|
|
if (!troveOpened) {
|
|
return "You should open new trove first";
|
|
}
|
|
|
|
const troveOverallDetails = positionExtra["troveOverallDetails"];
|
|
|
|
const netDebt = toBN(position.debt).minus(
|
|
troveOverallDetails.liquidationReserve
|
|
);
|
|
|
|
const debtToken = getTokenByKey("lusd");
|
|
const debtTokenBalance = dsaBalances[debtToken.address].balance;
|
|
|
|
if (toBN(position.debt).gt(debtTokenBalance)) {
|
|
const lackOfBalance = netDebt.minus(debtTokenBalance).toPrecision(6, 0);
|
|
return `You need ${lackOfBalance} ${debtToken.symbol} more to close your Trove.`;
|
|
}
|
|
},
|
|
|
|
spells: async () => {
|
|
const setId = 0;
|
|
|
|
return [
|
|
{
|
|
connector: "LIQUITY-A",
|
|
method: "close",
|
|
args: [setId]
|
|
}
|
|
];
|
|
}
|
|
});
|