Chainlink Functions调用Alpaca API重复执行问题排查
Chainlink Functions调用Alpaca API重复生成订单问题
问题概述
- 函数执行成功但重复触发,在Alpaca上生成3个完全相同的市价订单
- 仅在Base Sepolia链上复现该问题,本地模拟测试无此情况
预期与实际行为
- 预期行为:单次合约调用仅在Alpaca创建1个市价订单
- 实际行为:单次合约调用生成3个完全相同的订单
疑问
是否是_sendRequest因内部超时或错误触发重试导致?或是存在其他重复调用的原因?
上下文信息
- DON ID: fun-base-sepolia-1
- 已部署合约地址:0x5AB9A1c38fEb301F71010f9F7406FCAE417d1541
- 请求ID: 0x442676c1692e799bee3f14b6293e1185aa31cad6be7161ebbf792f7869ba0fee
Chainlink Functions JavaScript代码片段
async function main() { ethers = await import("npm:ethers@6.10.0"); const symbol = args[0]; const qty = symbolPrecision(symbol, args[1]); // 转换为18位小数 console.log(`Buying ${qty} ${symbol}...`); _checkKeys(); const alpacaBuyRequest = Functions.makeHttpRequest({ method: "POST", url: "https://paper-api.alpaca.markets/v2/orders", headers: { accept: "application/json", content_type: "application/json", "APCA-API-KEY-ID": secrets.alpacaKey, "APCA-API-SECRET-KEY": secrets.alpacaSecret, }, data: { side: side, type: "market", time_in_force: "gtc", symbol: symbol, qty: qty, }, }); // 触发订单请求 const [response] = await Promise.all([alpacaBuyRequest]); const responseStatus = response.status; if (responseStatus !== 200) { throw new Error( `Unexpected response status ${responseStatus} ${response.Error}` ); } // 等待订单成交后再返回 const response_data = await waitForOrderToFill(response.data.id); console.log(response_data); // 例如:filled_avg_price const filledAvgPrice = ethers.parseUnits(response_data.filled_avg_price, 6); const encodedData = ethers.AbiCoder.defaultAbiCoder().encode( ["string", "uint256"], [response_data.id, filledAvgPrice] ); // 返回编码后的数据 return ethers.getBytes(encodedData); }
内容的提问来源于stack exchange,提问作者Mo0x
相关产品推荐
相关产品推荐

