mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-11-28 00:03:39 +00:00
91 lines
3.7 KiB
Go
91 lines
3.7 KiB
Go
package rpccontext
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
|
"github.com/kaspanet/kaspad/domain/consensus/utils/txscript"
|
|
"github.com/kaspanet/kaspad/util"
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/kaspanet/kaspad/app/appmessage"
|
|
"github.com/kaspanet/kaspad/domain/utxoindex"
|
|
)
|
|
|
|
// OutpointDAAScoreEntry is used for finding a batch of UTXO entries with consecutive DAA score
|
|
type OutpointDAAScoreEntry struct {
|
|
DAAScore uint64
|
|
Outpoint externalapi.DomainOutpoint
|
|
}
|
|
|
|
// ConvertUTXOOutpointEntryBatchToUTXOsByAddressesEntries converts
|
|
// a batch of UTXOOutpointEntryPairs to a slice of UTXOsByAddressesEntry
|
|
func ConvertUTXOOutpointEntryBatchToUTXOsByAddressesEntries(
|
|
address string, pairs utxoindex.UTXOOutpointEntryPairs,
|
|
batch []OutpointDAAScoreEntry) []*appmessage.UTXOsByAddressesEntry {
|
|
utxosByAddressesEntries := make([]*appmessage.UTXOsByAddressesEntry, 0, len(batch))
|
|
for _, scoreEntry := range batch {
|
|
outpoint := scoreEntry.Outpoint
|
|
utxoEntry := pairs[outpoint]
|
|
utxosByAddressesEntries = append(utxosByAddressesEntries, &appmessage.UTXOsByAddressesEntry{
|
|
Address: address,
|
|
Outpoint: &appmessage.RPCOutpoint{
|
|
TransactionID: outpoint.TransactionID.String(),
|
|
Index: outpoint.Index,
|
|
},
|
|
UTXOEntry: &appmessage.RPCUTXOEntry{
|
|
Amount: utxoEntry.Amount(),
|
|
ScriptPublicKey: &appmessage.RPCScriptPublicKey{Script: hex.EncodeToString(utxoEntry.ScriptPublicKey().Script), Version: utxoEntry.ScriptPublicKey().Version},
|
|
BlockDAAScore: utxoEntry.BlockDAAScore(),
|
|
IsCoinbase: utxoEntry.IsCoinbase(),
|
|
},
|
|
})
|
|
}
|
|
return utxosByAddressesEntries
|
|
}
|
|
|
|
// ConvertUTXOOutpointEntryPairsToUTXOsByAddressesEntries converts
|
|
// UTXOOutpointEntryPairs to a slice of UTXOsByAddressesEntry
|
|
func ConvertUTXOOutpointEntryPairsToUTXOsByAddressesEntries(address string, pairs utxoindex.UTXOOutpointEntryPairs) []*appmessage.UTXOsByAddressesEntry {
|
|
utxosByAddressesEntries := make([]*appmessage.UTXOsByAddressesEntry, 0, len(pairs))
|
|
for outpoint, utxoEntry := range pairs {
|
|
utxosByAddressesEntries = append(utxosByAddressesEntries, &appmessage.UTXOsByAddressesEntry{
|
|
Address: address,
|
|
Outpoint: &appmessage.RPCOutpoint{
|
|
TransactionID: outpoint.TransactionID.String(),
|
|
Index: outpoint.Index,
|
|
},
|
|
UTXOEntry: &appmessage.RPCUTXOEntry{
|
|
Amount: utxoEntry.Amount(),
|
|
ScriptPublicKey: &appmessage.RPCScriptPublicKey{Script: hex.EncodeToString(utxoEntry.ScriptPublicKey().Script), Version: utxoEntry.ScriptPublicKey().Version},
|
|
BlockDAAScore: utxoEntry.BlockDAAScore(),
|
|
IsCoinbase: utxoEntry.IsCoinbase(),
|
|
},
|
|
})
|
|
}
|
|
return utxosByAddressesEntries
|
|
}
|
|
|
|
// ConvertAddressStringsToUTXOsChangedNotificationAddresses converts address strings
|
|
// to UTXOsChangedNotificationAddresses
|
|
func (ctx *Context) ConvertAddressStringsToUTXOsChangedNotificationAddresses(
|
|
addressStrings []string) ([]*UTXOsChangedNotificationAddress, error) {
|
|
|
|
addresses := make([]*UTXOsChangedNotificationAddress, len(addressStrings))
|
|
for i, addressString := range addressStrings {
|
|
address, err := util.DecodeAddress(addressString, ctx.Config.ActiveNetParams.Prefix)
|
|
if err != nil {
|
|
return nil, errors.Errorf("Could not decode address '%s': %s", addressString, err)
|
|
}
|
|
scriptPublicKey, err := txscript.PayToAddrScript(address)
|
|
if err != nil {
|
|
return nil, errors.Errorf("Could not create a scriptPublicKey for address '%s': %s", addressString, err)
|
|
}
|
|
scriptPublicKeyString := utxoindex.ScriptPublicKeyString(scriptPublicKey.String())
|
|
addresses[i] = &UTXOsChangedNotificationAddress{
|
|
Address: addressString,
|
|
ScriptPublicKeyString: scriptPublicKeyString,
|
|
}
|
|
}
|
|
return addresses, nil
|
|
}
|