Skip to main content
SigilClient wraps both the Credential and Registry Anchor programs. Construct one client per wallet and reuse it across calls.

Constructor

import { SigilClient } from '@sigil-xyz/sdk'

const client = new SigilClient(config: SigilClientConfig)

SigilClientConfig

interface SigilClientConfig {
  connection: Connection           // @solana/web3.js Connection
  wallet: AnchorProvider['wallet'] // must be able to sign transactions
}
The wallet field expects an object implementing:
{
  publicKey: PublicKey
  signTransaction<T extends Transaction | VersionedTransaction>(tx: T): Promise<T>
  signAllTransactions<T extends Transaction | VersionedTransaction>(txs: T[]): Promise<T[]>
}
This matches the AnchorProvider["wallet"] interface. Wallet adapters from @solana/wallet-adapter-react satisfy it directly.

PDA helpers

Use these to derive addresses without making RPC calls.

sigilPda

client.sigilPda(agent: PublicKey, principal: PublicKey): [PublicKey, number]
Returns [pda, bump] for the Sigil credential issued by a principal to a given agent. Derived from ["sigil", principalPubkey, agentPubkey] on the credential program.

listingPda

client.listingPda(sigil: PublicKey): [PublicKey, number]
Returns [pda, bump] for the Registry listing of a given Sigil PDA. Derived from ["listing", sigilPda] on the registry program.

Example setup

import { SigilClient } from '@sigil-xyz/sdk'
import { Connection, Keypair } from '@solana/web3.js'
import { readFileSync } from 'fs'

const connection = new Connection(
  process.env.SOLANA_RPC_URL ?? 'https://api.devnet.solana.com',
  'confirmed'
)

const keypair = Keypair.fromSecretKey(
  Uint8Array.from(JSON.parse(readFileSync(process.env.KEYPAIR_PATH!, 'utf-8')))
)

const client = new SigilClient({
  connection,
  wallet: {
    publicKey: keypair.publicKey,
    signTransaction: async (tx) => { tx.sign(keypair); return tx },
    signAllTransactions: async (txs) => { txs.forEach(tx => tx.sign(keypair)); return txs },
  },
})