mirror of https://github.com/poanetwork/gecko.git
93 lines
1.8 KiB
Go
93 lines
1.8 KiB
Go
// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package dagwallet
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/ava-labs/gecko/ids"
|
|
"github.com/ava-labs/gecko/vms/spdagvm"
|
|
)
|
|
|
|
// UTXOSet ...
|
|
type UTXOSet struct {
|
|
// Key: The id of a UTXO
|
|
// Value: The index in UTXOs of that UTXO
|
|
utxoMap map[[32]byte]int
|
|
|
|
// List of UTXOs in this set
|
|
// This can be used to iterate over. It should not be modified externally.
|
|
UTXOs []*spdagvm.UTXO
|
|
}
|
|
|
|
// Put ...
|
|
func (us *UTXOSet) Put(utxo *spdagvm.UTXO) {
|
|
if us.utxoMap == nil {
|
|
us.utxoMap = make(map[[32]byte]int)
|
|
}
|
|
if _, ok := us.utxoMap[utxo.ID().Key()]; !ok {
|
|
us.utxoMap[utxo.ID().Key()] = len(us.UTXOs)
|
|
us.UTXOs = append(us.UTXOs, utxo)
|
|
}
|
|
}
|
|
|
|
// Get ...
|
|
func (us *UTXOSet) Get(id ids.ID) *spdagvm.UTXO {
|
|
if us.utxoMap == nil {
|
|
return nil
|
|
}
|
|
if i, ok := us.utxoMap[id.Key()]; ok {
|
|
utxo := us.UTXOs[i]
|
|
return utxo
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Remove ...
|
|
func (us *UTXOSet) Remove(id ids.ID) *spdagvm.UTXO {
|
|
i, ok := us.utxoMap[id.Key()]
|
|
if !ok {
|
|
return nil
|
|
}
|
|
utxoI := us.UTXOs[i]
|
|
|
|
j := len(us.UTXOs) - 1
|
|
utxoJ := us.UTXOs[j]
|
|
|
|
us.UTXOs[i] = us.UTXOs[j]
|
|
us.UTXOs = us.UTXOs[:j]
|
|
|
|
us.utxoMap[utxoJ.ID().Key()] = i
|
|
delete(us.utxoMap, utxoI.ID().Key())
|
|
|
|
return utxoI
|
|
}
|
|
|
|
func (us *UTXOSet) string(prefix string) string {
|
|
s := strings.Builder{}
|
|
|
|
for i, utxo := range us.UTXOs {
|
|
out := utxo.Out().(*spdagvm.OutputPayment)
|
|
sourceID, sourceIndex := utxo.Source()
|
|
|
|
s.WriteString(fmt.Sprintf("%sUTXO[%d]:"+
|
|
"\n%s InputID: %s"+
|
|
"\n%s InputIndex: %d"+
|
|
"\n%s Locktime: %d"+
|
|
"\n%s Amount: %d\n",
|
|
prefix, i,
|
|
prefix, sourceID,
|
|
prefix, sourceIndex,
|
|
prefix, out.Locktime(),
|
|
prefix, out.Amount()))
|
|
}
|
|
|
|
return strings.TrimSuffix(s.String(), "\n")
|
|
}
|
|
|
|
func (us *UTXOSet) String() string {
|
|
return us.string("")
|
|
}
|