From 5074bb4f28a5f9a377ebbc144516e63cea409498 Mon Sep 17 00:00:00 2001 From: WrBug Date: Sat, 14 Feb 2026 15:32:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(order):=20=E4=BF=AE=E5=A4=8D=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=AD=BE=E5=90=8D=20salt=20=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E7=A2=B0=E6=92=9E=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 AtomicLong + 时间戳保证 generateSalt 在并发下唯一 - 避免尾盘策略 FIXED 模式预签双单等场景产生相同 salt 导致订单冲突 Co-authored-by: Cursor --- .../copytrading/orders/OrderSigningService.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/service/copytrading/orders/OrderSigningService.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/service/copytrading/orders/OrderSigningService.kt index 7d760b6..a4b1c0a 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/service/copytrading/orders/OrderSigningService.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/service/copytrading/orders/OrderSigningService.kt @@ -8,6 +8,7 @@ import org.web3j.crypto.Credentials import java.math.BigDecimal import java.math.BigInteger import java.math.RoundingMode +import java.util.concurrent.atomic.AtomicLong /** * 订单签名服务 @@ -323,12 +324,17 @@ class OrderSigningService { } } + /** 并发安全:确保同一毫秒内多次调用生成唯一 salt,避免 FIXED 模式预签双单等场景的 salt 碰撞 */ + private val saltSequence = AtomicLong(0) + /** - * 生成 salt(使用时间戳,毫秒) - * 与 TypeScript SDK 保持一致,使用时间戳作为 salt + * 生成 salt(时间戳 + 自增序列,保证并发下唯一) + * 兼容 Polymarket:salt 为 Long,时间戳主位 + 序列次位,与 TypeScript SDK 语义兼容 */ private fun generateSalt(): Long { - return System.currentTimeMillis() + val now = System.currentTimeMillis() + val seq = saltSequence.incrementAndGet() and 0x3FF + return now * 1000 + seq } /**