74 lines
1.2 KiB
Go
74 lines
1.2 KiB
Go
package transactions
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
)
|
|
|
|
type Mempool struct {
|
|
txs []*Transaction
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
func NewMempool() *Mempool {
|
|
return &Mempool{}
|
|
}
|
|
|
|
func (m *Mempool) Add(tx *Transaction) error {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
if m.Has(tx.Hash()) {
|
|
return errors.New("transação já existente na mempool")
|
|
}
|
|
m.txs = append(m.txs, tx)
|
|
return nil
|
|
}
|
|
|
|
func (m *Mempool) Remove(hash string) {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
for i, tx := range m.txs {
|
|
if tx.Hash() == hash {
|
|
m.txs = append(m.txs[:i], m.txs[i+1:]...)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (m *Mempool) All() []*Transaction {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
return append([]*Transaction(nil), m.txs...)
|
|
}
|
|
|
|
func (m *Mempool) GetByHash(hash string) *Transaction {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
for _, tx := range m.txs {
|
|
if tx.Hash() == hash {
|
|
return tx
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (m *Mempool) Pending() []*Transaction {
|
|
return m.All()
|
|
}
|
|
|
|
func (m *Mempool) Clear() {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
m.txs = []*Transaction{}
|
|
}
|
|
|
|
func (m *Mempool) Has(hash string) bool {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
for _, tx := range m.txs {
|
|
if tx.Hash() == hash {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
} |