|
5 | 5 | "fmt" |
6 | 6 | "math" |
7 | 7 | "strconv" |
| 8 | + "time" |
8 | 9 |
|
9 | 10 | "github.com/LumeraProtocol/supernode/v2/pkg/logtrace" |
10 | 11 | lumeracodec "github.com/LumeraProtocol/supernode/v2/pkg/lumera/codec" |
@@ -184,6 +185,20 @@ func (m *module) BroadcastTransaction(ctx context.Context, txBytes []byte) (*sdk |
184 | 185 | return resp, nil |
185 | 186 | } |
186 | 187 |
|
| 188 | +// GetTransaction queries a transaction by its hash |
| 189 | +func (m *module) GetTransaction(ctx context.Context, txHash string) (*sdktx.GetTxResponse, error) { |
| 190 | + req := &sdktx.GetTxRequest{ |
| 191 | + Hash: txHash, |
| 192 | + } |
| 193 | + |
| 194 | + resp, err := m.client.GetTx(ctx, req) |
| 195 | + if err != nil { |
| 196 | + return nil, fmt.Errorf("failed to get transaction: %w", err) |
| 197 | + } |
| 198 | + |
| 199 | + return resp, nil |
| 200 | +} |
| 201 | + |
187 | 202 | // CalculateFee calculates the transaction fee based on gas usage and config |
188 | 203 | func (m *module) CalculateFee(gasAmount uint64, config *TxConfig) string { |
189 | 204 | // Determine gas price (numeric) and denom. Accept both plain number (e.g., "0.025") |
@@ -272,6 +287,32 @@ func (m *module) ProcessTransaction(ctx context.Context, msgs []types.Msg, accou |
272 | 287 | return result, fmt.Errorf("failed to broadcast transaction: %w", err) |
273 | 288 | } |
274 | 289 |
|
| 290 | + if result != nil && result.TxResponse != nil && result.TxResponse.Code == 0 && len(result.TxResponse.Events) == 0 { |
| 291 | + logtrace.Info(ctx, "Transaction broadcast successful, waiting for inclusion to get events...", nil) |
| 292 | + |
| 293 | + // Retry 5 times with 1 second intervals |
| 294 | + var txResp *sdktx.GetTxResponse |
| 295 | + for i := 0; i < 5; i++ { |
| 296 | + time.Sleep(1 * time.Second) |
| 297 | + |
| 298 | + txResp, err = m.GetTransaction(ctx, result.TxResponse.TxHash) |
| 299 | + if err == nil && txResp != nil && txResp.TxResponse != nil { |
| 300 | + // Successfully got the transaction with events |
| 301 | + logtrace.Info(ctx, fmt.Sprintf("Retrieved transaction with %d events", len(txResp.TxResponse.Events)), nil) |
| 302 | + result.TxResponse = txResp.TxResponse |
| 303 | + break |
| 304 | + } |
| 305 | + |
| 306 | + if err != nil { |
| 307 | + logtrace.Warn(ctx, fmt.Sprintf("Attempt %d: failed to query transaction: %v", i+1, err), nil) |
| 308 | + } |
| 309 | + } |
| 310 | + } |
| 311 | + |
| 312 | + if len(result.TxResponse.Events) == 0 { |
| 313 | + logtrace.Error(ctx, "Failed to retrieve transaction events after 5 attempts", nil) |
| 314 | + } |
| 315 | + |
275 | 316 | return result, nil |
276 | 317 | } |
277 | 318 |
|
|
0 commit comments