bridge: allow specifying skip_preflight in debug VAA submission
This allows forcibly submitting a failing VAA on-chain in cases where the preflight check would hinder debugging. It does not change behavior of guardiand. Co-authored-by: Hendrik Hofstadt <hendrik@nexantic.com> Change-Id: I63df22049ad27f659dc0638190edd20628b7a338
This commit is contained in:
parent
c1c2c7ae49
commit
79cc6a9f46
|
@ -14,10 +14,12 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
agentRPC *string
|
agentRPC *string
|
||||||
|
skipPreflight *bool
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
agentRPC = postVaaSolanaCmd.Flags().String("agentRPC", "", "Solana agent sidecar gRPC socket path")
|
agentRPC = postVaaSolanaCmd.Flags().String("agentRPC", "", "Solana agent sidecar gRPC socket path")
|
||||||
|
skipPreflight = postVaaSolanaCmd.Flags().Bool("skipPreflight", false, "Set skip_preflight flag on submission")
|
||||||
DebugCmd.AddCommand(postVaaSolanaCmd)
|
DebugCmd.AddCommand(postVaaSolanaCmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +34,7 @@ var postVaaSolanaCmd = &cobra.Command{
|
||||||
}
|
}
|
||||||
supervisor.New(context.Background(), logger, func(ctx context.Context) error {
|
supervisor.New(context.Background(), logger, func(ctx context.Context) error {
|
||||||
if err := supervisor.Run(ctx, "solvaa",
|
if err := supervisor.Run(ctx, "solvaa",
|
||||||
solana.NewSolanaVAASubmitter(*agentRPC, vaaQueue).Run); err != nil {
|
solana.NewSolanaVAASubmitter(*agentRPC, vaaQueue, *skipPreflight).Run); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -410,7 +410,7 @@ func runBridge(cmd *cobra.Command, args []string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := supervisor.Run(ctx, "solvaa",
|
if err := supervisor.Run(ctx, "solvaa",
|
||||||
solana.NewSolanaVAASubmitter(*agentRPC, solanaVaaC).Run); err != nil {
|
solana.NewSolanaVAASubmitter(*agentRPC, solanaVaaC, false).Run); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,11 +44,12 @@ type (
|
||||||
SolanaVAASubmitter struct {
|
SolanaVAASubmitter struct {
|
||||||
url string
|
url string
|
||||||
vaaChan chan *vaa.VAA
|
vaaChan chan *vaa.VAA
|
||||||
|
skipPreflight bool
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewSolanaVAASubmitter(url string, vaaQueue chan *vaa.VAA) *SolanaVAASubmitter {
|
func NewSolanaVAASubmitter(url string, vaaQueue chan *vaa.VAA, skipPreflight bool) *SolanaVAASubmitter {
|
||||||
return &SolanaVAASubmitter{url: url, vaaChan: vaaQueue}
|
return &SolanaVAASubmitter{url: url, vaaChan: vaaQueue, skipPreflight: skipPreflight}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *SolanaVAASubmitter) Run(ctx context.Context) error {
|
func (e *SolanaVAASubmitter) Run(ctx context.Context) error {
|
||||||
|
@ -112,7 +113,7 @@ func (e *SolanaVAASubmitter) Run(ctx context.Context) error {
|
||||||
h := hex.EncodeToString(m.Bytes())
|
h := hex.EncodeToString(m.Bytes())
|
||||||
|
|
||||||
timeout, cancel := context.WithTimeout(ctx, 120*time.Second)
|
timeout, cancel := context.WithTimeout(ctx, 120*time.Second)
|
||||||
res, err := c.SubmitVAA(timeout, &agentv1.SubmitVAARequest{Vaa: vaaBytes})
|
res, err := c.SubmitVAA(timeout, &agentv1.SubmitVAARequest{Vaa: vaaBytes, SkipPreflight: e.skipPreflight})
|
||||||
cancel()
|
cancel()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
st, ok := status.FromError(err)
|
st, ok := status.FromError(err)
|
||||||
|
|
|
@ -16,6 +16,7 @@ message Empty {
|
||||||
|
|
||||||
message SubmitVAARequest {
|
message SubmitVAARequest {
|
||||||
bytes vaa = 1;
|
bytes vaa = 1;
|
||||||
|
bool skip_preflight = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message SubmitVAAResponse {
|
message SubmitVAAResponse {
|
||||||
|
|
|
@ -92,7 +92,7 @@ impl Agent for AgentImpl {
|
||||||
};
|
};
|
||||||
|
|
||||||
for mut tx in verify_txs {
|
for mut tx in verify_txs {
|
||||||
match sign_and_send(&rpc, &mut tx, vec![&key]) {
|
match sign_and_send(&rpc, &mut tx, vec![&key], request.skip_preflight) {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
return Err(Status::new(
|
return Err(Status::new(
|
||||||
|
@ -104,7 +104,7 @@ impl Agent for AgentImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut transaction2 = Transaction::new_with_payer(&[ix], Some(&key.pubkey()));
|
let mut transaction2 = Transaction::new_with_payer(&[ix], Some(&key.pubkey()));
|
||||||
match sign_and_send(&rpc, &mut transaction2, vec![&key]) {
|
match sign_and_send(&rpc, &mut transaction2, vec![&key], request.skip_preflight) {
|
||||||
Ok(s) => Ok(Response::new(SubmitVaaResponse {
|
Ok(s) => Ok(Response::new(SubmitVaaResponse {
|
||||||
signature: s.to_string(),
|
signature: s.to_string(),
|
||||||
})),
|
})),
|
||||||
|
@ -285,6 +285,7 @@ fn sign_and_send(
|
||||||
rpc: &RpcClient,
|
rpc: &RpcClient,
|
||||||
tx: &mut Transaction,
|
tx: &mut Transaction,
|
||||||
keys: Vec<&Keypair>,
|
keys: Vec<&Keypair>,
|
||||||
|
skip_preflight: bool,
|
||||||
) -> Result<Signature, ClientError> {
|
) -> Result<Signature, ClientError> {
|
||||||
let (recent_blockhash, _fee_calculator) = rpc.get_recent_blockhash()?;
|
let (recent_blockhash, _fee_calculator) = rpc.get_recent_blockhash()?;
|
||||||
|
|
||||||
|
@ -296,7 +297,7 @@ fn sign_and_send(
|
||||||
commitment: CommitmentLevel::Processed,
|
commitment: CommitmentLevel::Processed,
|
||||||
},
|
},
|
||||||
RpcSendTransactionConfig {
|
RpcSendTransactionConfig {
|
||||||
skip_preflight: false,
|
skip_preflight,
|
||||||
preflight_commitment: Some(CommitmentLevel::Processed),
|
preflight_commitment: Some(CommitmentLevel::Processed),
|
||||||
encoding: None,
|
encoding: None,
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue