package main
import (
"context"
"crypto/ecdsa"
"fmt"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/xkwang/go-builder-client/sendbundle"
"google.golang.org/grpc"
"log"
"math/big"
)
type Authentication struct {
Token string
}
func (a *Authentication) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
return map[string]string{
"authorization": a.Token,
}, nil
}
func (a *Authentication) RequireTransportSecurity() bool {
return false // 未开启TLS鏈接则為 false,生產環境建議用true + 开启TLS
}
func main() {
blzrelayEndPoint := "endpoint_url"
auth := Authentication{
Token: "your_token",
}
conn, err := grpc.Dial(
blzrelayEndPoint,
grpc.WithInsecure(), // 未开启TLS使用
grpc.WithPerRPCCredentials(&auth),
)
if err != nil {
panic(err)
}
defer conn.Close()
chainId := int64(56)
to := common.HexToAddress("toAddress")
pk, _ := crypto.HexToECDSA("private key")
_, rawTx, err := GenerateAndSignTx(
big.NewInt(0), //value
big.NewInt(21000), //gas limit
big.NewInt(1e9), //gas price
&to, nil, 1, big.NewInt(chainId), pk)
fmt.Printf("rawTx:%x\n", rawTx)
if err != nil {
log.Println("Error creating signed tx:", err)
}
client := sendbundle.NewBundleServiceClient(conn)
r, err := client.SendBundle(context.Background(), &sendbundle.SendBundleArgs{
Txs: [][]byte{
rawTx,
},
//MaxBlockNumber: 1,
//RevertingTxHashes: []string{signedTx.Hash().String()},
})
//r, err := client.SendTransaction(context.Background(), &sendbundle.SendTransactionArgs{Tx: rawTx})
if err != nil {
fmt.Println(err)
} else {
println("response:", r.Result)
}
}
func GenerateAndSignTx(value, gas, gasPrice *big.Int, to *common.Address, dataBytes []byte, nonce uint64, chainID *big.Int, privateKeyECDSA *ecdsa.PrivateKey) (*types.Transaction, []byte, error) {
tx := types.NewTx(&types.LegacyTx{
Nonce: nonce,
To: to,
Value: value,
Gas: gas.Uint64(),
GasPrice: gasPrice,
Data: dataBytes,
})
signer := types.NewEIP155Signer(chainID)
signedTx, err := types.SignTx(tx, signer, privateKeyECDSA)
if err != nil {
return nil, nil, fmt.Errorf("failed to sign transaction: %v", err)
}
rawTxBytes, err := signedTx.MarshalBinary()
if err != nil {
return nil, nil, fmt.Errorf("failed to marshal signed transaction: %v", err)
}
return signedTx, rawTxBytes, nil
}