# {{TOOL_NAME}}

> {{TOOL_DESCRIPTION}}

This is an ERC-XXXX compliant AI agent tool built with @opensea/tool-sdk.

## Manifest

- [Tool Manifest](/.well-known/ai-tool/{{TOOL_SLUG}}.json): Full ERC-XXXX manifest with inputs, outputs, and endpoint

## Calling this tool

Endpoint: POST {{TOOL_ENDPOINT}}/api

Authentication depends on which gates the tool uses (check the [manifest](/.well-known/ai-tool/{{TOOL_SLUG}}.json)):
- **Predicate gate (SIWE)**: `Authorization: SIWE <base64url(siwe_message)>.<signature>`. Build a SIWE message for the domain of `{{TOOL_ENDPOINT}}`, sign with a qualifying wallet, chain ID 8453 (Base).
- **x402 payment gate**: `X-Payment` header with a signed USDC transfer authorization. The endpoint returns `402` with payment requirements when this gate is active.
- Tools may use one gate, both, or neither.

Input: JSON body matching the manifest's `inputs` schema. See the [manifest](/.well-known/ai-tool/{{TOOL_SLUG}}.json) for the exact format.

## Using the CLI

```
# Predicate-gated tool (SIWE auth)
PRIVATE_KEY=0x... RPC_URL=https://mainnet.base.org npx @opensea/tool-sdk auth {{TOOL_ENDPOINT}}/api --body '{"query": "hello"}'

# x402-paid tool (USDC payment, no SIWE)
PRIVATE_KEY=0x... RPC_URL=https://mainnet.base.org npx @opensea/tool-sdk pay {{TOOL_ENDPOINT}}/api --body '{"query": "hello"}'

# Smoke-test (auto-detects gate type)
PRIVATE_KEY=0x... RPC_URL=https://mainnet.base.org npx @opensea/tool-sdk smoke --endpoint {{TOOL_ENDPOINT}}/api --expect 200
```

## Programmatic usage (wallet adapters)

```typescript
import { createWalletFromEnv, walletAdapterToClient } from "@opensea/tool-sdk"
import { base } from "viem/chains"

// createWalletFromEnv auto-detects provider from env vars:
//   Privy > Fireblocks > Turnkey > PrivateKey
const adapter = createWalletFromEnv()
const client = await walletAdapterToClient(adapter, base)
```

For **predicate-gated** tools (SIWE auth):

```typescript
import { authenticatedFetch } from "@opensea/tool-sdk"

const res = await authenticatedFetch(
  "{{TOOL_ENDPOINT}}/api",
  { account: client.account, method: "POST", body: JSON.stringify({ query: "hello" }) },
)
const data = await res.json()
```

For **x402-paid** tools (USDC payment, no SIWE):

```typescript
import { paidFetch } from "@opensea/tool-sdk"

const res = await paidFetch(
  "{{TOOL_ENDPOINT}}/api",
  { signer: adapter, method: "POST", body: JSON.stringify({ query: "hello" }) },
)
const data = await res.json()
```

For tools with **both** gates (SIWE + x402):

```typescript
import { paidAuthenticatedFetch } from "@opensea/tool-sdk"

const res = await paidAuthenticatedFetch(
  "{{TOOL_ENDPOINT}}/api",
  { account: client.account, signer: adapter, method: "POST", body: JSON.stringify({ query: "hello" }) },
)
const data = await res.json()
```

## Wallet providers

Set env vars and `createWalletFromEnv()` auto-detects the provider:
- `PRIVATE_KEY` + `RPC_URL` — Local private key (simplest)
- `PRIVY_APP_ID` — Privy server wallet
- `TURNKEY_API_PUBLIC_KEY` — Turnkey signing
- `FIREBLOCKS_API_KEY` — Fireblocks vault

CLI commands also accept `--wallet-provider privy|turnkey|fireblocks|private-key`.

## Response codes

- 200: Success (JSON body matching outputs schema)
- 401: Missing or invalid SIWE auth
- 402: Payment required (x402-gated tool — use `pay` command or `paidAuthenticatedFetch`)
- 403: Access predicate denied (wallet does not meet requirements)

## Creator

{{CREATOR_ADDRESS}}
