Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions lib/pos_fee_estimator.go
Original file line number Diff line number Diff line change
Expand Up @@ -687,7 +687,7 @@ func (posFeeEstimator *PoSFeeEstimator) estimateFeeRateNanosPerKBGivenTransactio
return globalMinFeeRate
}

bucketMinFee, bucketMaxFee := getPriorityFeeBucketFromTxns(
bucketMinFee, bucketMaxFee := txnRegister.getPriorityFeeBucketFromTxns(
txns,
priorityPercentileBasisPoints,
txnRegister.minimumNetworkFeeNanosPerKB,
Expand Down Expand Up @@ -724,7 +724,7 @@ func (posFeeEstimator *PoSFeeEstimator) estimateFeeRateNanosPerKBGivenTransactio
// The feeTimeOrderedTxns have the highest fees first and the lowest fees last, so we need to compute
// the percentile position of the priorityPercentileBasisPoints param and then compute the fee bucket
// range based on the fee rate per KB of the transaction at that position.
func getPriorityFeeBucketFromTxns(
func (tr *TransactionRegister) getPriorityFeeBucketFromTxns(
feeTimeOrderedTxns []*MempoolTx,
priorityPercentileBasisPoints uint64,
minimumNetworkFeeNanosPerKB *big.Float,
Expand All @@ -739,7 +739,7 @@ func getPriorityFeeBucketFromTxns(
percentilePosition = uint64(len(feeTimeOrderedTxns)) - 1
}

bucketMin, bucketMax := computeFeeTimeBucketRangeFromFeeNanosPerKB(
bucketMin, bucketMax := tr.computeFeeTimeBucketRangeFromFeeNanosPerKB(
feeTimeOrderedTxns[percentilePosition].FeePerKB,
minimumNetworkFeeNanosPerKB,
feeBucketGrowthRateBasisPoints,
Expand Down
7 changes: 4 additions & 3 deletions lib/pos_fee_estimator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,13 @@ func TestFeeEstimator(t *testing.T) {
require.NoError(t, mempool.Start())
require.True(t, mempool.IsRunning())
defer mempool.Stop()
minFeeBucketMin, minFeeBucketMax := computeFeeTimeBucketRangeFromFeeNanosPerKB(
tr := mempool.txnRegister
minFeeBucketMin, minFeeBucketMax := tr.computeFeeTimeBucketRangeFromFeeNanosPerKB(
globalParams.MinimumNetworkFeeNanosPerKB,
big.NewFloat(float64(globalParams.MinimumNetworkFeeNanosPerKB)),
mempool.txnRegister.feeBucketGrowthRateBasisPoints)
// set the feeMin to the third fee bucket.
secondMinFeeBucketMin, secondMinFeeBucketMax := computeFeeTimeBucketRangeFromFeeNanosPerKB(
secondMinFeeBucketMin, secondMinFeeBucketMax := tr.computeFeeTimeBucketRangeFromFeeNanosPerKB(
minFeeBucketMax+1,
big.NewFloat(float64(globalParams.MinimumNetworkFeeNanosPerKB)),
mempool.txnRegister.feeBucketGrowthRateBasisPoints)
Expand Down Expand Up @@ -119,7 +120,7 @@ func TestFeeEstimator(t *testing.T) {
err = posFeeEstimator.AddBlock(dummyBlock)
require.NoError(t, err)
// Compute the next fee bucket min
_, feeBucketMax := computeFeeTimeBucketRangeFromFeeNanosPerKB(
_, feeBucketMax := tr.computeFeeTimeBucketRangeFromFeeNanosPerKB(
feeMin,
big.NewFloat(float64(globalParams.MinimumNetworkFeeNanosPerKB)),
mempool.txnRegister.feeBucketGrowthRateBasisPoints)
Expand Down
20 changes: 17 additions & 3 deletions lib/pos_transaction_register.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ func (tr *TransactionRegister) addTransactionNoLock(txn *MempoolTx) error {
}

// Determine the min fee of the bucket based on the transaction's fee rate.
bucketMinFeeNanosPerKb, bucketMaxFeeNanosPerKB := computeFeeTimeBucketRangeFromFeeNanosPerKB(txn.FeePerKB,
bucketMinFeeNanosPerKb, bucketMaxFeeNanosPerKB := tr.computeFeeTimeBucketRangeFromFeeNanosPerKB(txn.FeePerKB,
tr.minimumNetworkFeeNanosPerKB, tr.feeBucketGrowthRateBasisPoints)
// Lookup the bucket in the map.
bucket, bucketExists := tr.feeTimeBucketsByMinFeeMap[bucketMinFeeNanosPerKb]
Expand Down Expand Up @@ -197,7 +197,7 @@ func (tr *TransactionRegister) removeTransactionNoLock(txn *MempoolTx) error {
}

// Determine the min fee of the bucket based on the transaction's fee rate.
bucketMinFeeNanosPerKb, _ := computeFeeTimeBucketRangeFromFeeNanosPerKB(txn.FeePerKB,
bucketMinFeeNanosPerKb, _ := tr.computeFeeTimeBucketRangeFromFeeNanosPerKB(txn.FeePerKB,
tr.minimumNetworkFeeNanosPerKB, tr.feeBucketGrowthRateBasisPoints)
// Remove the transaction from the bucket.
if bucket, exists := tr.feeTimeBucketsByMinFeeMap[bucketMinFeeNanosPerKb]; exists {
Expand Down Expand Up @@ -645,9 +645,23 @@ func ComputeMultiplierFromGrowthRateBasisPoints(growthRateBasisPoints *big.Float

// computeFeeTimeBucketRangeFromFeeNanosPerKB takes a fee rate, minimumNetworkFeeNanosPerKB, and feeBucketMultiplier,
// and returns the [minFeeNanosPerKB, maxFeeNanosPerKB] of the fee range.
func computeFeeTimeBucketRangeFromFeeNanosPerKB(feeNanosPerKB uint64, minimumNetworkFeeNanosPerKB *big.Float,
func (tr *TransactionRegister) computeFeeTimeBucketRangeFromFeeNanosPerKB(feeNanosPerKB uint64, minimumNetworkFeeNanosPerKB *big.Float,
feeBucketGrowthRateBasisPoints *big.Float) (uint64, uint64) {

idx, feeBucketInterface := tr.feeTimeBucketSet.Find(func(idx int, value interface{}) bool {
bucket, ok := value.(*FeeTimeBucket)
if !ok {
glog.Error(CLog(Red, "computeFeeTimeBucketRangeFromFeeNanosPerKB: Invalid type in feeTimeBucketSet. This is BAD NEWS, we should never get here."))
return false
}
// If the bucket's min fee is greater than the feeNanosPerKB, then we can stop searching.
return bucket.minFeeNanosPerKB < feeNanosPerKB && bucket.maxFeeNanosPerKB > feeNanosPerKB
})
if idx != -1 && feeBucketInterface != nil {
feeBucket := feeBucketInterface.(*FeeTimeBucket)
return feeBucket.minFeeNanosPerKB, feeBucket.maxFeeNanosPerKB
}

feeBucketMultiplier := ComputeMultiplierFromGrowthRateBasisPoints(feeBucketGrowthRateBasisPoints)
bucketExponent := computeFeeTimeBucketExponentFromFeeNanosPerKB(feeNanosPerKB, minimumNetworkFeeNanosPerKB, feeBucketMultiplier)
return computeFeeTimeBucketRangeFromExponent(bucketExponent, minimumNetworkFeeNanosPerKB, feeBucketMultiplier)
Expand Down
20 changes: 20 additions & 0 deletions lib/pos_transaction_register_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,26 @@ func TestComputeFeeBucketWithFee(t *testing.T) {
}
}

func TestComputeFeeBucketFromRegisterWithFee(t *testing.T) {
globalParams := _testGetDefaultGlobalParams()
globalParams.MinimumNetworkFeeNanosPerKB = 100
globalParams.FeeBucketGrowthRateBasisPoints = 1000
baseRate, _ := globalParams.ComputeFeeTimeBucketMinimumFeeAndMultiplier()

feeBucketGrowthRate := NewFloat().SetUint64(globalParams.FeeBucketGrowthRateBasisPoints)
tr := NewTransactionRegister()

for ii := uint64(100); ii < 100000; ii++ {
minFee, maxFee := tr.computeFeeTimeBucketRangeFromFeeNanosPerKB(ii, baseRate, feeBucketGrowthRate)
require.LessOrEqual(t, minFee, ii)
require.GreaterOrEqual(t, maxFee, ii)
tr.AddTransaction(&MempoolTx{
Hash: NewBlockHash(RandomBytes(32)),
FeePerKB: ii,
})
}
}

func TestHasGlobalParamChange(t *testing.T) {
// Create the transaction register.
globalParams := _testGetDefaultGlobalParams()
Expand Down