Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 25 additions & 61 deletions tools/preconf-rpc/handlers/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import (
"fmt"
"log/slog"
"math/big"
"strconv"
"strings"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
Expand All @@ -19,10 +17,6 @@ import (
"github.com/primev/mev-commit/tools/preconf-rpc/sender"
)

var (
preconfBlockHashPrefix = hex.EncodeToString([]byte("mev-commit"))
)

type Bidder interface {
Estimate() (int64, error)
}
Expand Down Expand Up @@ -161,7 +155,7 @@ func (h *rpcMethodHandler) RegisterMethods(server *rpcserver.JSONRPCServer) {
)
}
result := map[string]interface{}{
"bidAmount": hexutil.EncodeBig(blockPrice.BidAmount),
"bidAmount": blockPrice.BidAmount.String(),
"depositAddress": h.depositAddress.Hex(),
}

Expand Down Expand Up @@ -194,7 +188,7 @@ func (h *rpcMethodHandler) RegisterMethods(server *rpcserver.JSONRPCServer) {
}
bridgeCost := new(big.Int).Mul(blockPrice.BidAmount, big.NewInt(2))
result := map[string]interface{}{
"bidAmount": hexutil.EncodeBig(bridgeCost),
"bidAmount": bridgeCost.String(),
"bridgeAddress": h.bridgeAddress.Hex(),
}

Expand Down Expand Up @@ -225,42 +219,30 @@ func (h *rpcMethodHandler) handleGetBlockByHash(
if params[0] == nil {
return nil, false, rpcserver.NewJSONErr(
rpcserver.CodeParseError,
"getBlock parameter cannot be null",
"block hash parameter cannot be null",
)
}

blockHashStr := params[0].(string)
// Remove "0x" prefix if present
blockHashStr = strings.TrimPrefix(blockHashStr, "0x")
if !strings.HasPrefix(blockHashStr, preconfBlockHashPrefix) {
return nil, true, nil // Not a preconf block hash, proxy
}
blockHash := common.HexToHash(blockHashStr)

details := false
if len(params) > 1 && params[1] != nil {
details, _ = params[1].(bool)
txn, err := h.store.GetTransactionByHash(ctx, blockHash)
if err != nil {
return nil, true, nil
}

blockNumberWithPadding := strings.TrimPrefix(blockHashStr, preconfBlockHashPrefix)
blockNumber, err := strconv.ParseUint(blockNumberWithPadding[:8], 10, 64)
if err != nil {
return nil, false, rpcserver.NewJSONErr(
rpcserver.CodeParseError,
"getBlock parameter must be a valid preconf block hash",
)
if txn.Status != sender.TxStatusPreConfirmed {
h.logger.Warn("Transaction not in preconfirmed state", "txnHash", txn.Hash().Hex(), "status", txn.Status)
return nil, true, nil // Not a preconfirmed block
}

txns, err := h.store.GetTransactionsForBlock(ctx, int64(blockNumber))
if err != nil {
h.logger.Error("Failed to get preconfirmed transactions for block", "error", err, "blockNumber", blockNumber)
return nil, false, rpcserver.NewJSONErr(
rpcserver.CodeCustomError,
"failed to get preconfirmed transactions for block",
)
details := false
if len(params) > 1 && params[1] != nil {
details, _ = params[1].(bool)
}

block := map[string]interface{}{
"number": hexutil.Uint64(blockNumber),
"number": hexutil.Uint64(txn.BlockNumber),
"hash": blockHashStr,
"parentHash": (common.Hash{}).Hex(),
"nonce": "0x0000000000000000",
Expand All @@ -281,32 +263,16 @@ func (h *rpcMethodHandler) handleGetBlockByHash(
}

var txnsToReturn any
for i, txn := range txns {
if txn.Status != sender.TxStatusPreConfirmed {
h.logger.Warn("Skipping transaction not in preconfirmed state", "txnHash", txn.Hash().Hex(), "status", txn.Status)
continue
}
if !details {
if txnsToReturn == nil {
txnsToReturn = make([]string, 0, len(txns))
}
txnsToReturn = append(
txnsToReturn.([]string),
txn.Hash().Hex(),
)
continue
}
if txnsToReturn == nil {
txnsToReturn = make([]map[string]interface{}, len(txns))
}
if !details {
txnsToReturn = []string{txn.Hash().Hex()}
} else {
r, s, v := txn.RawSignatureValues()
txnsToReturn = append(
txnsToReturn.([]map[string]interface{}),
map[string]interface{}{
txnsToReturn = []map[string]interface{}{
{
"hash": txn.Hash().Hex(),
"blockHash": blockHashStr,
"blockNumber": hexutil.Uint64(blockNumber),
"transactionIndex": hexutil.Uint64(i),
"blockNumber": hexutil.Uint64(txn.BlockNumber),
"transactionIndex": hexutil.Uint64(0),
"type": hexutil.Uint(txn.Transaction.Type()),
"accessList": nil, // Access lists are not used in preconf blocks
"maxFeePerGas": hexutil.EncodeBig(txn.GasFeeCap()),
Expand All @@ -322,19 +288,19 @@ func (h *rpcMethodHandler) handleGetBlockByHash(
"s": hexutil.EncodeBig(s),
"v": hexutil.EncodeBig(v),
},
)
}
}
block["transactions"] = txnsToReturn
blockJSON, err := json.Marshal(block)
if err != nil {
h.logger.Error("Failed to marshal block to JSON", "error", err, "blockNumber", blockNumber)
h.logger.Error("Failed to marshal block to JSON", "error", err, "blockNumber", txn.BlockNumber)
return nil, false, rpcserver.NewJSONErr(
rpcserver.CodeCustomError,
"failed to marshal block",
)
}

h.logger.Info("Retrieved preconf block", "blockNumber", blockNumber, "txCount", len(txns))
h.logger.Info("Retrieved preconf block", "blockNumber", txn.BlockNumber, "tx", txn)
return blockJSON, false, nil
}

Expand Down Expand Up @@ -474,9 +440,7 @@ func (h *rpcMethodHandler) handleGetTxReceipt(ctx context.Context, params ...any
result["status"] = hexutil.Uint64(types.ReceiptStatusFailed)
} else {
result["status"] = hexutil.Uint64(types.ReceiptStatusSuccessful)
blockHash := fmt.Sprintf("0x%s%08d", preconfBlockHashPrefix, txn.BlockNumber)
blockHash += strings.Repeat("0", 66-len(blockHash))
result["blockHash"] = blockHash
result["blockHash"] = txn.Hash().Hex()
result["blockNumber"] = hexutil.EncodeBig(big.NewInt(txn.BlockNumber))
}

Expand Down
Loading