Files

202 lines
5.7 KiB
Go

// Package client — canonical client interface for Hanzo Bootnode.
//
// import bn "github.com/hanzoai/bootnode/api-go/client"
// var b bn.Bootnode = bn.NewClient(cfg)
package client
import (
"context"
"encoding/json"
"time"
)
// Bootnode is the blockchain-developer-platform surface: chain
// registry, JSON-RPC proxy, smart-wallet provisioning, token + NFT
// metadata reads, webhook subscriptions.
type Bootnode interface {
// Kind reports the backend identifier (hanzo-bootnode).
Kind() string
// Chains returns the available chain catalog (id, chainId, name).
Chains(ctx context.Context) ([]Chain, error)
// ChainStatus returns the indexer's snapshot of a chain's current
// height + uptime.
ChainStatus(ctx context.Context, chainID string) (*ChainStatus, error)
// RPC proxies a JSON-RPC request to the chain's upstream provider.
// The response is the raw RPC envelope (jsonrpc + id + result/error)
// the caller passes back to its client unchanged.
RPC(ctx context.Context, chainID string, request json.RawMessage) (json.RawMessage, error)
// CreateProject opens a developer project. Org is taken from the
// authenticated caller's claims.
CreateProject(ctx context.Context, req CreateProjectRequest) (*Project, error)
// ListProjects returns projects in the caller's org.
ListProjects(ctx context.Context) ([]Project, error)
// IssueAPIKey mints a new API key for a project. The plaintext key
// is returned ONCE; the caller persists it. Subsequent reads see
// only the prefix.
IssueAPIKey(ctx context.Context, projectID, name string) (*APIKeyIssued, error)
// RevokeAPIKey disables an API key. Idempotent.
RevokeAPIKey(ctx context.Context, keyID string) error
// RegisterWallet binds a smart wallet (EIP-4337) or EOA to a
// project for tracking. Returns the wallet record.
RegisterWallet(ctx context.Context, req RegisterWalletRequest) (*Wallet, error)
// ListWallets returns wallets bound to a project.
ListWallets(ctx context.Context, projectID string) ([]Wallet, error)
// TokenMetadata returns the canonical ERC-20 metadata for an
// address on a chain.
TokenMetadata(ctx context.Context, chainID, address string) (*TokenInfo, error)
// TokenBalance returns the holder's balance.
TokenBalance(ctx context.Context, chainID, token, holder string) (*Balance, error)
// NFTCollection returns collection-level metadata.
NFTCollection(ctx context.Context, chainID, collection string) (*NFTCollection, error)
// NFTToken returns single-token metadata.
NFTToken(ctx context.Context, chainID, collection, tokenID string) (*NFTToken, error)
// SubscribeWebhook registers a per-project webhook subscription.
SubscribeWebhook(ctx context.Context, req WebhookRequest) (*Webhook, error)
// UnsubscribeWebhook removes a subscription. Idempotent.
UnsubscribeWebhook(ctx context.Context, webhookID string) error
}
// Chain is one chain registry entry.
type Chain struct {
ID string // canonical short name (ethereum | lux-c | liquid | pars | zoo | hanzo)
ChainID int // EIP-155 chain id
Name string // display name
}
// ChainStatus is the indexer-reported live status.
type ChainStatus struct {
ChainID string
Online bool
Height uint64
At time.Time
}
// CreateProjectRequest is the project-creation payload.
type CreateProjectRequest struct {
Name string
Description string
// AllowedChains restricts the project's RPC access. Empty = all
// chains in the registry.
AllowedChains []string
}
// Project is the canonical project record.
type Project struct {
ID string
Name string
OwnerID string
OrgID string
Description string
AllowedChains []string
CreatedAt time.Time
UpdatedAt time.Time
}
// APIKeyIssued is the response from IssueAPIKey. PlaintextKey is
// shown once.
type APIKeyIssued struct {
ID string
ProjectID string
Name string
PlaintextKey string // shown once; persist client-side
KeyPrefix string // displayed in admin lists
RateLimit int
CreatedAt time.Time
}
// RegisterWalletRequest is the wallet-binding payload.
type RegisterWalletRequest struct {
ProjectID string
Chain string
Address string
Label string
SmartWallet bool
}
// Wallet is the canonical wallet record.
type Wallet struct {
ID string
ProjectID string
Chain string
Address string
Label string
SmartWallet bool
CreatedAt time.Time
}
// TokenInfo is the ERC-20 metadata sidecar.
type TokenInfo struct {
Chain string
Address string
Name string
Symbol string
Decimals int
TotalSupply string // decimal string to preserve precision
}
// Balance is a holder's balance + USD value (when oracle data is
// available).
type Balance struct {
Token string
Holder string
Balance string // decimal string
BalanceUSD float64
}
// NFTCollection is collection-level metadata.
type NFTCollection struct {
Chain string
Address string
Name string
Symbol string
Standard string // erc721 | erc1155
TotalSupply uint64
}
// NFTToken is one NFT's metadata.
type NFTToken struct {
Chain string
Collection string
TokenID string
Owner string
TokenURI string
Metadata map[string]any
}
// WebhookRequest is the webhook-subscription payload.
type WebhookRequest struct {
ProjectID string
Name string
URL string
// Events is the subscription filter
// (block.new | tx.confirmed | log.matched | wallet.balance_changed).
Events []string
}
// Webhook is the canonical subscription record.
type Webhook struct {
ID string
ProjectID string
Name string
URL string
Events []string
Secret string // signing secret, shown once at creation
CreatedAt time.Time
}