package main
import (
"encoding/hex"
"fmt"
"log"
fabric "github.com/spacesprotocol/fabric-go"
lv "github.com/spacesprotocol/libveritas-go"
)
func exampleResolveIntro() error {
f := fabric.New()
zone, err := f.Resolve("alice@bitcoin")
if err != nil {
return err
}
_ = zone
return nil
}
func exampleResolve() error {
f := fabric.New()
zone, err := f.Resolve("alice@bitcoin")
if err != nil {
return err
}
if zone == nil {
fmt.Println("handle not found")
return nil
}
fmt.Printf("Handle found: %s\n", zone.Handle)
return nil
}
func exampleTrustAndVerification() error {
f := fabric.New()
zone, err := f.Resolve("alice@bitcoin")
if err != nil {
return err
}
f.Badge(*zone)
qr := "veritas://scan?id=14ef902621df01bdeee0b23fedf67458563a20df600af8979a4748dcd9d1b9f9"
if err := f.TrustFromQr(qr); err != nil {
return err
}
f.Badge(*zone)
if err := f.SemiTrustFromQr(qr); err != nil {
return err
}
f.Trusted() f.SemiTrusted() f.Observed()
f.ClearTrusted()
f.ClearSemiTrusted()
return nil
}
func exampleUnpackRecords() error {
f := fabric.New()
zone, err := f.Resolve("alice@bitcoin")
if err != nil {
return err
}
records, err := zone.Records.Unpack()
if err != nil {
return err
}
for _, record := range records {
switch r := record.(type) {
case lv.ParsedRecordTxt:
fmt.Printf("txt %s=%s\n", r.Key, joinStrings(r.Value))
case lv.ParsedRecordAddr:
fmt.Printf("addr %s=%s\n", r.Key, joinStrings(r.Value))
}
}
return nil
}
func exampleResolveAll() error {
f := fabric.New()
zones, err := f.ResolveAll([]string{"alice@bitcoin", "bob@bitcoin"})
if err != nil {
return err
}
for _, zone := range zones {
fmt.Printf("%s: %s\n", zone.Handle, zone.Sovereignty)
}
return nil
}
func examplePackRecords() error {
records, err := lv.RecordSetPack([]lv.Record{
lv.RecordSeq{Version: 1},
lv.RecordTxt{Key: "website", Value: []string{"https://example.com"}},
lv.RecordAddr{Key: "btc", Value: []string{"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"}},
lv.RecordAddr{Key: "nostr", Value: []string{
"npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6",
"wss://relay.example.com",
}},
})
if err != nil {
return err
}
_ = records
return nil
}
func examplePublish() error {
f := fabric.New()
secretKey, err := hex.DecodeString(
"0000000000000000000000000000000000000000000000000000000000000001",
)
if err != nil {
return err
}
rs, err := lv.RecordSetPack([]lv.Record{
lv.RecordSeq{Version: 1},
lv.RecordTxt{Key: "website", Value: []string{"https://example.com"}},
lv.RecordAddr{Key: "btc", Value: []string{"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"}},
})
if err != nil {
return err
}
cert, err := f.Export("alice@bitcoin")
if err != nil {
return err
}
err = f.Publish(cert, rs, secretKey, true)
if err != nil {
return err
}
return nil
}
func exampleResolveById() error {
f := fabric.New()
zone, err := f.ResolveById("num1qx8dtlzq...")
if err != nil {
return err
}
if zone == nil {
fmt.Println("handle not found")
return nil
}
fmt.Printf("Handle found: %s\n", zone.Handle)
return nil
}
func exampleSearchAddr() error {
f := fabric.New()
zones, err := f.SearchAddr("nostr", "npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6")
if err != nil {
return err
}
for _, zone := range zones {
fmt.Printf("%s: %s\n", zone.Handle, zone.Sovereignty)
}
return nil
}
func exampleMessageBuilder() error {
f := fabric.New()
secretKey, err := hex.DecodeString(
"0000000000000000000000000000000000000000000000000000000000000001",
)
if err != nil {
return err
}
certBytes, err := f.Export("alice@bitcoin")
if err != nil {
return err
}
records, err := lv.RecordSetPack([]lv.Record{
lv.RecordSeq{Version: 1},
lv.RecordAddr{Key: "btc", Value: []string{"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"}},
})
if err != nil {
return err
}
builder := lv.NewMessageBuilder()
if err := builder.AddHandle(certBytes, records.ToBytes()); err != nil {
return err
}
proofReq, err := builder.ChainProofRequest()
if err != nil {
return err
}
proofBytes, err := f.Prove([]byte(proofReq))
if err != nil {
return err
}
result, err := builder.Build(proofBytes)
if err != nil {
return err
}
for _, u := range result.Unsigned {
u.SetFlags(u.Flags() | lv.SigPrimaryZone())
sig, err := fabric.SignSchnorr(u.SigningId(), secretKey)
if err != nil {
return err
}
if err := result.Message.SetRecords(u.Canonical(), u.PackSig(sig)); err != nil {
return err
}
}
if err := f.Broadcast(result.Message.ToBytes()); err != nil {
return err
}
return nil
}
func joinStrings(ss []string) string {
result := ""
for i, s := range ss {
if i > 0 {
result += ", "
}
result += s
}
return result
}
func main() {
if err := exampleResolve(); err != nil {
log.Fatal(err)
}
if err := exampleTrustAndVerification(); err != nil {
fmt.Printf("verification example failed (expected): %v\n", err)
}
if err := exampleUnpackRecords(); err != nil {
log.Fatal(err)
}
if err := exampleResolveAll(); err != nil {
log.Fatal(err)
}
if err := examplePackRecords(); err != nil {
log.Fatal(err)
}
if err := examplePublish(); err != nil {
log.Fatal(err)
}
if err := exampleResolveById(); err != nil {
log.Fatal(err)
}
if err := exampleSearchAddr(); err != nil {
log.Fatal(err)
}
if err := exampleMessageBuilder(); err != nil {
log.Fatal(err)
}
fmt.Println("Done!")
}