Skip to content

Commit 9952e03

Browse files
committed
fix: feedback comments
1 parent b59c390 commit 9952e03

File tree

8 files changed

+137
-85
lines changed

8 files changed

+137
-85
lines changed

internal/entities/liquidity_provider/configuration.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,14 @@ func (et *ExcessTolerance) Normalize() {
8888
}
8989
}
9090

91+
func (et *ExcessTolerance) ComputeThreshold(target *entities.Wei) *entities.Wei {
92+
if et.IsFixed {
93+
return new(entities.Wei).Add(target, et.FixedValue)
94+
}
95+
thresholdBigInt := utils.ApplyPercentageIncrease(target.AsBigInt(), et.PercentageValue.Native())
96+
return entities.NewBigWei(thresholdBigInt)
97+
}
98+
9199
func (et *ExcessTolerance) Validate() error {
92100
if et.IsFixed && et.FixedValue.Cmp(entities.NewWei(0)) <= 0 {
93101
return fmt.Errorf("%w: if excess tolerance is fixed, fixed value must be greater than zero", InvalidConfigurationError)

internal/entities/liquidity_provider/configuration_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,63 @@ func TestExcessTolerance_Normalize(t *testing.T) {
156156
}
157157
}
158158

159+
func TestExcessTolerance_ComputeThreshold(t *testing.T) {
160+
type input struct {
161+
tolerance liquidity_provider.ExcessTolerance
162+
target *entities.Wei
163+
}
164+
table := test.Table[input, *entities.Wei]{
165+
{
166+
Value: input{
167+
tolerance: liquidity_provider.ExcessTolerance{
168+
IsFixed: true,
169+
PercentageValue: utils.NewBigFloat64(0),
170+
FixedValue: entities.NewWei(200),
171+
},
172+
target: entities.NewWei(1000),
173+
},
174+
Result: entities.NewWei(1200),
175+
},
176+
{
177+
Value: input{
178+
tolerance: liquidity_provider.ExcessTolerance{
179+
IsFixed: true,
180+
PercentageValue: utils.NewBigFloat64(0),
181+
FixedValue: entities.NewWei(500),
182+
},
183+
target: entities.NewWei(0),
184+
},
185+
Result: entities.NewWei(500),
186+
},
187+
{
188+
Value: input{
189+
tolerance: liquidity_provider.ExcessTolerance{
190+
IsFixed: false,
191+
PercentageValue: utils.NewBigFloat64(20),
192+
FixedValue: entities.NewWei(0),
193+
},
194+
target: entities.NewWei(1000),
195+
},
196+
Result: entities.NewWei(1200),
197+
},
198+
{
199+
Value: input{
200+
tolerance: liquidity_provider.ExcessTolerance{
201+
IsFixed: false,
202+
PercentageValue: utils.NewBigFloat64(50),
203+
FixedValue: entities.NewWei(0),
204+
},
205+
target: entities.NewWei(200),
206+
},
207+
Result: entities.NewWei(300),
208+
},
209+
}
210+
for _, item := range table {
211+
result := item.Value.tolerance.ComputeThreshold(item.Value.target)
212+
require.Equal(t, item.Result.AsBigInt().String(), result.AsBigInt().String())
213+
}
214+
}
215+
159216
func TestExcessTolerance_Validate(t *testing.T) {
160217
table := test.Table[liquidity_provider.ExcessTolerance, error]{
161218
{

internal/entities/liquidity_provider/default.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const (
1111
DefaultExcessToleranceIsFixed = false
1212
DefaultExcessTolerancePercentageValue = 20
1313
DefaultExcessToleranceFixedValue = 100000000000000000
14+
DefaultBtcLiquidityTargetPercentage = 50
1415
)
1516

1617
const (

internal/usecases/liquidity_provider/get_liquidity_ratio.go

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66

77
"github.com/rsksmart/liquidity-provider-server/internal/entities"
88
"github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider"
9-
"github.com/rsksmart/liquidity-provider-server/internal/entities/utils"
109
"github.com/rsksmart/liquidity-provider-server/internal/usecases"
1110
)
1211

@@ -83,18 +82,18 @@ func (useCase *GetLiquidityRatioUseCase) Run(ctx context.Context, proposedBtcPer
8382
}
8483
rbtcPercentage := 100 - btcPercentage
8584

86-
btcTarget, err := calculateTarget(generalConfig.MaxLiquidity, btcPercentage)
85+
btcTarget, err := useCase.calculateTarget(generalConfig.MaxLiquidity, btcPercentage)
8786
if err != nil {
8887
return LiquidityRatioDetail{}, usecases.WrapUseCaseError(usecases.GetLiquidityRatioId, err)
8988
}
9089

91-
rbtcTarget, err := calculateTarget(generalConfig.MaxLiquidity, rbtcPercentage)
90+
rbtcTarget, err := useCase.calculateTarget(generalConfig.MaxLiquidity, rbtcPercentage)
9291
if err != nil {
9392
return LiquidityRatioDetail{}, usecases.WrapUseCaseError(usecases.GetLiquidityRatioId, err)
9493
}
9594

96-
btcThreshold := calculateThreshold(btcTarget, generalConfig.ExcessTolerance)
97-
rbtcThreshold := calculateThreshold(rbtcTarget, generalConfig.ExcessTolerance)
95+
btcThreshold := generalConfig.ExcessTolerance.ComputeThreshold(btcTarget)
96+
rbtcThreshold := generalConfig.ExcessTolerance.ComputeThreshold(rbtcTarget)
9897

9998
return LiquidityRatioDetail{
10099
BtcPercentage: btcPercentage,
@@ -106,31 +105,23 @@ func (useCase *GetLiquidityRatioUseCase) Run(ctx context.Context, proposedBtcPer
106105
RbtcThreshold: rbtcThreshold,
107106
BtcCurrentBalance: btcBalance,
108107
RbtcCurrentBalance: rbtcBalance,
109-
BtcImpact: calculateImpact(btcBalance, btcTarget, btcThreshold),
110-
RbtcImpact: calculateImpact(rbtcBalance, rbtcTarget, rbtcThreshold),
108+
BtcImpact: useCase.calculateImpact(btcBalance, btcTarget, btcThreshold),
109+
RbtcImpact: useCase.calculateImpact(rbtcBalance, rbtcTarget, rbtcThreshold),
111110
CooldownActive: time.Now().Unix() < stateConfig.RatioCooldownEndTimestamp,
112111
CooldownEndTimestamp: stateConfig.RatioCooldownEndTimestamp,
113112
CooldownDurationSeconds: CooldownAfterRatioChange,
114113
IsPreview: isPreview,
115114
}, nil
116115
}
117116

118-
func calculateTarget(maxLiquidity *entities.Wei, percentage uint64) (*entities.Wei, error) {
117+
func (useCase *GetLiquidityRatioUseCase) calculateTarget(maxLiquidity *entities.Wei, percentage uint64) (*entities.Wei, error) {
119118
return new(entities.Wei).Div(
120119
new(entities.Wei).Mul(maxLiquidity, entities.NewUWei(percentage)),
121120
entities.NewUWei(100),
122121
)
123122
}
124123

125-
func calculateThreshold(target *entities.Wei, tolerance liquidity_provider.ExcessTolerance) *entities.Wei {
126-
if tolerance.IsFixed {
127-
return new(entities.Wei).Add(target, tolerance.FixedValue)
128-
}
129-
thresholdBigInt := utils.ApplyPercentageIncrease(target.AsBigInt(), tolerance.PercentageValue.Native())
130-
return entities.NewBigWei(thresholdBigInt)
131-
}
132-
133-
func calculateImpact(balance, target, threshold *entities.Wei) NetworkImpactDetail {
124+
func (useCase *GetLiquidityRatioUseCase) calculateImpact(balance, target, threshold *entities.Wei) NetworkImpactDetail {
134125
if balance.Cmp(target) < 0 {
135126
return NetworkImpactDetail{
136127
Type: NetworkImpactDeficit,

internal/usecases/liquidity_provider/initialize_state_configuration.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ import (
1414
)
1515

1616
const (
17-
CooldownAfterRatioChange int64 = 10800 // 3 hours
18-
DefaultBtcLiquidityTargetPercentage uint64 = 50
17+
CooldownAfterRatioChange int64 = 10800 // 3 hours
1918
)
2019

2120
type InitializeStateConfigurationUseCase struct {
@@ -87,7 +86,7 @@ func (useCase *InitializeStateConfigurationUseCase) Run(ctx context.Context) err
8786

8887
if stateConfig.BtcLiquidityTargetPercentage == 0 {
8988
log.Info("Initializing BtcLiquidityTargetPercentage to default (50)")
90-
stateConfig.BtcLiquidityTargetPercentage = DefaultBtcLiquidityTargetPercentage
89+
stateConfig.BtcLiquidityTargetPercentage = liquidity_provider.DefaultBtcLiquidityTargetPercentage
9190
modified = true
9291
}
9392

internal/usecases/liquidity_provider/transfer_excess_to_cold_wallet.go

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"github.com/rsksmart/liquidity-provider-server/internal/entities/blockchain"
1313
"github.com/rsksmart/liquidity-provider-server/internal/entities/cold_wallet"
1414
"github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider"
15-
"github.com/rsksmart/liquidity-provider-server/internal/entities/utils"
1615
"github.com/rsksmart/liquidity-provider-server/internal/usecases"
1716
log "github.com/sirupsen/logrus"
1817
)
@@ -269,8 +268,8 @@ func (useCase *TransferExcessToColdWalletUseCase) calculateExcessForBothNetworks
269268

270269
rbtcTarget := new(entities.Wei).Sub(generalConfig.MaxLiquidity, btcTarget)
271270

272-
btcThreshold := useCase.calculateThreshold(btcTarget, generalConfig.ExcessTolerance)
273-
rbtcThreshold := useCase.calculateThreshold(rbtcTarget, generalConfig.ExcessTolerance)
271+
btcThreshold := generalConfig.ExcessTolerance.ComputeThreshold(btcTarget)
272+
rbtcThreshold := generalConfig.ExcessTolerance.ComputeThreshold(rbtcTarget)
274273

275274
btcLiquidityExcess, btcIsTimeForced := useCase.calculateExcessWithTimeForcing(
276275
btcTarget,
@@ -482,20 +481,6 @@ func (useCase *TransferExcessToColdWalletUseCase) getCurrentLiquidity(ctx contex
482481
}, nil
483482
}
484483

485-
// calculateThreshold computes the balance above which a transfer is triggered, by adding the configured
486-
// tolerance (either a fixed amount or a percentage) to the per-network target.
487-
func (useCase *TransferExcessToColdWalletUseCase) calculateThreshold(
488-
target *entities.Wei,
489-
tolerance liquidity_provider.ExcessTolerance,
490-
) *entities.Wei {
491-
if tolerance.IsFixed {
492-
return new(entities.Wei).Add(target, tolerance.FixedValue)
493-
}
494-
495-
thresholdBigInt := utils.ApplyPercentageIncrease(target.AsBigInt(), tolerance.PercentageValue.Native())
496-
return entities.NewBigWei(thresholdBigInt)
497-
}
498-
499484
// calculateExcess returns currentLiquidity minus target if currentLiquidity exceeds compareValue, otherwise zero.
500485
func (useCase *TransferExcessToColdWalletUseCase) calculateExcess(
501486
target *entities.Wei,

pkg/liquidity_provider_test.go

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/rsksmart/liquidity-provider-server/internal/entities"
1111
"github.com/rsksmart/liquidity-provider-server/internal/entities/liquidity_provider"
1212
"github.com/rsksmart/liquidity-provider-server/internal/entities/utils"
13-
lp "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider"
1413
"github.com/rsksmart/liquidity-provider-server/internal/usecases/reports"
1514
"github.com/rsksmart/liquidity-provider-server/pkg"
1615
"github.com/rsksmart/liquidity-provider-server/test"
@@ -996,50 +995,3 @@ func TestToGetAssetsReportResponse_WithZeroValues(t *testing.T) {
996995
assert.Equal(t, "0", response.RbtcAssetReport.Allocation.WaitingForRefund.String())
997996
assert.Equal(t, "0", response.RbtcAssetReport.Allocation.Available.String())
998997
}
999-
1000-
func TestToLiquidityRatioResponse(t *testing.T) {
1001-
detail := lp.LiquidityRatioDetail{
1002-
BtcPercentage: 60,
1003-
RbtcPercentage: 40,
1004-
MaxLiquidity: entities.NewBigWei(big.NewInt(10_000_000_000)),
1005-
BtcTarget: entities.NewBigWei(big.NewInt(6_000_000_000)),
1006-
BtcThreshold: entities.NewBigWei(big.NewInt(6_500_000_000)),
1007-
RbtcTarget: entities.NewBigWei(big.NewInt(4_000_000_000)),
1008-
RbtcThreshold: entities.NewBigWei(big.NewInt(4_500_000_000)),
1009-
BtcCurrentBalance: entities.NewBigWei(big.NewInt(5_000_000_000)),
1010-
RbtcCurrentBalance: entities.NewBigWei(big.NewInt(5_000_000_000)),
1011-
BtcImpact: lp.NetworkImpactDetail{
1012-
Type: lp.NetworkImpactDeficit,
1013-
Amount: entities.NewBigWei(big.NewInt(1_000_000_000)),
1014-
},
1015-
RbtcImpact: lp.NetworkImpactDetail{
1016-
Type: lp.NetworkImpactExcess,
1017-
Amount: entities.NewBigWei(big.NewInt(1_000_000_000)),
1018-
},
1019-
CooldownActive: true,
1020-
CooldownEndTimestamp: 1700000000,
1021-
CooldownDurationSeconds: 3600,
1022-
IsPreview: true,
1023-
}
1024-
1025-
response := pkg.ToLiquidityRatioResponse(detail)
1026-
1027-
assert.Equal(t, uint64(60), response.BtcPercentage)
1028-
assert.Equal(t, uint64(40), response.RbtcPercentage)
1029-
assert.Equal(t, "10000000000", response.MaxLiquidity.String())
1030-
assert.Equal(t, "6000000000", response.BtcTarget.String())
1031-
assert.Equal(t, "6500000000", response.BtcThreshold.String())
1032-
assert.Equal(t, "4000000000", response.RbtcTarget.String())
1033-
assert.Equal(t, "4500000000", response.RbtcThreshold.String())
1034-
assert.Equal(t, "5000000000", response.BtcCurrentBalance.String())
1035-
assert.Equal(t, "5000000000", response.RbtcCurrentBalance.String())
1036-
assert.Equal(t, "deficit", response.BtcImpact.Type)
1037-
assert.Equal(t, "1000000000", response.BtcImpact.Amount.String())
1038-
assert.Equal(t, "excess", response.RbtcImpact.Type)
1039-
assert.Equal(t, "1000000000", response.RbtcImpact.Amount.String())
1040-
assert.True(t, response.CooldownActive)
1041-
assert.Equal(t, int64(1700000000), response.CooldownEndTimestamp)
1042-
assert.Equal(t, int64(3600), response.CooldownDurationSeconds)
1043-
assert.True(t, response.IsPreview)
1044-
test.AssertNonZeroValues(t, response)
1045-
}

pkg/liquidity_ratio_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package pkg_test
2+
3+
import (
4+
"math/big"
5+
"testing"
6+
7+
"github.com/rsksmart/liquidity-provider-server/internal/entities"
8+
lp "github.com/rsksmart/liquidity-provider-server/internal/usecases/liquidity_provider"
9+
"github.com/rsksmart/liquidity-provider-server/pkg"
10+
"github.com/rsksmart/liquidity-provider-server/test"
11+
"github.com/stretchr/testify/assert"
12+
)
13+
14+
func TestToLiquidityRatioResponse(t *testing.T) {
15+
detail := lp.LiquidityRatioDetail{
16+
BtcPercentage: 60,
17+
RbtcPercentage: 40,
18+
MaxLiquidity: entities.NewBigWei(big.NewInt(10_000_000_000)),
19+
BtcTarget: entities.NewBigWei(big.NewInt(6_000_000_000)),
20+
BtcThreshold: entities.NewBigWei(big.NewInt(6_500_000_000)),
21+
RbtcTarget: entities.NewBigWei(big.NewInt(4_000_000_000)),
22+
RbtcThreshold: entities.NewBigWei(big.NewInt(4_500_000_000)),
23+
BtcCurrentBalance: entities.NewBigWei(big.NewInt(5_000_000_000)),
24+
RbtcCurrentBalance: entities.NewBigWei(big.NewInt(5_000_000_000)),
25+
BtcImpact: lp.NetworkImpactDetail{
26+
Type: lp.NetworkImpactDeficit,
27+
Amount: entities.NewBigWei(big.NewInt(1_000_000_000)),
28+
},
29+
RbtcImpact: lp.NetworkImpactDetail{
30+
Type: lp.NetworkImpactExcess,
31+
Amount: entities.NewBigWei(big.NewInt(1_000_000_000)),
32+
},
33+
CooldownActive: true,
34+
CooldownEndTimestamp: 1700000000,
35+
CooldownDurationSeconds: 3600,
36+
IsPreview: true,
37+
}
38+
39+
response := pkg.ToLiquidityRatioResponse(detail)
40+
41+
assert.Equal(t, uint64(60), response.BtcPercentage)
42+
assert.Equal(t, uint64(40), response.RbtcPercentage)
43+
assert.Equal(t, "10000000000", response.MaxLiquidity.String())
44+
assert.Equal(t, "6000000000", response.BtcTarget.String())
45+
assert.Equal(t, "6500000000", response.BtcThreshold.String())
46+
assert.Equal(t, "4000000000", response.RbtcTarget.String())
47+
assert.Equal(t, "4500000000", response.RbtcThreshold.String())
48+
assert.Equal(t, "5000000000", response.BtcCurrentBalance.String())
49+
assert.Equal(t, "5000000000", response.RbtcCurrentBalance.String())
50+
assert.Equal(t, "deficit", response.BtcImpact.Type)
51+
assert.Equal(t, "1000000000", response.BtcImpact.Amount.String())
52+
assert.Equal(t, "excess", response.RbtcImpact.Type)
53+
assert.Equal(t, "1000000000", response.RbtcImpact.Amount.String())
54+
assert.True(t, response.CooldownActive)
55+
assert.Equal(t, int64(1700000000), response.CooldownEndTimestamp)
56+
assert.Equal(t, int64(3600), response.CooldownDurationSeconds)
57+
assert.True(t, response.IsPreview)
58+
test.AssertNonZeroValues(t, response)
59+
}

0 commit comments

Comments
 (0)