blocto / solana-go-sdk

Solana Golang SDK
https://blocto.github.io/solana-go-sdk/
MIT License
373 stars 96 forks source link

The API is required to check whether the transaction is successful #25

Closed keyflux closed 2 years ago

keyflux commented 2 years ago

I used GetTransaction, but the result can't confirm whether the transaction is failed or not. Do you have any suggestions ?

yihau commented 2 years ago

for v1.8.1 you can do

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/portto/solana-go-sdk/client"
    "github.com/portto/solana-go-sdk/client/rpc"
)

func main() {
    c := client.NewClient(rpc.DevnetRPCEndpoint)
    res, err := c.GetTransaction(
        context.Background(),
        "5K4QuDxZjFkAhv8Kfj6pocDf59Cuo8EmxbRcM1d4PVaSWekF6RdC2krJHucF1FhkuSFVHCMcZ4GXnSx7zzygXMdi", rpc.GetTransactionWithLimitConfig{
            Commitment: rpc.CommitmentFinalized,
        },
    )
    if err != nil {
        log.Fatalf("api error here, err: %v", err)
    }
    if res.Meta.Err != nil {
        log.Fatalf("tx on chain but failed, err: %v", err)
    }
    fmt.Println("ok")
}

there are two level error in this api.

  1. api error, it will happen when you can get transaction back
  2. transaction error, it will happen when your tx is on chain but failed. (execute program filed)
yihau commented 2 years ago

for v1.9.0 you can do

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/portto/solana-go-sdk/client"
    "github.com/portto/solana-go-sdk/rpc"
)

func main() {
    c := client.NewClient(rpc.DevnetRPCEndpoint)
    res, err := c.GetTransaction(
        context.Background(),
        "5K4QuDxZjFkAhv8Kfj6pocDf59Cuo8EmxbRcM1d4PVaSWekF6RdC2krJHucF1FhkuSFVHCMcZ4GXnSx7zzygXMdi",
    )
    if err != nil {
        log.Fatalf("failed to get tx, err: %v", err)
    }
    if res.Meta.Err != nil {
        log.Fatalf("tx failed on chain, err: %v", res.Meta.Err)
    }
    fmt.Println("ok")
}

feel free to open another issue if you still struggling with it