mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-05-24 07:46:45 +00:00

* upd clarified wallet daemon syncronization state log message * Update address.go * Update create_unsigned_transaction.go * Update external_spendable_utxos.go * Update sync.go Co-authored-by: Michael Sutton <mikisiton2@gmail.com>
63 lines
1.9 KiB
Go
63 lines
1.9 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/kaspanet/kaspad/app/appmessage"
|
|
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
|
"github.com/kaspanet/kaspad/cmd/kaspawallet/libkaspawallet"
|
|
"github.com/kaspanet/kaspad/util"
|
|
)
|
|
|
|
func (s *server) GetExternalSpendableUTXOs(_ context.Context, request *pb.GetExternalSpendableUTXOsRequest) (*pb.GetExternalSpendableUTXOsResponse, error) {
|
|
s.lock.RLock()
|
|
defer s.lock.RUnlock()
|
|
|
|
_, err := util.DecodeAddress(request.Address, s.params.Prefix)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
externalUTXOs, err := s.rpcClient.GetUTXOsByAddresses([]string{request.Address})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
selectedUTXOs, err := s.selectExternalSpendableUTXOs(externalUTXOs, request.Address)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &pb.GetExternalSpendableUTXOsResponse{
|
|
Entries: selectedUTXOs,
|
|
}, nil
|
|
}
|
|
|
|
func (s *server) selectExternalSpendableUTXOs(externalUTXOs *appmessage.GetUTXOsByAddressesResponseMessage, address string) ([]*pb.UtxosByAddressesEntry, error) {
|
|
dagInfo, err := s.rpcClient.GetBlockDAGInfo()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
daaScore := dagInfo.VirtualDAAScore
|
|
maturity := s.params.BlockCoinbaseMaturity
|
|
|
|
//we do not make because we do not know size, because of unspendable utxos
|
|
var selectedExternalUtxos []*pb.UtxosByAddressesEntry
|
|
|
|
for _, entry := range externalUTXOs.Entries {
|
|
if !isExternalUTXOSpendable(entry, daaScore, maturity) {
|
|
continue
|
|
}
|
|
selectedExternalUtxos = append(selectedExternalUtxos, libkaspawallet.AppMessageUTXOToKaspawalletdUTXO(entry))
|
|
}
|
|
|
|
return selectedExternalUtxos, nil
|
|
}
|
|
|
|
func isExternalUTXOSpendable(entry *appmessage.UTXOsByAddressesEntry, virtualDAAScore uint64, coinbaseMaturity uint64) bool {
|
|
if !entry.UTXOEntry.IsCoinbase {
|
|
return true
|
|
} else if entry.UTXOEntry.Amount <= feePerInput {
|
|
return false
|
|
}
|
|
return entry.UTXOEntry.BlockDAAScore+coinbaseMaturity < virtualDAAScore
|
|
}
|