部署指南
前置条件
已安装 Foundry(
forge、anvil、cast)用于支付 gas fees 的 BNB
Deployer EOA private key
BscScan API key(用于合约验证)
环境变量
export PRIVATE_KEY=0x... # Deployer private key
export RPC_URL=https://... # BSC RPC endpoint
export PYTH_ADDRESS=0x... # Pyth Core contract address (see table below)
export ETHERSCAN_API_KEY=... # BscScan API key for verificationPyth Oracle 地址
BSC Testnet
97
0x5744Cbf430D99456a0A8771208b674F27f8EF0Fb
BSC Mainnet
56
0x4D7E825f80bDf85e913E0DD2A2D54927e9dE1594
部署顺序
BSC 的 canonical deploy entrypoint 是 script/DeployTestnet.s.sol:DeployTestnetScript。 虽然名称中包含 Testnet,但该脚本会感知 chain,并且当前同时用于 BSC testnet(chainid=97)与 BSC mainnet(chainid=56)。它也会部署并连接 AIResolver。
由于构造函数包含 immutable references,合约必须严格依照以下顺序部署:
构造函数参数
Vault(admin, collateralToken)
deployer address, USDT address
OutcomeToken(admin)
deployer address
FeeModel(admin, feeBps, protocolFeeCollector)
deployer, 20, deployer
OrderBook(admin, vault, feeModel, outcomeToken)
deployer, Vault address, FeeModel address, OutcomeToken address
BatchAuction(admin, orderBook, vault, outcomeToken)
deployer, OrderBook, Vault, OutcomeToken
MarketFactory(admin, orderBook, outcomeToken)
deployer, OrderBook, OutcomeToken
PythResolver(pyth, factory)
PYTH_ADDRESS, MarketFactory
AIResolver(factory, treasury)
MarketFactory, deployer or configured treasury
Redemption(factory, outcomeToken, vault)
MarketFactory, OutcomeToken, Vault
Role Wiring
所有合约部署完成后,授予以下 roles。Deployer 在每个 AccessControl 合约上持有 DEFAULT_ADMIN_ROLE,因此可以调用 grantRole。
OrderBook.OPERATOR_ROLE
BatchAuction 需要 OPERATOR_ROLE 来调用 reduceOrderLots、updateTreeVolume 和 advanceBatch。MarketFactory 需要该 role 来调用 registerMarket 和 deactivateMarket。生产部署中,keeper 也会被授予 OPERATOR_ROLE,以便驱动 batch clearing。
Vault.PROTOCOL_ROLE
OrderBook 调用 lock 和 unlock。BatchAuction 调用 settleFill 和 unlock。Redemption 调用 redeemFromPool。
OutcomeToken.MINTER_ROLE
BatchAuction 于 inline settlement 中调用 mintSingle。Redemption 调用 redeem(销毁获胜 tokens)。
MarketFactory.ADMIN_ROLE
PythResolver 与 AIResolver 会调用 MarketFactory 上的结算函数。生产部署还会于 factory 上向 keeper 与 resolution-keeper 授予 admin access,并向 deployer 与 keeper 授予 market-creation rights。
AIResolver Keeper Wiring
PythResolver Admin
PythResolver 使用简单 ownership(并非 AccessControl)。Admin 于构造函数中设置为 msg.sender(即 deployer)。通过两步流程转移:
部署命令
Local Devnet (Anvil)
用于本地开发和测试:
仅用于本地的 Deploy.s.sol 脚本会部署一个 MockPyth 实例、连接全部 roles,并自动创建一个测试市场。
BSC Testnet / Mainnet
DeployTestnetScript 会自动检测 block.chainid,为 BSC testnet 或 mainnet 选择正确的真实 Pyth address,部署 AIResolver,并连接生产 role set。
注意:script/DeployMainnet.s.sol 仍存在于 repo 中,但 canonical production path 是上方 chain-aware 的 DeployTestnet.s.sol:DeployTestnetScript 流程。
Parimutuel 合约部署
Parimutuel stack 被有意与 binary CLOB contracts 隔离,并通过 script/DeployParimutuel.s.sol:DeployParimutuelScript 部署。
它会部署并连接:
ParimutuelFactoryParimutuelVaultParimutuelPoolManagerParimutuelRedemptionParimutuelAIResolverParimutuelPythResolver
必需 env:
推荐的 mainnet role env:
PARIMUTUEL_MARKET_CREATOR 应当使用 keeper/admin-server signer,这样生产 admin tooling 才能创建 markets。PARIMUTUEL_KEEPER 应当使用 resolution keeper,因为 infra lifecycle task 会使用 resolution sender 驱动 AI/Pyth parimutuel resolution。
部署:
部署完成后,在启用 mainnet UI/keeper flows 之前,更新 address registry、strike-infra Ansible group vars,以及 strike-frontend/src/lib/contracts.ts。
合约验证
部署脚本会传入 --verify,并于 BscScan 上自动验证。手动验证合约:
对于构造函数参数复杂的合约,使用 cast abi-encode 生成正确编码。
部署后验证清单
合约验证 - 所有合约均已于 BscScan 验证。
Role wiring - 确认每个 role grant:
Role checks:
OrderBook.hasRole(OPERATOR_ROLE, BatchAuction)- trueOrderBook.hasRole(OPERATOR_ROLE, MarketFactory)- trueVault.hasRole(PROTOCOL_ROLE, OrderBook)- trueVault.hasRole(PROTOCOL_ROLE, BatchAuction)- trueVault.hasRole(PROTOCOL_ROLE, Redemption)- trueOutcomeToken.hasRole(MINTER_ROLE, BatchAuction)- trueOutcomeToken.hasRole(MINTER_ROLE, Redemption)- trueMarketFactory.hasRole(ADMIN_ROLE, PythResolver)- true
测试市场创建 - 使用已知 Pyth price ID 调用
MarketFactory.createMarket(...)(需要 MARKET_CREATOR_ROLE),并确认市场出现在activeMarkets中。测试下单/取消流程 - 为 Vault approve USDT,调用
OrderBook.placeOrder(...),并确认 USDT collateral 已托管至 Vault。取消订单后,确认 USDT 已返还至 wallet。Keepers 配置 - batch-keeper、market-keeper 与 resolution-keeper(位于 strike-infra)应指向正确的合约地址。
Indexer 配置 - indexer(位于 strike-infra)应指向正确的 RPC 和合约地址,并监听所有相关 events。
SDK / docs 更新 - 更新 SDK 默认值与已发布的 deployment docs/README,确保 integrators 使用新的 mainnet 与 testnet addresses。
Last updated

