Files
2025-05-23 10:44:32 -03:00

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
}