跳转到主要内容

Documentation Index

Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt

Use this file to discover all available pages before exploring further.

Polymarket 的 Relayer Client 为你的用户提供免 gas 交易功能。用户无需持有 POL 来支付 gas 费,Polymarket 的基础设施会支付所有交易费用。这创造了一种无缝体验,用户只需要 pUSD 就能交易。

工作原理

relayer 充当交易赞助者:
  1. 你的应用创建一笔交易
  2. 用户用私钥签名
  3. 你的应用将交易发送到 Polymarket 的 relayer
  4. relayer 将交易提交到链上并支付 gas 费
  5. 交易从用户钱包执行

覆盖范围

Polymarket 为通过 relayer 路由的所有操作支付 gas:
操作说明
Wallet deployment为新用户部署 Safe 或 Proxy 钱包
Token approvals授权合约使用 pUSD 或结果代币
CTF operations拆分、合并和兑换仓位
Transfers在地址之间转移代币

身份验证

relayer 使用 Relayer API Keys。你可以在 Polymarket 网站的 Settings > API Keys 创建。
已经有 builder 签名密钥? 你现有的基于 HMAC 的 builder API key 在 Relayer 上继续有效 — 无需轮换或重新签发。CLOB V2 中只有订单签名迁移到原生的 builderCode 字段。详见迁移到 CLOB V2
请求中需要包含以下 header:
Header说明
RELAYER_API_KEY你的 Relayer API key
RELAYER_API_KEY_ADDRESS拥有该 key 的地址
如果你想直接使用 Relayer API Key 而不使用 SDK,请参阅 Relayer API Reference

前置要求

使用 relayer 之前,你需要:
要求来源
Relayer API KeySettings > API Keys
用户的私钥或签名器你的钱包集成
pUSD 余额用于交易(不是用于 gas)

安装

npm install @polymarket/builder-relayer-client

客户端设置

使用你的 Relayer API Key 初始化 relayer 客户端:
import { createWalletClient, http, Hex } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { polygon } from "viem/chains";
import { RelayClient } from "@polymarket/builder-relayer-client";

const account = privateKeyToAccount(process.env.PRIVATE_KEY as Hex);
const wallet = createWalletClient({
  account,
  chain: polygon,
  transport: http(process.env.RPC_URL),
});

const client = new RelayClient({
  host: "https://relayer-v2.polymarket.com/",
  chain: 137,
  signer: wallet,
  relayerApiKey: process.env.RELAYER_API_KEY!,
  relayerApiKeyAddress: process.env.RELAYER_API_KEY_ADDRESS!,
});
永远不要在客户端代码中暴露你的 Relayer API Key。使用环境变量或密钥管理器。

钱包类型

初始化客户端时选择钱包类型:
类型部署方式最适用于
Safe在首次交易前调用 deploy()大多数 builder 集成
Proxy首次交易时自动部署Magic Link 用户
import { RelayClient, RelayerTxType } from "@polymarket/builder-relayer-client";

const client = new RelayClient({
  host: "https://relayer-v2.polymarket.com/",
  chain: 137,
  signer: wallet,
  relayerApiKey: process.env.RELAYER_API_KEY!,
  relayerApiKeyAddress: process.env.RELAYER_API_KEY_ADDRESS!,
  txType: RelayerTxType.SAFE,
});

// Deploy before first transaction
const response = await client.deploy();
const result = await response.wait();
console.log("Safe Address:", result?.proxyAddress);

执行交易

使用 execute 方法通过 relayer 发送交易:
interface Transaction {
  to: string; // Target contract address
  data: string; // Encoded function call
  value: string; // POL to send (usually "0")
}

const response = await client.execute(transactions, "Description");
const result = await response.wait();

代币授权

授权合约使用代币:
import { encodeFunctionData, maxUint256 } from "viem";

const pUSD = "0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB";
const CTF = "0x4D97DCd97eC945f40cF65F87097ACe5EA0476045";

const approveTx = {
  to: pUSD,
  data: encodeFunctionData({
    abi: [
      {
        name: "approve",
        type: "function",
        inputs: [
          { name: "spender", type: "address" },
          { name: "amount", type: "uint256" },
        ],
        outputs: [{ type: "bool" }],
      },
    ],
    functionName: "approve",
    args: [CTF, maxUint256],
  }),
  value: "0",
};

const response = await client.execute([approveTx], "Approve pUSD for CTF");
await response.wait();

兑换仓位

市场判定后,将获胜代币兑换为 pUSD:
import { encodeFunctionData } from "viem";

const redeemTx = {
  to: CTF_ADDRESS,
  data: encodeFunctionData({
    abi: [
      {
        name: "redeemPositions",
        type: "function",
        inputs: [
          { name: "collateralToken", type: "address" },
          { name: "parentCollectionId", type: "bytes32" },
          { name: "conditionId", type: "bytes32" },
          { name: "indexSets", type: "uint256[]" },
        ],
        outputs: [],
      },
    ],
    functionName: "redeemPositions",
    args: [collateralToken, parentCollectionId, conditionId, indexSets],
  }),
  value: "0",
};

const response = await client.execute([redeemTx], "Redeem positions");
await response.wait();

批量交易

在单次调用中原子性地执行多个操作:
const approveTx = {
  to: pUSD,
  data: encodeFunctionData({
    abi: erc20Abi,
    functionName: "approve",
    args: [CTF, maxUint256],
  }),
  value: "0",
};

const transferTx = {
  to: pUSD,
  data: encodeFunctionData({
    abi: erc20Abi,
    functionName: "transfer",
    args: [recipientAddress, parseUnits("50", 6)],
  }),
  value: "0",
};

// Both execute atomically
const response = await client.execute(
  [approveTx, transferTx],
  "Approve and transfer",
);
await response.wait();
批量处理可以减少延迟,并确保所有交易要么全部成功,要么全部失败。

交易状态

通过这些状态跟踪交易进度:
状态终态说明
STATE_NEWrelayer 已收到交易
STATE_EXECUTED已提交到链上
STATE_MINED已打包进区块
STATE_CONFIRMED成功确认
STATE_FAILED永久失败
STATE_INVALID被拒绝为无效

合约地址

所有 Polymarket 智能合约地址详见合约

资源

下一步

Negative Risk Markets

了解多结果事件的资本高效交易。

Positions & Tokens

理解拆分、合并和兑换等代币操作。