69 lines
1.7 KiB
Go
69 lines
1.7 KiB
Go
package btc
|
|
|
|
import (
|
|
"fmt"
|
|
"math/big"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/golang/glog"
|
|
"github.com/juju/errors"
|
|
"github.com/trezor/blockbook/bchain"
|
|
)
|
|
|
|
type alternativeFeeProviderFee struct {
|
|
blocks int
|
|
feePerKB int
|
|
}
|
|
|
|
type alternativeFeeProvider struct {
|
|
fees []alternativeFeeProviderFee
|
|
lastSync time.Time
|
|
chain bchain.BlockChain
|
|
mux sync.Mutex
|
|
}
|
|
|
|
type alternativeFeeProviderInterface interface {
|
|
compareToDefault()
|
|
estimateFee(blocks int) (big.Int, error)
|
|
}
|
|
|
|
func (p *alternativeFeeProvider) compareToDefault() {
|
|
output := ""
|
|
for _, fee := range p.fees {
|
|
conservative, err := p.chain.(*BitcoinRPC).blockchainEstimateSmartFee(fee.blocks, true)
|
|
if err != nil {
|
|
glog.Error(err)
|
|
return
|
|
}
|
|
economical, err := p.chain.(*BitcoinRPC).blockchainEstimateSmartFee(fee.blocks, false)
|
|
if err != nil {
|
|
glog.Error(err)
|
|
return
|
|
}
|
|
output += fmt.Sprintf("Blocks %d: alternative %d, conservative %s, economical %s\n", fee.blocks, fee.feePerKB, conservative.String(), economical.String())
|
|
}
|
|
glog.Info("alternativeFeeProviderCompareToDefault\n", output)
|
|
}
|
|
|
|
func (p *alternativeFeeProvider) estimateFee(blocks int) (big.Int, error) {
|
|
var r big.Int
|
|
p.mux.Lock()
|
|
defer p.mux.Unlock()
|
|
if len(p.fees) == 0 {
|
|
return r, errors.New("alternativeFeeProvider: no fees")
|
|
}
|
|
if p.lastSync.Before(time.Now().Add(time.Duration(-10) * time.Minute)) {
|
|
return r, errors.Errorf("alternativeFeeProvider: Missing recent value, last sync at %v", p.lastSync)
|
|
}
|
|
for i := range p.fees {
|
|
if p.fees[i].blocks >= blocks {
|
|
r = *big.NewInt(int64(p.fees[i].feePerKB))
|
|
return r, nil
|
|
}
|
|
}
|
|
// use the last value as fallback
|
|
r = *big.NewInt(int64(p.fees[len(p.fees)-1].feePerKB))
|
|
return r, nil
|
|
}
|