package main import ( "context" "fmt" "strings" "time" arkv1 "github.com/ark-network/ark/api-spec/protobuf/gen/ark/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" ) type vtxo struct { amount uint64 txid string vout uint32 poolTxid string expireAt *time.Time } func getVtxos( ctx context.Context, explorer Explorer, client arkv1.ArkServiceClient, addr string, withExpiration bool, ) ([]vtxo, error) { response, err := client.ListVtxos(ctx, &arkv1.ListVtxosRequest{ Address: addr, }) if err != nil { return nil, err } vtxos := make([]vtxo, 0, len(response.Vtxos)) for _, v := range response.Vtxos { vtxos = append(vtxos, vtxo{ amount: v.Receiver.Amount, txid: v.Outpoint.Txid, vout: v.Outpoint.Vout, poolTxid: v.PoolTxid, }) } if !withExpiration { return vtxos, nil } redeemBranches, err := getRedeemBranches(ctx, explorer, client, vtxos) if err != nil { return nil, err } for vtxoTxid, branch := range redeemBranches { expiration, err := branch.expireAt() if err != nil { return nil, err } for i, vtxo := range vtxos { if vtxo.txid == vtxoTxid { vtxos[i].expireAt = expiration break } } } return vtxos, nil } func getClientFromState() (arkv1.ArkServiceClient, func(), error) { state, err := getState() if err != nil { return nil, nil, err } addr := state[ASP_URL] if len(addr) <= 0 { return nil, nil, fmt.Errorf("missing asp url") } return getClient(addr) } func getClient(addr string) (arkv1.ArkServiceClient, func(), error) { creds := insecure.NewCredentials() port := 80 if strings.HasPrefix(addr, "https://") { addr = strings.TrimPrefix(addr, "https://") creds = credentials.NewTLS(nil) port = 443 } if !strings.Contains(addr, ":") { addr = fmt.Sprintf("%s:%d", addr, port) } conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(creds)) if err != nil { return nil, nil, err } client := arkv1.NewArkServiceClient(conn) closeFn := func() { err := conn.Close() if err != nil { fmt.Printf("error closing connection: %s\n", err) } } return client, closeFn, nil }