访问控制

所有使用 role-based 访问控制的 STRIKE 合约都继承 OpenZeppelin 的 AccessControl。PythResolver 例外,它使用更简单的自定义 ownership model。

Roles 概览

Role
Defined 在
授予对象
目的

DEFAULT_ADMIN_ROLE

所有 AccessControl 合约

部署者 EOA

可以授予或 revoke 任意 role

OPERATOR_ROLE

订单簿

BatchAuction, MarketFactory

管理市场和结算订单

PROTOCOL_ROLE

金库

订单簿, BatchAuction, Redemption

锁定、解锁、转账抵押资产

MINTER_ROLE

OutcomeToken

BatchAuction, Redemption

铸造和销毁结果代币

ESCROW_ROLE

OutcomeToken

BatchAuction

在成交时通过 burnEscrow() 销毁 escrowed sell-order 代币

ADMIN_ROLE

MarketFactory

PythResolver

管理市场状态 transitions

Role Definitions

DEFAULT_ADMIN_ROLE(所有合约)

bytes32 公开constant DEFAULT_ADMIN_ROLE = 0x00;

由部署者 EOA 持有。它可以对任意 role 调用 grantRolerevokeRole。该 role 属于 OpenZeppelin 的默认管理员 role,负责管理所有其他 role。

OPERATOR_ROLE(订单簿)

bytes32 公开constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");

授予以下访问权限:

  • registerMarket(minLots, batchInterval, expiryTime) -- 创建新交易市场。

  • haltMarket(marketId) / resumeMarket(marketId) -- 暂停或恢复交易。

  • deactivateMarket(marketId) -- 永久关闭市场。

  • reduceOrderLots(orderId, lotsToReduce) -- 从订单中扣减已成交 lots。

  • updateTreeVolume(marketId, side, tick, delta) -- 成交后调整线段树。

  • advanceBatch(marketId) -- 递增批次计数器。

该 role 授予 BatchAuction(结算操作)和 MarketFactory(市场生命周期)。

PROTOCOL_ROLE(金库)

授予以下访问权限:

  • lock(user, amount) -- 为开放订单锁定抵押资产。

  • unlock(user, amount) -- 在取消或 prune 时解锁抵押资产。

  • transferCollateral(from, to, amount) -- 在账户之间移动锁定资金。

  • settleFill(user, marketId, toPool, feeCollector, protocolFee, unlockAmount) -- 执行合并结算。

  • addToMarketPool(user, marketId, amount) -- 将资金移入赎回池。

  • redeemFromPool(marketId, to, amount) -- 从赎回池支付资金。

该 role 授予 订单簿(下单和取消时锁定或解锁)、BatchAuction(结算)以及 Redemption(从 pool 支付)。

MINTER_ROLE(OutcomeToken)

授予以下访问权限:

  • mintPair(to, marketId, amount) -- 铸造 YES + NO 代币 pair。

  • mintSingle(to, marketId, amount, isYes) -- 铸造单个结果代币。

  • burnPair(from, marketId, amount) -- 销毁 YES + NO 代币 pair。

  • redeem(from, marketId, amount, winningOutcome) -- 销毁胜出代币。

该 role 授予 BatchAuction(在 clearBatch 原子化结算期间铸造代币)和 Redemption(赎回期间销毁胜出代币)。

ESCROW_ROLE(OutcomeToken)

授予以下访问权限:

  • burnEscrow(from, marketId, amount, isYes) -- 批次结算中,当卖单(SellYes/SellNo)成交时,销毁由订单簿托管的 escrowed 结果代币。

该 role 授予 BatchAuction。当 SellYes 或 SellNo 订单成交时,相关代币已在下单时由订单簿托管。BatchAuction 会在结算流程中调用 burnEscrow() 销毁这些代币。

ADMIN_ROLE(MarketFactory)

授予以下访问权限:

  • setResolving(factoryMarketId) -- 将市场转换为 Resolving 状态。

  • setResolved(factoryMarketId, outcomeYes, settlementPrice) -- 最终确认结算。

  • payResolverBounty(factoryMarketId, resolver) -- 将 creation bond 支付给 resolver。

  • pauseFactory(paused) -- 暂停或恢复市场创建。

  • setDefaultParams(batchInterval, minLots) -- 更新默认市场参数。

  • setCreationBond(bond) -- 更新 creation bond 金额。

  • setFeeCollector(collector) -- 更新费用收集器。

该 role 授予 PythResolver(结算状态转换)及 部署者(管理员控制)。注意:部署者也会通过 MarketFactory constructor 收到 ADMIN_ROLE

PythResolver Admin(自定义 ownership)

PythResolver 不使用 OpenZeppelin AccessControl。它有一个简单的 admin 地址,在构造函数中设置为 msg.sender。管理员转移采用两步模式:

管理员可以调用:

  • setConfThreshold(newBps) -- 更新 confidence interval threshold。

Role Graph (ASCII)

Detailed 流程 diagram:

Wiring Commands

部署后运行以下命令(部署者必须在每个合约中持有 DEFAULT_ADMIN_ROLE):

安全说明

  • 部署者持有所有合约中的 DEFAULT_ADMIN_ROLE。生产环境部署时应将其转移给 multisig 或 timelock。

  • PythResolver 管理员也应通过 setPendingAdmin / acceptAdmin 转移给 multisig。

  • Role grant 是累加式的;grantRole 不会 revoke 现有 holders。

  • 缺少必要 role grant 会在运行时触发 AccessControl: account... is missing role... revert。

Last updated