diff --git a/terminate/agent.go b/terminate/agent.go index 91c01fa..bb2c0f2 100644 --- a/terminate/agent.go +++ b/terminate/agent.go @@ -7,27 +7,20 @@ import ( ) func (ats PreviewAgentTerminationSummary) LiquidationValue() *big.Int { - // if the termination penalty is greater than the initial pledge, - // OR if the initial pledge is 0, - // we report liquidation value as 0 - if ats.InitialPledge.Cmp(ats.TerminationPenalty) < 0 || ats.InitialPledge.Cmp(big.NewInt(0)) == 0 { - return big.NewInt(0) - } + // total available balance is the sum of the miners available balance and the agent available balance + totalAvailableBalance := new(big.Int).Add(ats.MinersAvailableBal, ats.AgentAvailableBal) - totalAvail := new(big.Int).Add(ats.MinersAvailableBal, ats.AgentAvailableBal) - // first we multiply the available balance by the recovery rate - // recovery rate = (initial pledge - termination penalty) / initial pledge - // discounted avail = (available * initial pledge - available * termination penalty) / initial pledge - availTimesPledge := new(big.Int).Mul(totalAvail, ats.InitialPledge) - availTimesTermPenalty := new(big.Int).Mul(totalAvail, ats.TerminationPenalty) + // we add the total available balance to the vesting balance and initial pledge, subtract the termination penalty to get the liquidation value + totalAssets := new(big.Int).Add(totalAvailableBalance, ats.VestingBalance) + totalAssets.Add(totalAssets, ats.InitialPledge) - discountedAvail := new(big.Int).Sub(availTimesPledge, availTimesTermPenalty) - discountedAvail.Div(discountedAvail, ats.InitialPledge) + // if the total assets is less than or equal the termination penalty, we return 0 + if totalAssets.Cmp(ats.TerminationPenalty) <= 0 { + return big.NewInt(0) + } - // we add the discounted available balance to the vesting balance and initial pledge, subtract the termination penalty to get the liquidation value - liquidationValue := new(big.Int).Add(discountedAvail, ats.VestingBalance) - liquidationValue.Add(liquidationValue, ats.InitialPledge) - liquidationValue.Sub(liquidationValue, ats.TerminationPenalty) + // liquidation value = total assets - termination penalty + liquidationValue := new(big.Int).Sub(totalAssets, ats.TerminationPenalty) return liquidationValue } diff --git a/terminate/agent_test.go b/terminate/agent_test.go index 651b92c..74c0aa4 100644 --- a/terminate/agent_test.go +++ b/terminate/agent_test.go @@ -20,7 +20,7 @@ func TestAgentLiquidationValue(t *testing.T) { MinersAvailableBal: util.ToAtto(big.NewFloat(100)), AgentAvailableBal: util.ToAtto(big.NewFloat(0)), VestingBalance: util.ToAtto(big.NewFloat(100)), - }, util.ToAtto(big.NewFloat(650))}, + }, util.ToAtto(big.NewFloat(700))}, // case 2 - 90% recovery rate, 0 available {PreviewAgentTerminationSummary{ TerminationPenalty: util.ToAtto(big.NewFloat(100)), @@ -52,7 +52,7 @@ func TestAgentLiquidationValue(t *testing.T) { MinersAvailableBal: util.ToAtto(big.NewFloat(50)), AgentAvailableBal: util.ToAtto(big.NewFloat(50)), VestingBalance: util.ToAtto(big.NewFloat(100)), - }, util.ToAtto(big.NewFloat(650))}, + }, util.ToAtto(big.NewFloat(700))}, } for i, tc := range testCases {