Skip to content

Go-Bot Integration

Polygolem ships a small, intentionally narrow public SDK under pkg/. The internal/ tree is not part of the stability promise and may change between minor releases — only depend on pkg/*.

Install

Terminal window
go get github.com/TrebuchetDynamics/polygolem

Then import only the packages you need:

import (
"github.com/TrebuchetDynamics/polygolem/pkg/clob"
"github.com/TrebuchetDynamics/polygolem/pkg/orderbook"
"github.com/TrebuchetDynamics/polygolem/pkg/marketresolver"
"github.com/TrebuchetDynamics/polygolem/pkg/bridge"
"github.com/TrebuchetDynamics/polygolem/pkg/gamma"
"github.com/TrebuchetDynamics/polygolem/pkg/pagination"
"github.com/TrebuchetDynamics/polygolem/pkg/relayer"
"github.com/TrebuchetDynamics/polygolem/pkg/settlement"
"github.com/TrebuchetDynamics/polygolem/pkg/stream"
"github.com/TrebuchetDynamics/polygolem/pkg/types"
"github.com/TrebuchetDynamics/polygolem/pkg/universal"
)

Read an order book

package main
import (
"context"
"fmt"
"github.com/TrebuchetDynamics/polygolem/pkg/orderbook"
)
func main() {
ctx := context.Background()
reader := orderbook.NewReader("") // empty string = production CLOB
book, err := reader.OrderBook(ctx, "713210456792522125...")
if err != nil {
panic(err)
}
fmt.Println("best bid:", book.Bids[0].Price)
fmt.Println("best ask:", book.Asks[0].Price)
}

Resolve a market by asset + timeframe

pkg/marketresolver is purpose-built for the go-bot strategy layer’s “give me the active BTC 5m market right now” question:

import "github.com/TrebuchetDynamics/polygolem/pkg/marketresolver"
resolver := marketresolver.NewResolver("")
result := resolver.ResolveTokenIDs(ctx, "BTC", "5m")
switch result.Status {
case "available":
fmt.Println("Up token:", result.UpTokenID)
fmt.Println("Down token:", result.DownTokenID)
case "unresolved":
fmt.Println("No active 5m market right now")
}

Search Gamma

import (
"github.com/TrebuchetDynamics/polygolem/pkg/types"
"github.com/TrebuchetDynamics/polygolem/pkg/universal"
)
client := universal.NewClient(universal.Config{})
markets, err := client.Markets(ctx, &types.GetMarketsParams{Limit: 10})

Gate live trading on settlement readiness

Before a live bot buys another market, prove the deposit wallet can also settle winning positions through the official V2 path:

import "github.com/TrebuchetDynamics/polygolem/pkg/settlement"
readiness, err := settlement.CheckReadiness(ctx, dataClient, owner, depositWallet, settlement.ReadinessOptions{
RPCURL: polygonRPCURL,
RelayerConfigured: true,
})
if err != nil {
return err
}
if !readiness.Ready {
return fmt.Errorf("settlement not ready: %s: %s", readiness.Status, readiness.NextAction)
}

The check is read-only. It verifies deposit-wallet bytecode, relayer credentials supplied by the caller, Data API reachability, and CTF approvals for both V2 collateral adapters.

Pagination helper

When the upstream API uses cursors, pkg/pagination.CollectAll walks every page concurrently:

import "github.com/TrebuchetDynamics/polygolem/pkg/pagination"
all, err := pagination.CollectAll(ctx, func(ctx context.Context, cursor string) ([]gamma.Market, string, error) {
resp, err := client.MarketsKeyset(ctx, gamma.MarketsKeysetParams{Cursor: cursor})
if err != nil {
return nil, "", err
}
return resp.Data, resp.NextCursor, nil
})

What the SDK does not expose

  • Hidden live onboarding. pkg/relayer.OnboardDepositWallet exposes the relayer-sponsored deploy -> approve sequence, but funding, CLOB balance sync, and preflight remain explicit operator steps.
  • Live execution gates. Those are CLI-layer concerns; embedding them would bypass the operator confirmation surface.
  • Mutable global state. Every package returns its own client instance.

Reference