fix: 迁移链路外统一改为仅识别 pUSD

移除链上监听中对 USDC.e 的抵押品匹配,并将解包与审批相关说明统一为 pUSD 语义,避免在非 swap/wrap 流程继续使用 USDC.e。

Made-with: Cursor
This commit is contained in:
WrBug
2026-04-28 21:40:41 +08:00
parent fb6b469e9f
commit 06a122dd34
5 changed files with 12 additions and 13 deletions
@@ -365,7 +365,7 @@ class AccountService(
}
/**
* Polymarket 代币批准检查:USDC.e 需授权的 spender 合约地址(Polygon 主网)
* Polymarket 代币批准检查:pUSD 需授权的 spender 合约地址(Polygon 主网)
* 来源:Polymarket/magic-safe-builder-example README §6 Token Approvals
* 及 neg-risk-ctf-adapter 仓库 addresses.json (chainId 137)
*/
@@ -941,7 +941,7 @@ class AccountService(
}
/**
* 轮询用:遍历所有账户,对代理地址 WCOL 余额 > 0 的执行解包为 USDC.e
* 轮询用:遍历所有账户,对代理地址 WCOL 余额 > 0 的执行解包。
* 由 WcolUnwrapJobService 每 20 秒调用,赎回后无需在赎回流程内等待确认与解包。
*/
suspend fun runWcolUnwrapForAllAccounts() {
@@ -11,7 +11,7 @@ import org.springframework.stereotype.Service
/**
* WCOL 解包轮询任务
* 每 20 秒轮询一次,遍历所有账户的代理地址:若 WCOL 余额 > 0 则解包为 USDC.e
* 每 20 秒轮询一次,遍历所有账户的代理地址:若 WCOL 余额 > 0 则执行解包。
* 同一时间仅允许单次执行;若上次执行未结束则本次忽略(与现有轮询逻辑一致)。
* 若未配置 Builder API Key,直接跳过本轮(解包依赖 Relayer Gasless,未配置则无法执行)。
*/
@@ -56,7 +56,7 @@ class BlockchainService(
// ConditionalTokens 合约地址(Polygon 主网)
private val conditionalTokensAddress = "0x4D97DCd97eC945f40cF65F87097ACe5EA0476045"
// Neg Risk WrappedCollateral 合约地址(Polygon,解包后得 USDC.e
// Neg Risk WrappedCollateral 合约地址(Polygon
private val wcolContractAddress = "0x3A3BD7bb9528E159577F7C2e685CC81A765002E2"
// 空集合ID(用于计算collectionId
@@ -812,11 +812,11 @@ class BlockchainService(
}
/**
* 将代理钱包内的 WCOL 解包为 USDC.e(解包后转入代理地址)
* 赎回 Neg Risk 仓位后到账为 WCOL,调用此方法可转为 USDC.e 以便显示/使用
* 将代理钱包内的 WCOL 执行解包(解包后转入代理地址)
* 赎回 Neg Risk 仓位后到账为 WCOL,调用此方法可执行解包后续资产处理
*
* Safe 与 Magic 使用同一套逻辑:同一 [createUnwrapWcolTx] + [RelayClientService.execute]
* Safe 走 execTransactionMagic 走 PROXY 编码,最终均为代理合约调用 WCOL.unwrap(proxyAddress, amount)USDC.e 转入 proxyAddress
* Safe 走 execTransactionMagic 走 PROXY 编码,最终均为代理合约调用 WCOL.unwrap(proxyAddress, amount)。
*
* @param privateKey 主钱包私钥
* @param proxyAddress 代理地址(Safe 或 Magic 代理)
@@ -46,9 +46,8 @@ object OnChainWsUtils {
// 合约地址
const val PUSD_CONTRACT = "0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB" // V2 pUSD
const val USDCE_CONTRACT = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174" // V1 USDC.e(迁移前仍需识别)
const val USDC_CONTRACT = PUSD_CONTRACT // 默认使用 pUSD
private val COLLATERAL_CONTRACTS = setOf(PUSD_CONTRACT.lowercase(), USDCE_CONTRACT.lowercase())
private val COLLATERAL_CONTRACTS = setOf(PUSD_CONTRACT.lowercase())
const val ERC1155_CONTRACT = "0x4d97dcd97ec945f40cf65f87097ace5ea0476045"
const val ERC20_TRANSFER_TOPIC = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
const val ERC1155_TRANSFER_SINGLE_TOPIC = "0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62"
@@ -99,7 +98,7 @@ object OnChainWsUtils {
val t0 = topics[0].lowercase()
val data = log.get("data")?.asString ?: "0x"
// USDC/pUSD ERC20 Transfer同时匹配 USDC.e 和 pUSDV2 迁移后可移除 USDCE
// 抵押品 ERC20 Transfer当前仅匹配 pUSD
if (address in COLLATERAL_CONTRACTS && t0 == ERC20_TRANSFER_TOPIC && topics.size >= 3) {
val from = topicToAddress(topics[1])
val to = topicToAddress(topics[2])
@@ -290,14 +290,14 @@ class RelayClientService(
}
/**
* 创建 WCOL 解包交易(将 Wrapped Collateral 解包为 USDC.e
* 创建 WCOL 解包交易(将 Wrapped Collateral 执行解包)
* 合约: Neg Risk WrappedCollateral 0x3A3BD7bb9528E159577F7C2e685CC81A765002E2
* 方法: unwrap(address _to, uint256 _amount),解包后 USDC.e 转到 _to
* 方法: unwrap(address _to, uint256 _amount)
*
* Safe 与 Magic 共用此交易对象:Safe 走 [executeViaBuilderRelayer] / [executeManually]execTransaction),
* Magic 走 [executeViaBuilderRelayerProxy]encodeProxyTransactionData),语义一致。
*
* @param toAddress 接收 USDC.e 的地址(通常为 proxy 自身,使余额留在代理钱包)
* @param toAddress 接收解包资产的地址(通常为 proxy 自身,使余额留在代理钱包)
* @param amountWei WCOL 数量(6 位小数对应的 raw 值,与 balanceOf 返回一致)
* @return Safe 交易对象
*/