Transaction confirmation and lifecycle tracking
- Dominant language
- Go
- Stars
- 4
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
## Summary
Implement transaction lifecycle tracking from broadcast through confirmation or rejection.
Parent: #4
## Flow
```
Broadcast (SYNC) → Mempool → Included in Block → Committed
│ │
▼ ▼
Evicted Rejected (execution error)
```
## Requirements
### Broadcast
- Use `BroadcastTxSync` (returns after mempool acceptance, not block inclusion)
- Capture tx hash from response
- Handle immediate rejection (invalid tx, mempool full)
### Confirmation polling
- Poll `TxStatus` at configurable interval (default: 1s)
- Timeout after configurable duration (default: 2 minutes)
- Return confirmed height and gas used on success
### Eviction handling
- If tx is evicted from mempool, optionally resubmit with same or bumped gas price
- Max resubmission attempts: configurable (default: 1)
- Log eviction events for debugging
### Rejection handling
- If tx is included but execution fails, capture error code, codespace, gas wanted/used
- Reset nonce to enable subsequent transactions (#8)
- Return structured error with all context
### Timeout handling
- If confirmation times out, return error but do NOT assume tx failed (it may still confirm)
- Track "unconfirmed" transactions for later reconciliation
## Interface
```go
type TxResult struct {
TxHash string
Height int64
GasUsed int64
Code uint32 // 0 = success
Error string // non-empty if Code != 0
Duration time.Duration // broadcast to confirmation
}
type TxTracker interface {
Submit(ctx context.Context, txBytes []byte) (*TxResult, error)
Pending() []string // tx hashes still awaiting confirmation
}
```
## References
- celestia-app `pkg/user/tx_client.go` — `ConfirmTx()`, eviction handling
- CometBFT `TxStatus` endpoint
Contributor guide
Assessment
This issue has not been assessed yet.