@catalyst-team/poly-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env +0 -0
- package/README.md +803 -0
- package/dist/__tests__/clob-api.test.d.ts +5 -0
- package/dist/__tests__/clob-api.test.d.ts.map +1 -0
- package/dist/__tests__/clob-api.test.js +240 -0
- package/dist/__tests__/clob-api.test.js.map +1 -0
- package/dist/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
- package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bridge-client.integration.test.js +260 -0
- package/dist/__tests__/integration/bridge-client.integration.test.js.map +1 -0
- package/dist/__tests__/integration/clob-api.integration.test.d.ts +13 -0
- package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/clob-api.integration.test.js +170 -0
- package/dist/__tests__/integration/clob-api.integration.test.js.map +1 -0
- package/dist/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
- package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/ctf-client.integration.test.js +234 -0
- package/dist/__tests__/integration/ctf-client.integration.test.js.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.d.ts +9 -0
- package/dist/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.js +161 -0
- package/dist/__tests__/integration/data-api.integration.test.js.map +1 -0
- package/dist/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
- package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/gamma-api.integration.test.js +170 -0
- package/dist/__tests__/integration/gamma-api.integration.test.js.map +1 -0
- package/dist/__tests__/test-utils.d.ts +92 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/__tests__/test-utils.js +143 -0
- package/dist/__tests__/test-utils.js.map +1 -0
- package/dist/clients/bridge-client.d.ts +388 -0
- package/dist/clients/bridge-client.d.ts.map +1 -0
- package/dist/clients/bridge-client.js +587 -0
- package/dist/clients/bridge-client.js.map +1 -0
- package/dist/clients/clob-api.d.ts +318 -0
- package/dist/clients/clob-api.d.ts.map +1 -0
- package/dist/clients/clob-api.js +388 -0
- package/dist/clients/clob-api.js.map +1 -0
- package/dist/clients/ctf-client.d.ts +473 -0
- package/dist/clients/ctf-client.d.ts.map +1 -0
- package/dist/clients/ctf-client.js +915 -0
- package/dist/clients/ctf-client.js.map +1 -0
- package/dist/clients/data-api.d.ts +134 -0
- package/dist/clients/data-api.d.ts.map +1 -0
- package/dist/clients/data-api.js +265 -0
- package/dist/clients/data-api.js.map +1 -0
- package/dist/clients/gamma-api.d.ts +401 -0
- package/dist/clients/gamma-api.d.ts.map +1 -0
- package/dist/clients/gamma-api.js +352 -0
- package/dist/clients/gamma-api.js.map +1 -0
- package/dist/clients/trading-client.d.ts +252 -0
- package/dist/clients/trading-client.d.ts.map +1 -0
- package/dist/clients/trading-client.js +543 -0
- package/dist/clients/trading-client.js.map +1 -0
- package/dist/clients/websocket-manager.d.ts +100 -0
- package/dist/clients/websocket-manager.d.ts.map +1 -0
- package/dist/clients/websocket-manager.js +193 -0
- package/dist/clients/websocket-manager.js.map +1 -0
- package/dist/core/cache-adapter-bridge.d.ts +36 -0
- package/dist/core/cache-adapter-bridge.d.ts.map +1 -0
- package/dist/core/cache-adapter-bridge.js +81 -0
- package/dist/core/cache-adapter-bridge.js.map +1 -0
- package/dist/core/cache.d.ts +40 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +71 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/errors.d.ts +38 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +84 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +31 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +70 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/dist/core/types.d.ts +314 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +19 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/unified-cache.d.ts +63 -0
- package/dist/core/unified-cache.d.ts.map +1 -0
- package/dist/core/unified-cache.js +114 -0
- package/dist/core/unified-cache.js.map +1 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/errors.d.ts +33 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +86 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +62 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +173 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +155 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/guide.d.ts +12 -0
- package/dist/mcp/tools/guide.d.ts.map +1 -0
- package/dist/mcp/tools/guide.js +801 -0
- package/dist/mcp/tools/guide.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +11 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +27 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/market.d.ts +11 -0
- package/dist/mcp/tools/market.d.ts.map +1 -0
- package/dist/mcp/tools/market.js +314 -0
- package/dist/mcp/tools/market.js.map +1 -0
- package/dist/mcp/tools/order.d.ts +10 -0
- package/dist/mcp/tools/order.d.ts.map +1 -0
- package/dist/mcp/tools/order.js +258 -0
- package/dist/mcp/tools/order.js.map +1 -0
- package/dist/mcp/tools/trade.d.ts +38 -0
- package/dist/mcp/tools/trade.d.ts.map +1 -0
- package/dist/mcp/tools/trade.js +314 -0
- package/dist/mcp/tools/trade.js.map +1 -0
- package/dist/mcp/tools/trader.d.ts +11 -0
- package/dist/mcp/tools/trader.d.ts.map +1 -0
- package/dist/mcp/tools/trader.js +277 -0
- package/dist/mcp/tools/trader.js.map +1 -0
- package/dist/mcp/tools/wallet.d.ts +274 -0
- package/dist/mcp/tools/wallet.d.ts.map +1 -0
- package/dist/mcp/tools/wallet.js +579 -0
- package/dist/mcp/tools/wallet.js.map +1 -0
- package/dist/mcp/types.d.ts +413 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +5 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/services/authorization-service.d.ts +97 -0
- package/dist/services/authorization-service.d.ts.map +1 -0
- package/dist/services/authorization-service.js +279 -0
- package/dist/services/authorization-service.js.map +1 -0
- package/dist/services/market-service.d.ts +108 -0
- package/dist/services/market-service.d.ts.map +1 -0
- package/dist/services/market-service.js +458 -0
- package/dist/services/market-service.js.map +1 -0
- package/dist/services/realtime-service.d.ts +82 -0
- package/dist/services/realtime-service.d.ts.map +1 -0
- package/dist/services/realtime-service.js +150 -0
- package/dist/services/realtime-service.js.map +1 -0
- package/dist/services/swap-service.d.ts +217 -0
- package/dist/services/swap-service.d.ts.map +1 -0
- package/dist/services/swap-service.js +695 -0
- package/dist/services/swap-service.js.map +1 -0
- package/dist/services/wallet-service.d.ts +94 -0
- package/dist/services/wallet-service.d.ts.map +1 -0
- package/dist/services/wallet-service.js +173 -0
- package/dist/services/wallet-service.js.map +1 -0
- package/dist/utils/price-utils.d.ts +153 -0
- package/dist/utils/price-utils.d.ts.map +1 -0
- package/dist/utils/price-utils.js +236 -0
- package/dist/utils/price-utils.js.map +1 -0
- package/docs/00-design.md +760 -0
- package/docs/01-mcp.md +2041 -0
- package/docs/02-API.md +1148 -0
- package/docs/e2e/01-trader-tools.md +159 -0
- package/docs/e2e/02-market-tools.md +180 -0
- package/docs/e2e/03-order-tools.md +166 -0
- package/docs/e2e/04-wallet-tools.md +224 -0
- package/docs/e2e/05-trading-tools.md +327 -0
- package/docs/e2e/06-integration-scenarios.md +481 -0
- package/docs/e2e/coordinator.md +376 -0
- package/examples/01-basic-usage.ts +68 -0
- package/examples/02-smart-money.ts +95 -0
- package/examples/03-market-analysis.ts +108 -0
- package/examples/04-kline-aggregation.ts +158 -0
- package/examples/05-follow-wallet-strategy.ts +156 -0
- package/examples/06-services-demo.ts +124 -0
- package/examples/07-realtime-websocket.ts +117 -0
- package/examples/08-trading-orders.ts +278 -0
- package/examples/09-rewards-tracking.ts +187 -0
- package/examples/10-ctf-operations.ts +336 -0
- package/examples/11-live-arbitrage-scan.ts +221 -0
- package/examples/12-trending-arb-monitor.ts +406 -0
- package/examples/README.md +179 -0
- package/package.json +62 -0
- package/scripts/README.md +163 -0
- package/scripts/approvals/approve-erc1155.ts +129 -0
- package/scripts/approvals/approve-neg-risk-erc1155.ts +149 -0
- package/scripts/approvals/approve-neg-risk.ts +102 -0
- package/scripts/approvals/check-all-allowances.ts +150 -0
- package/scripts/approvals/check-allowance.ts +129 -0
- package/scripts/approvals/check-ctf-approval.ts +158 -0
- package/scripts/datas/001-report.md +486 -0
- package/scripts/datas/clone-modal-screenshot.png +0 -0
- package/scripts/deposit/deposit-native-usdc.ts +179 -0
- package/scripts/deposit/deposit-usdc.ts +155 -0
- package/scripts/deposit/swap-usdc-to-usdce.ts +375 -0
- package/scripts/research/research-markets.ts +166 -0
- package/scripts/trading/check-orders.ts +50 -0
- package/scripts/trading/sell-nvidia-positions.ts +206 -0
- package/scripts/trading/test-order.ts +172 -0
- package/scripts/truth.md +440 -0
- package/scripts/verify/test-approve-trading.ts +98 -0
- package/scripts/verify/test-provider-fix.ts +43 -0
- package/scripts/verify/test-search-mcp.ts +113 -0
- package/scripts/verify/verify-all-apis.ts +160 -0
- package/scripts/wallet/check-wallet-balances.ts +75 -0
- package/scripts/wallet/test-wallet-operations.ts +191 -0
- package/scripts/wallet/verify-wallet-tools.ts +124 -0
- package/src/__tests__/clob-api.test.ts +301 -0
- package/src/__tests__/integration/bridge-client.integration.test.ts +314 -0
- package/src/__tests__/integration/clob-api.integration.test.ts +218 -0
- package/src/__tests__/integration/ctf-client.integration.test.ts +331 -0
- package/src/__tests__/integration/data-api.integration.test.ts +194 -0
- package/src/__tests__/integration/gamma-api.integration.test.ts +206 -0
- package/src/__tests__/test-utils.ts +170 -0
- package/src/clients/bridge-client.ts +841 -0
- package/src/clients/clob-api.ts +629 -0
- package/src/clients/ctf-client.ts +1216 -0
- package/src/clients/data-api.ts +469 -0
- package/src/clients/gamma-api.ts +597 -0
- package/src/clients/trading-client.ts +749 -0
- package/src/clients/websocket-manager.ts +267 -0
- package/src/core/cache-adapter-bridge.ts +94 -0
- package/src/core/cache.ts +85 -0
- package/src/core/errors.ts +117 -0
- package/src/core/rate-limiter.ts +74 -0
- package/src/core/types.ts +360 -0
- package/src/core/unified-cache.ts +153 -0
- package/src/index.ts +455 -0
- package/src/mcp/README.md +380 -0
- package/src/mcp/errors.ts +124 -0
- package/src/mcp/index.ts +309 -0
- package/src/mcp/server.ts +183 -0
- package/src/mcp/tools/guide.ts +821 -0
- package/src/mcp/tools/index.ts +73 -0
- package/src/mcp/tools/market.ts +363 -0
- package/src/mcp/tools/order.ts +326 -0
- package/src/mcp/tools/trade.ts +417 -0
- package/src/mcp/tools/trader.ts +322 -0
- package/src/mcp/tools/wallet.ts +683 -0
- package/src/mcp/types.ts +472 -0
- package/src/services/authorization-service.ts +357 -0
- package/src/services/market-service.ts +544 -0
- package/src/services/realtime-service.ts +196 -0
- package/src/services/swap-service.ts +896 -0
- package/src/services/wallet-service.ts +259 -0
- package/src/utils/price-utils.ts +307 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +19 -0
- package/vitest.integration.config.ts +18 -0
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
# Hybrid Strategy Live Test Report
|
|
2
|
+
|
|
3
|
+
**Date**: 2025-12-22
|
|
4
|
+
**Session ID**: strategy-mjfs0gn2-x1g674
|
|
5
|
+
**Strategy**: Test Hybrid Strategy - 10 USDC
|
|
6
|
+
**Market**: NVIDIA largest company by market cap on Dec 31
|
|
7
|
+
**Condition ID**: 0x0b16eb7741855ca3d4...
|
|
8
|
+
**Market Type**: Neg Risk
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Executive Summary
|
|
13
|
+
|
|
14
|
+
Hybrid 策略在 Live 模式下运行了 3.5+ 小时,发现多个严重问题:
|
|
15
|
+
|
|
16
|
+
| 指标 | 值 | 状态 |
|
|
17
|
+
|------|-----|------|
|
|
18
|
+
| 运行时间 | 3h 25m+ | - |
|
|
19
|
+
| 初始 USDC | $343.80 | - |
|
|
20
|
+
| 最终 USDC | $3.98 | ❌ 几乎耗尽 |
|
|
21
|
+
| YES Tokens | 362.31 | 持续增加 |
|
|
22
|
+
| NO Tokens | 344.99 | 持续增加 |
|
|
23
|
+
| 成功订单数 | 120+ | 仅 BUY 订单 |
|
|
24
|
+
| 成交交易数 | 0 | ❌ 无任何成交 |
|
|
25
|
+
| PnL | $0.00 | 无交易收益 |
|
|
26
|
+
|
|
27
|
+
**核心问题**: 策略只能执行 BUY 和 Split,无法执行 SELL 和 Merge,导致 USDC 单向消耗。
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 2. 发现的问题
|
|
32
|
+
|
|
33
|
+
### 2.1 SELL 订单全部失败 (Critical)
|
|
34
|
+
|
|
35
|
+
**现象**:
|
|
36
|
+
```
|
|
37
|
+
[CLOB Client] request error {
|
|
38
|
+
"error": "not enough balance / allowance"
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**订单类型影响**:
|
|
43
|
+
|
|
44
|
+
| 订单类型 | 状态 | 原因 |
|
|
45
|
+
|---------|------|------|
|
|
46
|
+
| BUY YES | ✅ 成功 | USDC ERC20 allowance 正常 |
|
|
47
|
+
| BUY NO | ✅ 成功 | USDC ERC20 allowance 正常 |
|
|
48
|
+
| SELL YES | ❌ 失败 | Neg Risk 市场 ERC1155 授权问题 |
|
|
49
|
+
| SELL NO | ❌ 失败 | Neg Risk 市场 ERC1155 授权问题 |
|
|
50
|
+
|
|
51
|
+
**钱包实际状态**:
|
|
52
|
+
- YES Balance: 362.31 tokens (足够)
|
|
53
|
+
- NO Balance: 344.99 tokens (足够)
|
|
54
|
+
- ERC1155 Approval: ✅ 已设置 (CTF Exchange, Neg Risk CTF Exchange)
|
|
55
|
+
|
|
56
|
+
**推测原因**:
|
|
57
|
+
Neg Risk 市场的 YES/NO tokens 通过 Neg Risk Adapter 包装,可能需要额外的授权机制。
|
|
58
|
+
|
|
59
|
+
### 2.2 Rebalance 机制过于激进 (High)
|
|
60
|
+
|
|
61
|
+
**现象**:
|
|
62
|
+
- 每次 Market Update 都触发 `rebalance` signal
|
|
63
|
+
- 持续执行 `split` 或 `merge` 动作
|
|
64
|
+
- USDC 从 $343 耗尽至 $4
|
|
65
|
+
|
|
66
|
+
**日志证据**:
|
|
67
|
+
```
|
|
68
|
+
[SessionRunner] Generated 1 signals: rebalance
|
|
69
|
+
[SessionRunner] Executing 1 actions: split
|
|
70
|
+
[SessionRunner] Generated 1 signals: rebalance
|
|
71
|
+
[SessionRunner] Executing 1 actions: split
|
|
72
|
+
...
|
|
73
|
+
(持续数百次)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**参数分析**:
|
|
77
|
+
```typescript
|
|
78
|
+
arbParams: {
|
|
79
|
+
usdcRatio: 0.5, // 目标 50% USDC
|
|
80
|
+
rebalanceThreshold: 0.15, // 偏离 15% 时触发
|
|
81
|
+
minSize: 1, // 最小交易量
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**问题**:
|
|
86
|
+
1. Split 后 USDC 比例立即偏离目标
|
|
87
|
+
2. 触发新的 rebalance → 继续 split
|
|
88
|
+
3. 形成正反馈循环直到 USDC 耗尽
|
|
89
|
+
|
|
90
|
+
### 2.3 MM 订单无法成交 (High)
|
|
91
|
+
|
|
92
|
+
**现象**:
|
|
93
|
+
- 120+ 订单显示为 "open"
|
|
94
|
+
- 0 trades (无任何成交)
|
|
95
|
+
- 订单一直挂单未被吃
|
|
96
|
+
|
|
97
|
+
**市场状态**:
|
|
98
|
+
```
|
|
99
|
+
YES: bid=0.956 ask=0.957 (spread=0.1%)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**MM 订单价格**:
|
|
103
|
+
```
|
|
104
|
+
SELL YES @ 0.917-0.947 (低于市场 bid 0.956)
|
|
105
|
+
BUY NO @ 0.107-0.128 (高于市场 ask ~0.043)
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**问题分析**:
|
|
109
|
+
1. SELL YES 订单 **低于** 市场 bid,理论上应该立即成交
|
|
110
|
+
2. 但因为 SELL 订单失败 (2.1),这些订单实际未提交
|
|
111
|
+
3. 前端显示的 "open" 订单只是 BUY 订单
|
|
112
|
+
4. BUY 订单定价在 bid 下方,需要市场下跌才能成交
|
|
113
|
+
|
|
114
|
+
### 2.4 Merge 操作可能失败 (Medium)
|
|
115
|
+
|
|
116
|
+
**现象**:
|
|
117
|
+
- 策略后期开始执行 `merge` 动作
|
|
118
|
+
- 但余额变化显示 merge 未生效
|
|
119
|
+
- USDC 持续减少,tokens 持续增加
|
|
120
|
+
|
|
121
|
+
**证据**:
|
|
122
|
+
```
|
|
123
|
+
[SessionRunner] Executing 1 actions: merge
|
|
124
|
+
[BalanceSync] Balance updated: USDC=5.09, YES=362.31, NO=319.99
|
|
125
|
+
[BalanceSync] Balance updated: USDC=4.86, YES=362.31, NO=324.99
|
|
126
|
+
(USDC 减少, NO 增加 - 与 merge 预期相反)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 2.5 前端显示不准确 (Medium)
|
|
130
|
+
|
|
131
|
+
**问题**:
|
|
132
|
+
1. 失败的订单没有显示为 "failed"
|
|
133
|
+
2. 所有订单都显示为 "open"
|
|
134
|
+
3. 无法区分成功和失败的订单
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 3. Hybrid 策略参数分析
|
|
139
|
+
|
|
140
|
+
### 3.1 当前配置
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
// MM 参数
|
|
144
|
+
mmParams: {
|
|
145
|
+
pricingMode: 'undercut', // 压价模式
|
|
146
|
+
minSpread: 0.02, // 2% 最小价差
|
|
147
|
+
orderSize: 5, // 每笔 5 份
|
|
148
|
+
updateInterval: 5000, // 5秒更新
|
|
149
|
+
useMint: true, // 使用 Split/Merge
|
|
150
|
+
inventoryConfig: {
|
|
151
|
+
maxPosition: 50,
|
|
152
|
+
skewMultiplier: 0.001
|
|
153
|
+
},
|
|
154
|
+
riskConfig: {
|
|
155
|
+
priceChangeThreshold: 0.05,
|
|
156
|
+
maxLossThreshold: 20
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Arb 参数
|
|
161
|
+
arbParams: {
|
|
162
|
+
minProfitRate: 0.01, // 1% 最小利润率
|
|
163
|
+
minProfitAmount: 0.5, // $0.5 最小利润
|
|
164
|
+
minSize: 1,
|
|
165
|
+
maxSingleTrade: 50,
|
|
166
|
+
useSmartSizing: true,
|
|
167
|
+
sizeBuffer: 0.9,
|
|
168
|
+
usdcRatio: 0.5, // 50% USDC 目标
|
|
169
|
+
rebalanceThreshold: 0.15 // 15% 触发阈值
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// 互斥配置
|
|
173
|
+
mutualExclusion: {
|
|
174
|
+
arbPriority: 90,
|
|
175
|
+
rebalancePriority: 30,
|
|
176
|
+
pauseThreshold: 80,
|
|
177
|
+
cooldownMs: 5000,
|
|
178
|
+
cancelMMOnArb: true
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 3.2 参数问题
|
|
183
|
+
|
|
184
|
+
| 参数 | 当前值 | 问题 | 建议 |
|
|
185
|
+
|------|--------|------|------|
|
|
186
|
+
| `minSpread` | 2% | 市场 spread 只有 0.1%,订单太远 | 降低到 0.5% |
|
|
187
|
+
| `rebalanceThreshold` | 15% | 太敏感,频繁触发 | 提高到 30% |
|
|
188
|
+
| `useMint` | true | 导致无限 split/merge | 添加冷却时间 |
|
|
189
|
+
| `usdcRatio` | 50% | Split 后立即偏离 | 考虑动态调整 |
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 4. 市场适配性分析
|
|
194
|
+
|
|
195
|
+
### 4.1 NVIDIA 市场特点
|
|
196
|
+
|
|
197
|
+
| 指标 | 值 | 影响 |
|
|
198
|
+
|------|-----|------|
|
|
199
|
+
| YES 价格 | ~$0.956 | 高度偏向一方 |
|
|
200
|
+
| NO 价格 | ~$0.044 | - |
|
|
201
|
+
| Spread | 0.1% | 太窄,难以做市 |
|
|
202
|
+
| 市场类型 | Neg Risk | 需要特殊授权 |
|
|
203
|
+
| 套利空间 | YES+NO=1.00 | 无套利机会 |
|
|
204
|
+
|
|
205
|
+
### 4.2 市场做市可行性
|
|
206
|
+
|
|
207
|
+
**结论**: 该市场**不适合**做市
|
|
208
|
+
|
|
209
|
+
**原因**:
|
|
210
|
+
1. **单边市场**: 95/5 的价格分布,流动性集中在 YES
|
|
211
|
+
2. **Spread 太窄**: 0.1% 无法覆盖手续费
|
|
212
|
+
3. **Neg Risk 限制**: SELL 订单无法执行
|
|
213
|
+
4. **无套利空间**: YES + NO = 1.00,无价差
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 5. 解决方案建议
|
|
218
|
+
|
|
219
|
+
### 5.1 紧急修复 (P0)
|
|
220
|
+
|
|
221
|
+
1. **修复 Neg Risk SELL 订单授权**
|
|
222
|
+
- 调查 Neg Risk Adapter 的 ERC1155 授权要求
|
|
223
|
+
- 可能需要对 Neg Risk Adapter 设置 setApprovalForAll
|
|
224
|
+
- 或者需要通过 Neg Risk Adapter 执行 SELL
|
|
225
|
+
|
|
226
|
+
2. **添加 Rebalance 冷却时间**
|
|
227
|
+
```typescript
|
|
228
|
+
// 建议添加
|
|
229
|
+
rebalanceCooldownMs: 60000 // 1分钟冷却
|
|
230
|
+
lastRebalanceTime: number
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### 5.2 策略改进 (P1)
|
|
234
|
+
|
|
235
|
+
1. **动态 Spread 调整**
|
|
236
|
+
- 根据市场 spread 自动调整 minSpread
|
|
237
|
+
- 如果市场 spread < minSpread,降低订单量或暂停
|
|
238
|
+
|
|
239
|
+
2. **市场筛选**
|
|
240
|
+
- 不在极端偏向的市场 (>90% 或 <10%) 做市
|
|
241
|
+
- 优先选择 spread > 1% 的市场
|
|
242
|
+
|
|
243
|
+
3. **Rebalance 逻辑优化**
|
|
244
|
+
- 增加阈值,减少频率
|
|
245
|
+
- 考虑交易成本
|
|
246
|
+
- 添加最大 rebalance 次数限制
|
|
247
|
+
|
|
248
|
+
### 5.3 监控改进 (P2)
|
|
249
|
+
|
|
250
|
+
1. **订单状态准确显示**
|
|
251
|
+
- 区分成功/失败订单
|
|
252
|
+
- 显示失败原因
|
|
253
|
+
|
|
254
|
+
2. **实时警告**
|
|
255
|
+
- USDC 低于阈值时警告
|
|
256
|
+
- 订单失败率过高时警告
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 6. 技术细节
|
|
261
|
+
|
|
262
|
+
### 6.1 Polymarket 合约授权要求
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
ERC20 授权 (USDC.e → 合约):
|
|
266
|
+
✅ CTF Exchange - 0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E
|
|
267
|
+
✅ Neg Risk CTF Exchange - 0xC5d563A36AE78145C45a50134d48A1215220f80a
|
|
268
|
+
✅ Neg Risk Adapter - 0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296
|
|
269
|
+
✅ Conditional Tokens - 0x4D97DCd97eC945f40cF65F87097ACe5EA0476045
|
|
270
|
+
|
|
271
|
+
ERC1155 授权 (Conditional Tokens → 合约):
|
|
272
|
+
✅ CTF Exchange
|
|
273
|
+
✅ Neg Risk CTF Exchange
|
|
274
|
+
❓ Neg Risk Adapter - 可能需要额外授权
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### 6.2 订单流程
|
|
278
|
+
|
|
279
|
+
```
|
|
280
|
+
策略生成 Signal
|
|
281
|
+
↓
|
|
282
|
+
Signal → Action (place_order)
|
|
283
|
+
↓
|
|
284
|
+
ActionExecutor 调用 TradingClient
|
|
285
|
+
↓
|
|
286
|
+
TradingClient.createOrder()
|
|
287
|
+
↓
|
|
288
|
+
签名订单并发送到 CLOB API
|
|
289
|
+
↓
|
|
290
|
+
CLOB 验证 balance + allowance
|
|
291
|
+
↓
|
|
292
|
+
❌ SELL 订单失败 (Neg Risk 授权问题)
|
|
293
|
+
✅ BUY 订单成功
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## 7. 下一步行动
|
|
299
|
+
|
|
300
|
+
- [ ] 调查 Neg Risk Adapter ERC1155 授权需求
|
|
301
|
+
- [ ] 修复 SELL 订单授权问题
|
|
302
|
+
- [ ] 添加 Rebalance 冷却机制
|
|
303
|
+
- [ ] 优化市场选择逻辑
|
|
304
|
+
- [ ] 改进前端订单状态显示
|
|
305
|
+
- [ ] 选择更适合做市的市场进行测试
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## 8. 问题修复记录
|
|
310
|
+
|
|
311
|
+
### 8.1 Neg Risk Adapter ERC1155 授权 (已修复)
|
|
312
|
+
|
|
313
|
+
**发现时间**: 2025-12-22 01:15
|
|
314
|
+
|
|
315
|
+
**问题**: Neg Risk Adapter 缺少 ERC1155 授权
|
|
316
|
+
|
|
317
|
+
**检查结果**:
|
|
318
|
+
```
|
|
319
|
+
CTF Exchange: ✅ Approved
|
|
320
|
+
Neg Risk CTF Exchange: ✅ Approved
|
|
321
|
+
Neg Risk Adapter: ❌ Not Approved ← 这是问题根源!
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**修复**:
|
|
325
|
+
```bash
|
|
326
|
+
npx tsx scripts/approve-neg-risk-erc1155.ts
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**交易详情**:
|
|
330
|
+
- TX Hash: `0x1fcb671978b300266b04e305432b81b76a9c3f499cdfeb4798009c5ce7708f4e`
|
|
331
|
+
- Block: 80609070
|
|
332
|
+
- Gas Price: 70.86 Gwei
|
|
333
|
+
|
|
334
|
+
**验证结果**:
|
|
335
|
+
```
|
|
336
|
+
CTF Exchange: ✅ Approved
|
|
337
|
+
Neg Risk CTF Exchange: ✅ Approved
|
|
338
|
+
Neg Risk Adapter: ✅ Approved ← 已修复
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**验证修复有效**:
|
|
342
|
+
授权后,第一个 SELL YES 订单成功:
|
|
343
|
+
```
|
|
344
|
+
[strategy-mjfs0gn2-x1g674] Order created: ord-1766337345591-121 SELL YES 10@0.952677827 [mm]
|
|
345
|
+
[SessionRunner] Live order placed: ord-1766337345591-121 -> Polymarket 0x8a1ccb...
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
前端显示订单数从 120 → 121,确认 SELL 订单成功提交。
|
|
349
|
+
|
|
350
|
+
**结论**:
|
|
351
|
+
对于 Neg Risk 市场,需要同时设置:
|
|
352
|
+
1. ERC20 授权 (USDC.e → 4个合约)
|
|
353
|
+
2. ERC1155 授权 (Conditional Tokens → **3个合约,包括 Neg Risk Adapter**)
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## 9. 相关文件
|
|
358
|
+
|
|
359
|
+
| 文件 | 用途 |
|
|
360
|
+
|------|------|
|
|
361
|
+
| `scripts/truth.md` | Polymarket 下单真相文档 |
|
|
362
|
+
| `scripts/check-all-allowances.ts` | 检查 ERC20 授权 |
|
|
363
|
+
| `scripts/approve-erc1155.ts` | 设置 ERC1155 授权 |
|
|
364
|
+
| `scripts/test-order.ts` | 测试下单功能 |
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## 10. 修复实施记录 (2025-12-22)
|
|
369
|
+
|
|
370
|
+
### 10.1 回收 NVIDIA 仓位资金 ✅
|
|
371
|
+
|
|
372
|
+
**执行时间**: 2025-12-22
|
|
373
|
+
|
|
374
|
+
**操作**:
|
|
375
|
+
- 创建脚本 `scripts/sell-nvidia-positions.ts`
|
|
376
|
+
- 卖出 352.31 YES tokens (@ bid $0.956)
|
|
377
|
+
- 卖出 344.99 NO tokens (@ bid $0.044)
|
|
378
|
+
|
|
379
|
+
**结果**:
|
|
380
|
+
```
|
|
381
|
+
初始 USDC: $13.78
|
|
382
|
+
回收 YES: ~$337
|
|
383
|
+
回收 NO: ~$15
|
|
384
|
+
最终 USDC: $364.74
|
|
385
|
+
净回收: +$350.96
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### 10.2 前端订单状态显示改进 ✅
|
|
389
|
+
|
|
390
|
+
**修改文件**: `packages/earning-engine/dashboard-web/src/app/live/[id]/page.tsx`
|
|
391
|
+
|
|
392
|
+
**改进内容**:
|
|
393
|
+
|
|
394
|
+
1. **LOW 余额警告**
|
|
395
|
+
- 当 USDC < $10 时显示红色边框和 "LOW" 标签
|
|
396
|
+
- 带动画效果,提醒用户注意
|
|
397
|
+
|
|
398
|
+
2. **订单统计函数**
|
|
399
|
+
```typescript
|
|
400
|
+
function computeOrderStats(orders: OrderRecord[]) {
|
|
401
|
+
const total = orders.length;
|
|
402
|
+
const filled = orders.filter(o => o.status === 'filled').length;
|
|
403
|
+
const failed = orders.filter(o => o.status === 'failed' || o.status === 'rejected').length;
|
|
404
|
+
const failureRate = total > 0 ? (failed / total) * 100 : 0;
|
|
405
|
+
return { total, filled, open, failed, cancelled, buyOrders, sellOrders, failureRate };
|
|
406
|
+
}
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
3. **失败率警告**
|
|
410
|
+
- 失败率 > 20% 时显示红色警告横幅
|
|
411
|
+
- 显示具体失败率和建议检查授权
|
|
412
|
+
|
|
413
|
+
4. **订单状态颜色**
|
|
414
|
+
- `filled`: 绿色 (text-profit)
|
|
415
|
+
- `open`: 青色 (text-cyan-500)
|
|
416
|
+
- `cancelled`: 琥珀色 (text-amber-500)
|
|
417
|
+
- `failed/rejected`: 红色 (text-loss)
|
|
418
|
+
|
|
419
|
+
### 10.3 Rebalance 冷却机制 ✅
|
|
420
|
+
|
|
421
|
+
**修改文件**:
|
|
422
|
+
- `packages/earning-engine/strategies/src/arb/types.ts`
|
|
423
|
+
- `packages/earning-engine/strategies/src/arb/rebalancer.ts`
|
|
424
|
+
- `packages/earning-engine/strategies/src/arb/index.ts`
|
|
425
|
+
|
|
426
|
+
**新增配置**:
|
|
427
|
+
```typescript
|
|
428
|
+
// types.ts
|
|
429
|
+
rebalanceCooldownMs?: number; // 冷却时间 (默认 60000ms)
|
|
430
|
+
maxConsecutiveRebalances?: number; // 最大连续次数 (默认 3)
|
|
431
|
+
|
|
432
|
+
interface RebalanceState {
|
|
433
|
+
lastRebalanceTime: number;
|
|
434
|
+
consecutiveCount: number;
|
|
435
|
+
}
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
**新增函数**:
|
|
439
|
+
```typescript
|
|
440
|
+
// rebalancer.ts
|
|
441
|
+
createRebalanceState() // 创建初始状态
|
|
442
|
+
isInCooldown(state, config) // 检查是否在冷却期
|
|
443
|
+
updateRebalanceState(state) // 更新状态 (rebalance 后调用)
|
|
444
|
+
resetRebalanceCount(state) // 重置连续计数
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**机制说明**:
|
|
448
|
+
- 每次 rebalance 后进入 60 秒冷却期
|
|
449
|
+
- 连续 rebalance 3 次后,强制 3x 冷却 (180秒)
|
|
450
|
+
- 有其他操作打断时重置计数
|
|
451
|
+
|
|
452
|
+
### 10.4 下一步市场选择 ✅
|
|
453
|
+
|
|
454
|
+
**执行**: 运行 `examples/research-markets.ts` 进行市场研究
|
|
455
|
+
|
|
456
|
+
**推荐候选市场**:
|
|
457
|
+
|
|
458
|
+
| 类型 | 市场 | 价格 | Spread | 深度 |
|
|
459
|
+
|------|------|------|--------|------|
|
|
460
|
+
| MM | No change in Fed interest rates after January 2026 | 91% | 1% | $198K |
|
|
461
|
+
| Hybrid | Lighter market cap (FDV) >$3B one day after launch | 51.5% | 1% | - |
|
|
462
|
+
|
|
463
|
+
**选择建议**:
|
|
464
|
+
- "Lighter market cap >$3B" 更适合 Hybrid 策略
|
|
465
|
+
- 价格 51.5% 接近 50/50,双边流动性好
|
|
466
|
+
- 1% spread 有足够的做市空间
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## 11. 下一步行动 (更新)
|
|
471
|
+
|
|
472
|
+
- [x] ~~调查 Neg Risk Adapter ERC1155 授权需求~~ ✅ 8.1
|
|
473
|
+
- [x] ~~修复 SELL 订单授权问题~~ ✅ 8.1
|
|
474
|
+
- [x] ~~添加 Rebalance 冷却机制~~ ✅ 10.3
|
|
475
|
+
- [x] ~~改进前端订单状态显示~~ ✅ 10.2
|
|
476
|
+
- [x] ~~回收 NVIDIA 仓位资金~~ ✅ 10.1
|
|
477
|
+
- [x] ~~选择更适合做市的市场~~ ✅ 10.4
|
|
478
|
+
- [ ] 在新市场启动 Hybrid 策略测试
|
|
479
|
+
- [ ] 验证 Rebalance 冷却机制效果
|
|
480
|
+
- [ ] 收集新市场运行数据
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
**报告生成时间**: 2025-12-22 01:10 (UTC+8)
|
|
485
|
+
**报告更新时间**: 2025-12-22 (修复实施)
|
|
486
|
+
**报告作者**: Claude (AI Assistant)
|
|
Binary file
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deposit Native USDC to Polymarket via Bridge
|
|
3
|
+
*
|
|
4
|
+
* This script:
|
|
5
|
+
* 1. Gets your unique deposit address from the Polymarket Bridge
|
|
6
|
+
* 2. Sends Native USDC (on Polygon) to that address
|
|
7
|
+
* 3. The bridge automatically converts it to USDC.e for your Polymarket account
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* # Check deposit address and balances only
|
|
11
|
+
* POLY_PRIVKEY=0x... npx tsx scripts/deposit-native-usdc.ts check
|
|
12
|
+
*
|
|
13
|
+
* # Deposit Native USDC (amount in USDC, e.g., 5.0)
|
|
14
|
+
* POLY_PRIVKEY=0x... npx tsx scripts/deposit-native-usdc.ts deposit 5.0
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { providers, Wallet, Contract, utils } from 'ethers';
|
|
18
|
+
import { BridgeClient, BRIDGE_TOKENS } from '../src/clients/bridge-client.js';
|
|
19
|
+
|
|
20
|
+
// Configuration
|
|
21
|
+
const PRIVATE_KEY = process.env.POLY_PRIVKEY || process.env.POLYMARKET_PRIVATE_KEY || '';
|
|
22
|
+
const RPC_URL = process.env.POLYGON_RPC_URL || 'https://polygon-rpc.com';
|
|
23
|
+
|
|
24
|
+
// Token addresses
|
|
25
|
+
const NATIVE_USDC_ADDRESS = BRIDGE_TOKENS.POLYGON_NATIVE_USDC; // 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359
|
|
26
|
+
const USDC_E_ADDRESS = BRIDGE_TOKENS.POLYGON_USDC_E; // 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174
|
|
27
|
+
|
|
28
|
+
// ERC20 ABI (minimal for balance and transfer)
|
|
29
|
+
const ERC20_ABI = [
|
|
30
|
+
'function balanceOf(address owner) view returns (uint256)',
|
|
31
|
+
'function decimals() view returns (uint8)',
|
|
32
|
+
'function symbol() view returns (string)',
|
|
33
|
+
'function transfer(address to, uint256 amount) returns (bool)',
|
|
34
|
+
'function approve(address spender, uint256 amount) returns (bool)',
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
async function main() {
|
|
38
|
+
const args = process.argv.slice(2);
|
|
39
|
+
const command = args[0] || 'check';
|
|
40
|
+
const amount = args[1] || '5.0';
|
|
41
|
+
|
|
42
|
+
if (!PRIVATE_KEY) {
|
|
43
|
+
console.log('Error: Set POLY_PRIVKEY or POLYMARKET_PRIVATE_KEY environment variable');
|
|
44
|
+
console.log('');
|
|
45
|
+
console.log('Usage:');
|
|
46
|
+
console.log(' POLY_PRIVKEY=0x... npx tsx scripts/deposit-native-usdc.ts check');
|
|
47
|
+
console.log(' POLY_PRIVKEY=0x... npx tsx scripts/deposit-native-usdc.ts deposit 5.0');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
console.log('╔════════════════════════════════════════════════════════════╗');
|
|
52
|
+
console.log('║ NATIVE USDC DEPOSIT TO POLYMARKET ║');
|
|
53
|
+
console.log('╚════════════════════════════════════════════════════════════╝');
|
|
54
|
+
console.log('');
|
|
55
|
+
|
|
56
|
+
// Setup provider and wallet (ethers v5)
|
|
57
|
+
const provider = new providers.JsonRpcProvider(RPC_URL);
|
|
58
|
+
const wallet = new Wallet(PRIVATE_KEY, provider);
|
|
59
|
+
const bridge = new BridgeClient();
|
|
60
|
+
|
|
61
|
+
console.log(`Wallet: ${wallet.address}`);
|
|
62
|
+
console.log(`RPC: ${RPC_URL}`);
|
|
63
|
+
console.log('');
|
|
64
|
+
|
|
65
|
+
// Get token contracts
|
|
66
|
+
const nativeUsdc = new Contract(NATIVE_USDC_ADDRESS, ERC20_ABI, wallet);
|
|
67
|
+
const usdcE = new Contract(USDC_E_ADDRESS, ERC20_ABI, wallet);
|
|
68
|
+
|
|
69
|
+
// Check balances
|
|
70
|
+
console.log('─── Current Balances ───');
|
|
71
|
+
const maticBalance = await provider.getBalance(wallet.address);
|
|
72
|
+
const nativeUsdcBalance = await nativeUsdc.balanceOf(wallet.address);
|
|
73
|
+
const usdcEBalance = await usdcE.balanceOf(wallet.address);
|
|
74
|
+
|
|
75
|
+
console.log(`MATIC: ${utils.formatEther(maticBalance)}`);
|
|
76
|
+
console.log(`Native USDC: ${utils.formatUnits(nativeUsdcBalance, 6)}`);
|
|
77
|
+
console.log(`USDC.e: ${utils.formatUnits(usdcEBalance, 6)}`);
|
|
78
|
+
console.log('');
|
|
79
|
+
|
|
80
|
+
// Get deposit address for Polygon Native USDC
|
|
81
|
+
console.log('─── Getting Deposit Address ───');
|
|
82
|
+
try {
|
|
83
|
+
// The Bridge API returns a single EVM address for all EVM chains
|
|
84
|
+
// API Response: { address: { evm: "0x...", svm: "...", btc: "..." } }
|
|
85
|
+
const response = await fetch('https://bridge.polymarket.com/deposit', {
|
|
86
|
+
method: 'POST',
|
|
87
|
+
headers: { 'Content-Type': 'application/json' },
|
|
88
|
+
body: JSON.stringify({ address: wallet.address }),
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const data = await response.json() as {
|
|
92
|
+
address: { evm: string; svm: string; btc: string };
|
|
93
|
+
note: string;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const depositAddress = data.address.evm;
|
|
97
|
+
if (!depositAddress) {
|
|
98
|
+
console.log('Error: Could not get deposit address');
|
|
99
|
+
console.log('Response:', JSON.stringify(data, null, 2));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
console.log(`Chain: Polygon (137)`);
|
|
104
|
+
console.log(`Token: Native USDC`);
|
|
105
|
+
console.log(`Deposit Address: ${depositAddress}`);
|
|
106
|
+
console.log(`Min Deposit: $2`);
|
|
107
|
+
console.log('');
|
|
108
|
+
|
|
109
|
+
if (command === 'check') {
|
|
110
|
+
console.log('✓ Check complete. Use "deposit <amount>" to execute deposit.');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (command === 'deposit') {
|
|
115
|
+
const depositAmount = parseFloat(amount);
|
|
116
|
+
|
|
117
|
+
if (depositAmount < 2) {
|
|
118
|
+
console.log(`Error: Minimum deposit is $2, you specified $${depositAmount}`);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const nativeUsdcAvailable = parseFloat(utils.formatUnits(nativeUsdcBalance, 6));
|
|
123
|
+
if (depositAmount > nativeUsdcAvailable) {
|
|
124
|
+
console.log(`Error: Insufficient balance. You have ${nativeUsdcAvailable} Native USDC`);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
console.log('─── Executing Deposit ───');
|
|
129
|
+
console.log(`Amount: ${depositAmount} USDC`);
|
|
130
|
+
console.log(`To: ${depositAddress}`);
|
|
131
|
+
console.log('');
|
|
132
|
+
|
|
133
|
+
// Convert amount to wei (6 decimals for USDC)
|
|
134
|
+
const amountWei = utils.parseUnits(amount, 6);
|
|
135
|
+
|
|
136
|
+
// Get current gas price and add buffer for Polygon
|
|
137
|
+
const feeData = await provider.getFeeData();
|
|
138
|
+
const gasPrice = feeData.gasPrice?.mul(120).div(100); // 20% buffer
|
|
139
|
+
|
|
140
|
+
console.log(`Gas price: ${utils.formatUnits(gasPrice || 0, 'gwei')} gwei`);
|
|
141
|
+
console.log('Sending transaction...');
|
|
142
|
+
|
|
143
|
+
const tx = await nativeUsdc.transfer(depositAddress, amountWei, {
|
|
144
|
+
gasPrice: gasPrice,
|
|
145
|
+
});
|
|
146
|
+
console.log(`Transaction hash: ${tx.hash}`);
|
|
147
|
+
console.log(`PolygonScan: https://polygonscan.com/tx/${tx.hash}`);
|
|
148
|
+
console.log('');
|
|
149
|
+
|
|
150
|
+
console.log('Waiting for confirmation...');
|
|
151
|
+
const receipt = await tx.wait();
|
|
152
|
+
console.log(`Status: ${receipt?.status === 1 ? '✓ Success' : '✗ Failed'}`);
|
|
153
|
+
console.log(`Block: ${receipt?.blockNumber}`);
|
|
154
|
+
console.log(`Gas used: ${receipt?.gasUsed}`);
|
|
155
|
+
console.log('');
|
|
156
|
+
|
|
157
|
+
if (receipt?.status === 1) {
|
|
158
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
159
|
+
console.log('✓ Deposit transaction successful!');
|
|
160
|
+
console.log('');
|
|
161
|
+
console.log('The bridge will automatically:');
|
|
162
|
+
console.log('1. Detect your deposit');
|
|
163
|
+
console.log('2. Convert Native USDC to USDC.e');
|
|
164
|
+
console.log('3. Credit your Polymarket account');
|
|
165
|
+
console.log('');
|
|
166
|
+
console.log('This typically takes 1-5 minutes.');
|
|
167
|
+
console.log('');
|
|
168
|
+
console.log('Check your new balances with:');
|
|
169
|
+
console.log(' POLY_PRIVKEY=0x... npx tsx scripts/deposit-native-usdc.ts check');
|
|
170
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
} catch (error) {
|
|
174
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
main().catch(console.error);
|