// go get github.com/Cr3dentials/zktls-consumers/consumers/go/zktlsclaim (Go 1.27+)
func startBundles(ctx context.Context, pinnedOperatorPEM []byte, url string) (*zktlsclaim.BundleClient, error) {
key, err := zktlsclaim.ParseOperatorKey(pinnedOperatorPEM)
if err != nil {
return nil, err
}
bundles := zktlsclaim.NewBundleClient(url, key, nil, nil)
go bundles.Run(ctx) // every 60 s, highest version only, stale after 30 min
return bundles, nil
}
func accept(bundles *zktlsclaim.BundleClient, encoded, policyID string) ([]zktlsclaim.TypedOutput, error) {
raw, err := base64.StdEncoding.DecodeString(encoded)
if err != nil {
return nil, err
}
c, err := zktlsclaim.ClaimCanonicalDecode(raw)
if err != nil {
return nil, err
}
b, err := bundles.Current()
if err != nil {
return nil, err
}
outputs, err := zktlsclaim.VerifyClaim(c, b, uint64(time.Now().Unix()))
if err != nil {
return nil, err
}
if c.PolicyID != policyID {
return nil, fmt.Errorf("claim is for %s", c.PolicyID)
}
return outputs, nil // then zktlsclaim.ConsumeNullifier(c, yourStore)
}