go-ethereum/internal/ethapi/sequencer.go
2023-07-17 15:53:22 +02:00

74 lines
1.4 KiB
Go

package ethapi
import (
"context"
"fmt"
"os"
client "github.com/astriaorg/go-sequencer-client"
sqproto "github.com/astriaorg/go-sequencer-client/proto"
"github.com/ethereum/go-ethereum/log"
)
const (
defaultChainID = "ethereum"
defaultCometbftRPCEndpoint = "http://localhost:26657"
)
func sendTransactionToSequencer(ctx context.Context, txBytes []byte) error {
var (
chainID, cometbftRPCEndpoint string
)
chainID = os.Getenv("CHAIN_ID")
if chainID == "" {
chainID = defaultChainID
}
cometbftRPCEndpoint = os.Getenv("COMETBFT_RPC_ENDPOINT")
if cometbftRPCEndpoint == "" {
cometbftRPCEndpoint = defaultCometbftRPCEndpoint
}
signer, err := client.GenerateSigner()
if err != nil {
return err
}
// default cometbft RPC endpoint
c, err := client.NewClient(cometbftRPCEndpoint)
if err != nil {
return err
}
tx := &sqproto.UnsignedTransaction{
Nonce: 1,
Actions: []*sqproto.Action{
{
Value: &sqproto.Action_SequenceAction{
SequenceAction: &sqproto.SequenceAction{
ChainId: []byte(chainID),
Data: txBytes,
},
},
},
},
}
signed, err := signer.SignTransaction(tx)
if err != nil {
return err
}
resp, err := c.BroadcastTxSync(ctx, signed)
if err != nil {
return err
}
if resp.Code != 0 {
return fmt.Errorf("failed to broadcast tx (error code %d): %s", resp.Code, resp.Log)
}
log.Info("successfully broadcasted tx to sequencer", "hash", resp.Hash)
return nil
}