介绍
# PNP Markets
在 Base 主网上使用任何 ERC20 代币作为抵押品来创建和管理预测市场。
## 快速决策
``` Need prediction markets? ├─ Create market → npx ts-node scripts/create-market.ts --help ├─ Trade (buy/sell) → npx ts-node scripts/trade.ts --help ├─ Settle market → npx ts-node scripts/settle.ts --help └─ Redeem winnings → npx ts-node scripts/redeem.ts --help ```
## 环境
```bash export PRIVATE_KEY=<wallet_private_key> # Required export RPC_URL=<base_rpc_endpoint> # Optional (defaults to public RPC) ```
在生产环境中,请使用专用的 RPC(如 Alchemy、QuickNode)以避免速率限制。
## 脚本
首先使用 `--help` 运行任何脚本以查看所有选项。
### 创建市场
```bash npx ts-node scripts/create-market.ts \ --question "Will ETH reach $10k by Dec 2025?" \ --duration 168 \ --liquidity 100 ```
选项:`--collateral <USDC|WETH|address>`,`--decimals <n>`
### 交易
```bash # Buy YES tokens npx ts-node scripts/trade.ts --buy --condition 0x... --outcome YES --amount 10
# Sell NO tokens npx ts-node scripts/trade.ts --sell --condition 0x... --outcome NO --amount 5 --decimals 18
# View prices only npx ts-node scripts/trade.ts --info --condition 0x... ```
### 结算
```bash # Settle as YES winner npx ts-node scripts/settle.ts --condition 0x... --outcome YES
# Check status npx ts-node scripts/settle.ts --status --condition 0x... ```
### 赎回
```bash npx ts-node scripts/redeem.ts --condition 0x... ```
## 编程式用法
```typescript import { PNPClient } from "pnp-evm"; import { ethers } from "ethers";
const client = new PNPClient({ rpcUrl: process.env.RPC_URL || "https://mainnet.base.org", privateKey: process.env.PRIVATE_KEY!, });
// Create market const { conditionId } = await client.market.createMarket({ question: "Will X happen?", endTime: Math.floor(Date.now() / 1000) + 86400 * 7, initialLiquidity: ethers.parseUnits("100", 6).toString(), });
// Trade await client.trading.buy(conditionId, ethers.parseUnits("10", 6), "YES");
// Settle (after endTime) const tokenId = await client.trading.getTokenId(conditionId, "YES"); await client.market.settleMarket(conditionId, tokenId);
// Redeem await client.redemption.redeem(conditionId); ```
## 抵押代币
使用任何 ERC20 代币。常见的 Base 主网代币:
| 代币 | 地址 | 小数位数 | |-------|---------|----------| | USDC | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` | 6 | | WETH | `0x4200000000000000000000000000000000000006` | 18 | | cbETH | `0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22` | 18 |
自定义代币可增加实用性——持有人可以参与您的市场。
## ERC20 授权
在与 PNP 合约交互之前,您必须授权它们使用您的抵押代币。这是所有 EVM dApp 的标准操作。
### 工作原理
1. **首次交互需要授权**:当您首次使用某个代币创建市场或进行交易时,会发送一笔授权交易 2. **无限授权**:SDK 使用 `type(uint256).max` 授权(标准的 EVM 模式),因此每个代币只需授权一次 3. **后续交互**:无需授权——交易直接执行
### 时序注意事项
授权交易必须在主交易执行之前在链上确认。如果您看到:
``` ERC20: transfer amount exceeds allowance ```
这意味着授权尚未被矿工确认。**只需等待几秒钟然后重试**——授权一旦确认,后续尝试就会成功。
### 为什么使用无限授权?
- **Gas 效率**:一次授权,永久交易,无需额外交易 - **更好的用户体验**:没有重复的授权弹窗 - **行业标准**:被 Uniswap、Aave 和大多数主要 DeFi 协议使用
对于对安全性要求极高的用户,您可以手动设置特定的授权金额,但这需要在每次交互前进行一笔授权交易。
## 合约
| 合约 | 地址 | |----------|---------| | PNP 工厂 | `0x5E5abF8a083a8E0c2fBf5193E711A61B1797e15A` | | 费用管理器 | `0x6f1BffB36aC53671C9a409A0118cA6fee2b2b462` |
## 为什么选择预测市场?
- **信息发现**:市场价格揭示集体概率估计 - **代币实用性**:将您的代币作为抵押品以推动参与度 - **竞赛**:举办参与者对结果进行质押的竞赛 - **预测**:聚合群体智慧以辅助决策
pAMM 虚拟流动性模型确保即使在初始流动性极少的情况下也能顺畅交易。
## 故障排除
### "ERC20: transfer amount exceeds allowance"
授权交易尚未确认。等待 5-10 秒后重试。
### "Market doesn't exist"
市场创建交易可能失败或仍处于待处理状态。请在 BaseScan 上验证您的交易是否已成功确认。
### "over rate limit" / RPC 错误
公共 Base RPC 存在速率限制。请使用专用的 RPC 提供商: ```bash export RPC_URL=https://base-mainnet.g.alchemy.com/v2/YOUR_KEY ```
### 交易卡住或缓慢
Base 主网偶尔会出现拥堵。检查 Gas 价格,并在需要时考虑增加 Gas。
## 参考文件
- **API 参考**:完整的 SDK 文档请参阅 [references/api-reference.md](references/api-reference.md) - **用例**:详细的用例模式请参阅 [references/use-cases.md](references/use-cases.md) - **示例**:完整的代码示例请参阅 [references/examples.md](references/examples.md)