vebetterdao-navigators について
vebetterdao-navigators は、VeBetterDAO の投票・報酬コントラクトを開発する人向けに、Navigator 機能の仕様をまとめています。委任投票、報酬倍率、手数料、Relayer の動作を扱います。
主な機能
- 01配分・ガバナンス報酬倍率
- 02Navigator 登録と市民の委任
- 03スナップショット基準の委任投票
- 04Relayer の投票・スキップ処理
- 05報酬手数料とエスクロー
活用シーン
- 01Navigator コントラクトと投票フローの実装
- 02委任ルールと投票権の確認
- 03報酬倍率と手数料の挙動確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ vechain/ vechain-ai-skills --skill vebetterdao-navigatorsインストール後、Claude Code で/vebetterdao-navigatorsを入力して読み込まれたか確認します。
詳細
VeBetterDAO ナビゲーター機能
ナビゲーター機能に関するドメイン知識:報酬倍率とナビゲーターへの委任システム。両フェーズは同じリリースで提供されます。
フェーズ 1:報酬倍率
FreshnessUtils ライブラリを介して RoundVotesCountingUtils.countVote() で適用されます。報酬ウェイトのみを変更し、オンチェーンの投票力は変更しません。
| 動作 | 倍率 |
|---|---|
| 今回のラウンド(毎週)に更新 | x3(30000 bp) |
| 2 ラウンド以内(隔週)に更新 | x2(20000 bp) |
| 3 ラウンド以上更新なし | x1(10000 bp) |
- 「更新」とは、投票対象のアプリの組み合わせを変更すること(追加/削除/入れ替え)です。同じアプリへのウェイト変更は含まれません
- 投票対象アプリ ID の XOR フィンガープリントを使って計算します(順序に依存せず、O(n) でガス効率に優れています)
- 初回投票者は常に x3 になります(
lastFingerprint == bytes32(0)で検出) - ガバナンスで設定可能です(
VoterRewards.setFreshnessMultipliers(tier1, tier2, tier3)) - 値は VoterRewards の
Checkpoints.Trace208に保存されます(ラウンド開始時にスナップショットを取得) - ナビゲーターに委任した市民は、ナビゲーターの鮮度を引き継ぎます(投票時に市民のフィンガープリントがナビゲーターの選好で更新されます)
ガバナンス意図倍率(提案への投票)
registerVote() の前に GovernorVotesLogic で適用されます。提案ごとの登録時に適用され、各提案は独立しています。
| 投票タイプ | 倍率 |
|---|---|
| 賛成/反対 | x1(10000 bp) |
| 棄権 | x0.30(3000 bp) |
- ガバナンスで設定可能です(
VoterRewards.setIntentMultipliers(forAgainst, abstain)) - ナビゲーターに委任した市民は、ナビゲーターの判断倍率を引き継ぎます
倍率の適用範囲
- 鮮度は配分報酬の報酬ウェイトのみをスケーリングします(
RoundVotesCountingUtils.countVote()内) - 意図はガバナンス報酬の報酬ウェイトのみをスケーリングします(
registerVoteの前にGovernorVotesLogic内で適用) - GM は鮮度/意図と重ねて適用されません。 GM プールに資金がある場合(v5 以降のライブ設定)、GM は
cycleToVoterToGMWeightに投票者ごとの独自ウェイトを別途蓄積し、GM プールに対して請求されます。配分/ガバナンス報酬のウェイトには乗算されません。VoterRewards.registerVote()内の従来のweight * GM処理は、gmPoolAmount == 0の場合にのみ実行されます - 単位:ベーシスポイント(10000 = 1x)
安全なアップグレード
VoterRewards.initializeV7 は、各倍率について次の 2 つのチェックポイントを作成します。
- ラウンド開始時刻に 10000(中立)を設定し、現在のラウンドに影響しないようにします
- 現在のブロックに実際の設定値を設定します(次のラウンドから有効になります)
フェーズ 2:ナビゲーターシステム
基本概念
- ナビゲーター:委任した市民に代わって投票するために B3TR をステークするユーザー
- 市民:指定した VOT3 量をナビゲーターに委任するユーザー
- 役割は相互排他的です。ナビゲーターは別のナビゲーターの市民にはなれません
- 市民は VOT3 を完全に所有し続けますが、委任した分はロックされます
登録
- パーミッションレスです。NavigatorRegistry に最低 50,000 B3TR をステークします
- 最大ステーク量:流通中の VOT3 の 1%(入金時のみ適用され、既存分は適用除外)
- 委任比率は 10:1 です。ステーク量は、委任された VOT3 の合計の 10% 以上である必要があります。この比率に違反する場合、ステークの減額はできません
- プロフィール用のオンチェーンメタデータ URI(X2EarnApps と同じパターン)
- オンチェーンレポートは各ラウンドで任意に提出できますが、
submitReport(metadataURI)による提出が少なくとも 2 ラウンドに 1 回必須です - ナビゲーターは自動投票を有効にできません(相互排他的)
- ナビゲーターは別のナビゲーターに委任できません(役割が相互排他的)
委任
- 市民は特定の VOT3 数量を明示的に選んで委任します(全残高ではありません)。最小数量は1 VOT3です
- VOT3 は市民のウォレットに残りますが、委任した分はロックされます(転送や B3TR への変換はできません)
balanceOf()は委任分を含む全 VOT3 残高を返します。転送可能な数量にはunlockedBalance()を使用してください- VOT3 の
_update()は、balance - delegatedAmount >= transferAmountを強制します - VOT3 は
INavigatorRegistry.getDelegatedAmount(from)を通じて NavigatorRegistry から委任数量を読み取ります。ロールの付与も、VOT3 上のマッピングもなく、VOT3 が保存するのはレジストリーアドレスのみです - 市民が委任できるナビゲーターは 1 人のみです
- ラウンド開始時にスナップショットされます。ラウンド途中の変更は次のラウンドから反映されます
- 部分的な委任解除が可能です(次のラウンドから反映されます)
- 委任時に本人性の確認はありません。本人性は投票時に検証されます(スナップショット)。本人性のない市民はスキップされます
- 委任中の市民は手動で投票できません。まず委任を解除する必要があります
- 委任すると自動投票は無効になります(NavigatorRegistry が
XAllocationVoting.disableAutoVotingForを呼び出します) - 委任されていない VOT3 は使われず、報酬も得られません
- ナビゲーターの上限を超える委任は拒否されます(比率は 10:1)
委任関数
| 関数 | 目的 | イベント |
|---|---|---|
delegate(navigator, amount) | 初回のみ。機能停止したナビゲーターへの古い委任を自動的に解除します。 | DelegationCreated |
increaseDelegation(amount) | 既存の委任に VOT3 を追加します | DelegationIncreased |
reduceDelegation(amount) | 部分的または全額を減額します(全額の場合は委任を解除します) | DelegationDecreased または DelegationRemoved |
undelegate() | 委任を完全に解除します | DelegationRemoved |
市民数の全体集計
NavigatorRegistry は委任された市民の総数を追跡します。
Checkpoints.Trace208 totalDelegatedCitizens— 委任時に増加し、委任解除時に減少しますmapping(address => uint256) navigatorCitizenCount— ナビゲーターごとの人数getTotalDelegatedCitizensAtTimepoint(timepoint)—XAllocationVoting.startNewRoundがgovernanceUsersの計算に使用しますannounceExit()/deactivateNavigator()の実行時には、navigatorCitizenCount がゼロになり、totalDelegatedCitizens が直ちに減少します
投票の仕組み
割り当て投票(XAllocationVoting)
独立した 2 つの関数です(統合されていません)。
castVoteOnBehalfOf(voter, roundId)— 既存の自動投票フロー(変更なし)castNavigatorVote(citizen, roundId)— ナビゲーターに委任された市民向け:- 本人性はスナップショット時に検証されます。本人性のない市民は取り消しではなくスキップされ、
castVoteOnBehalfOfと同じ動作になります - 投票力 = ラウンドのスナップショット時点での委任数量(チェックポイント記録された数量であり、全残高ではありません)
- ナビゲーターのアプリ設定と割合(基準ポイントで指定するカスタムの重み配分。合計は 10000 で、アプリは最大 15 個)
- 市民 1 人につき個別のトランザクションが必要です
- スキップするか投票するかのロジックを内蔵しています(下記のリレイヤー連携を参照)
- 呼び出し元に対して
RelayerAction.VOTEを登録します
- 本人性はスナップショット時に検証されます。本人性のない市民は取り消しではなくスキップされ、
ナビゲーターが設定する設定内容が、ナビゲーター自身の投票となります(本人の VOT3 残高と、VOT3 に変換されたステーク済み B3TR)。
ガバナンス提案への投票(B3TRGovernor)
castNavigatorVote(proposalId, citizen) — 専用の関数です。
- 提案のスナップショット時点で、市民がナビゲーターに委任している必要があります
- ナビゲーターが投票判断(1=反対、2=賛成、3=棄権)を設定している必要があります
- 投票力 = 提案のスナップショット時点での委任数量(チェックポイント記録された数量)
- 報酬に意図倍率が適用されます
- RelayerRewardsPool に
RelayerAction.VOTEを登録します - スキップするか投票するかのロジックを内蔵しています(下記のリレイヤー連携を参照)
getVotesは委任を反映します
両方のガバナーにおけるgetVotes(account, timepoint):
- 市民が
timepoint時点で有効なナビゲーターを持っていた場合:委任された数量のみを返します(これが市民の投票権です) - ナビゲーターがいない場合:
VOT3.getPastVotesの全数量を返します(XAllocationVotingではgetDepositVotingPowerも加算されます) navigatorRegistry == address(0)の場合は、後方互換性のため残高全額を返しますgetQuadraticVotingPowerは内部でgetVotesを呼び出すため、委任はsqrt(委任された数量) * 1e9に引き継がれます- 参照専用です。スナップショット時に市民がナビゲーターを持っていた場合、実際の
castVoteはDelegatedToNavigatorでリバートします。ナビゲーターの投票では、getDelegatedAmountAtTimepointを直接使用します
リレイヤーとの連携
リレイヤーの予想アクションに算入される市民:
- ラウンド開始時に、
XAllocationVoting.startNewRoundが次の値を計算します:allocationUsers = autoVotingUsers + totalDelegatedCitizensgovernanceUsers = totalDelegatedCitizens(市民のみ。リレイヤーは自動投票ユーザーのガバナンス投票を行いません)
B3TRGovernor.getActiveProposals()を使って、アクティブなガバナンス提案を取得します- すべての値を
RelayerRewardsPool.setTotalActionsForRoundWithGovernance(roundId, allocationUsers, governanceUsers, activeProposalIds)に渡します - ラウンドごとの予想アクション数:
allocationUsers * 2(投票+請求)+governanceUsers * activeProposals(ガバナンス投票)
スキップまたは投票するフロー:
castNavigatorVote(配分とガバナンスの両方)は、投票とスキップを1つの関数にまとめます:
- スナップショット時にナビゲーターが無効 →
NotDelegatedToNavigatorでリバートします(市民は一度も委任していません) - スナップショット時に市民が人物として認識されていない → 直ちにスキップし、予想アクション数を減らします(
NavigatorVoteSkipped/NavigatorGovernanceVoteSkipped) - ナビゲーターが現在無効(スナップショット後に退出/無効化) → 直ちにスキップし、予想アクション数を減らします
- ナビゲーターが有効で、設定済みの選好/判断がある → 通常どおり投票します
- ナビゲーターが有効で、選好/判断が未設定、かつスキップ期間に到達 → スキップし、予想アクション数を減らします
- ナビゲーターが有効で、選好/判断が未設定、かつスキップ期間に未到達 → リバートします(リレイヤーは後で再試行します)
スキップ期間は、ラウンド/提案の期限前2時間(約720ブロック)です。定数はCITIZEN_SKIP_WINDOW_BLOCKS(配分)、GOVERNANCE_SKIP_WINDOW_BLOCKS(ガバナンス)です。
ユーザーごとのスキップ追跡(RelayerRewardsPool V3):
reduceUserAllocationVote(roundId, user)— 特定のユーザーの配分投票アクションを1つ減らしますreduceUserGovernanceVote(roundId, user, proposalId)— ユーザー/提案ごとのガバナンス投票アクションを1つ減らします- あるユーザーの投票アクションがすべてスキップされた場合(配分+すべてのガバナンス提案)、請求アクションも自動的に減らされます
- 同じユーザー/ラウンド/提案に対してすでに減らされている場合はリバートし、二重スキップを防止します
アクティブな提案のキャッシュ:
B3TRGovernor.proposalsForRoundマッピングには、提案の作成時に値が設定されますgetActiveProposals()は、現在のラウンドの提案からActive状態のものをフィルタリングします- ラウンド開始時に
RelayerRewardsPool.activeProposalsForRoundにキャッシュされます
選好設定の遅延による違反:
- ナビゲーターは、ラウンドの期限より少なくとも
preferenceCutoffPeriodブロック(約24時間)前までに選好を設定する必要があります - それより後の設定も可能ですが、そのラウンドでは軽微な違反として記録されます
委任時に自動投票を無効化:
NavigatorRegistry.delegate()は、権限付き呼び出しでXAllocationVoting.disableAutoVotingFor(citizen)を呼び出します- 委任解除後、ユーザーは手動で自動投票を再度有効にします
優先リレイヤー:
- 市民は
relayerRewardsPool.setPreferredRelayer(relayer)を使って、手動でpreferredRelayerを設定します - 早期アクセス期間中、市民の代理として操作できるのは、優先リレイヤーが設定済みかつ登録済みの場合に限り、その優先リレイヤーのみです
- 委任時に自動設定はされません。市民が手動で設定する必要があります
市民の手数料の順序(請求時):
- ナビゲーター手数料:総報酬から最初に差し引かれます(NavigatorRegistryの手数料エスクローに入ります)
- リレイヤー手数料:残額から差し引かれます(RelayerRewardsPoolに入ります)
- 市民が残りを受け取ります
- リレイヤー手数料は、自動投票ユーザーと市民の両方に適用されます
- 両方に対して請求アクションが登録されます
報酬
報酬はスナップショット時点での委任額のみに比例します(残高全額ではありません)。市民自身の GM レベルが適用されます。
手数料の適用順:
1. Navigator fee = gross reward * navigatorFeePercentage / 10000 (goes to NavigatorRegistry escrow)
2. Relayer fee = relayerRewardsPool.calculateRelayerFee(gross - navigatorFee) (goes to RelayerRewardsPool)
3. Citizen receives the rest
- リレイヤー手数料は、自動投票者とナビゲーターの市民の両方に適用されます
- ナビゲーター手数料は市民にのみ適用されます
- 手数料は報酬請求時に
VoterRewards.claimReward()で差し引かれます - 投票時に、市民の鮮度フィンガープリントはナビゲーターのアプリ設定で更新されます(鮮度を継承します)
- 市民はナビゲーターのガバナンス意図の乗数を継承します
手数料エスクロー
NavigatorRegistry 内:mapping(navigator => mapping(round => amount))
- 各ラウンドの手数料は4 ラウンド後に請求可能になります(順次ロック解除)
- 大規模スラッシュでは、未請求のロック済み手数料がすべて没収されます
スラッシング
軽微(現在の残存ステークの 5%を自動適用 — 複利)
公開関数を通じて誰でも報告できます。スラッシュされた資金はトレジャリーに送られます。
違反の種類は 6 つです:
- 配分投票の未実施 — 市民がいるのに、あるラウンドの設定を指定しなかった(委任が必要)
- ガバナンス提案への投票の未実施 — 市民がいるのに、提案の投票期間中に決定を行わなかった(委任が必要)
- 配分設定の未更新 — 3 ラウンド以上更新がない(鮮度乗数と同じしきい値)(委任が必要)
- 報告の未提出 — 連続する 2 ラウンドで報告を提出しなかった(委任が必要)
- 設定の遅延 — ラウンドの締め切り前の
preferenceCutoffPeriod(約 24 時間)を過ぎてから配分設定を行った(委任が必要) - 最低ステーク未満 — ラウンド開始時にステークが
minStake未満で、ラウンド終了時にも未満だった(委任の有無を問わず適用)
違反フラグ(NavigatorSlashingUtils 内のビットフラグ):
FLAG_MISSED_ALLOCATION = 1 << 0(1)FLAG_LATE_PREFERENCES = 1 << 1(2)FLAG_STALE_PREFERENCES = 1 << 2(4)FLAG_MISSED_REPORT = 1 << 3(8)FLAG_MISSED_GOVERNANCE = 1 << 4(16)FLAG_BELOW_MIN_STAKE = 1 << 5(32)
報告モデル:
- 軽微な違反の報告は、違反ごとではなくラウンドごとです
- ラウンド終了後、誰でも
reportRoundInfractions(navigator, roundId, proposalIds)を呼び出せます - コントラクトはそのラウンドについて、6 種類すべての違反をオンチェーンで評価します
- 違反 1~5 は、ラウンドのスナップショット時にナビゲーターへ委任があった場合にのみ確認されます
- 違反 6(最低ステーク未満)は委任の有無を問わず確認されます。ナビゲーターは常に最低額を上回るステークを維持する必要があります
- 最低ステーク未満かどうかは2 つのチェックポイントで確認します:
stakeAtRoundStart < minStake AND stakeAtRoundEnd < minStake。これにより、スラッシュでステークが減少した後、ナビゲーターには回復するための丸 1 ラウンドが与えられます - いずれかの違反が該当する場合、そのラウンドに対して適用される軽微なスラッシュはちょうど 1 回です
- ラウンドがまだ進行中の場合、報告は
RoundStillActiveによりリバートします
ステークが最低額を下回った場合、アクティブ状態は維持されますが、新たな委任を受け入れられず、ラウンド終了までに補充されなければスラッシュされます。
最低ステーク未満となるタイミングの例(minStake = 50K):
| ラウンド | 開始時のステーク | イベント | 終了時のステーク | belowMinStake? |
|---|---|---|---|---|
| R3 | 50K | 義務を果たさず 5%スラッシュ → 47.5K | 47.5K | No(開始時は最低額以上) |
| R4 | 47.5K | ナビゲーターがラウンド途中に 3K を補充 | 50.5K | No(開始時は最低額未満だが、終了時までに回復) |
| R5 | 50.5K | — | 50.5K | No(最低額を上回る) |
ナビゲーターが回復しない場合:
| ラウンド | 開始時のステーク | イベント | 終了時のステーク | belowMinStake? |
|---|---|---|---|---|
| R3 | 50K | 5%スラッシュ → 47.5K | 47.5K | No(開始時は最低額以上) |
| R4 | 47.5K | 対応なし | 47.5K | Yes(開始時と終了時の両方で最低額未満) |
| R5 | 45.125K | 再度スラッシュ | 42.87K | Yes(連鎖的に発生) |
大規模(ガバナンスプロセス、ステークとロック済み手数料の最大 100%および資格剥奪)
対象:操作、贈賄、票の買収、報酬の非開示。 プロセス:5 人のナビゲーターがステークをロックして開始 → 4 ラウンド以内に調査結果を公開 → ガバナンス投票。
解除
- オンチェーンで実行されるガバナンス提案を通じて行います(誰でも提案できます)
- 提案にはスラッシュする額(ステーク額とロックされた手数料の0~100%)が含まれます
- 次のラウンドから有効になります(現在のラウンドは通常どおり完了します)
- 再有効化はできません — 新たに登録する必要があります
退出
announceExit()— イベントが発行され、1ラウンドの予告期間が設けられます(ガバナンスで設定可能)- ナビゲーターは予告期間中も引き続き投票する必要があります
- 遅延無効化:退出が発表されると、すべての市民の委任がビュー上で無効になります
isDelegated()は false を返し、getDelegatedAmount()は 0 を返します- VOT3 の転送ロックは自動的に解除されます(市民による操作は不要です)
castNavigatorVoteはNotDelegatedToNavigatorで失敗します- 新たな市民は委任できません(
NavigatorCannotAcceptDelegations)
- 市民は、先に
undelegate()を呼び出さなくても、新しいナビゲーターに直接再委任できます(古い委任は自動的に消去されます) - 退出の予告期間が過ぎると(無効化のチェックポイントに達すると)、
withdrawStake()が利用可能になり、ステークは即時に返還されます。ロックされた手数料は、claimFee(roundId)を通じてそれぞれの4ラウンドのスケジュールに従います - 再参加するには、新たに登録する必要があります
finalizeExit()はありません — チェックポイントのタイミングにより、退出は自動的に適用されます
ナビゲーターの退出/無効化時の市民の利用体験
遅延無効化によって VOT3 は自動的にロック解除されるため、市民は何も操作する必要がありません。
getDelegatedAmount(citizen)はナビゲーターが無効かどうかを確認し、無効なら 0 を返します- VOT3._update() は
getDelegatedAmountを読み取り、0 を確認すると転送を許可します - 市民は
delegate(newNavigator, amount)を直接呼び出せます — 古いチェックポイントは自動的に消去されます - 報酬計算用の過去の委任データは保持されます(
getDelegatedAmountAtTimepointには影響しません)
インデクサー:暗黙的な委任解除
ナビゲーターの退出または無効化時に、DelegationRemoved イベントは発行されません。インデクサーは、ExitAnnounced/NavigatorDeactivated イベントを、そのナビゲーターに対するすべての市民の委任を一括解除するイベントとして扱う必要があります。
ステーキングと投票権
ナビゲーターは B3TR をステークし、内部で VOT3 に変換します。 ステークされた額は NavigatorRegistry に VOT3 として保持され、ナビゲーター自身の投票権としてカウントされます(stakedAmount Trace208 を通じてチェックポイントに記録されます)。NavigatorRegistry は初期化時に VOT3 上で自身に委任するため、投票総量が正確になります。
ステークされた VOT3 は投票権にのみカウントされ、提案の支持や投票権の減少には使用できません。また、直接の報酬は発生しません。
| アクター | 投票権の源泉 | カウントされないもの |
|---|---|---|
| ナビゲーター(自身の投票) | 個人の VOT3 残高 + ステークされた B3TR(VOT3 として) | 市民から委任された VOT3 |
| 市民(ナビゲーターを通じた投票) | スナップショット時点で委任されている VOT3 の額 | 未委任のまま残っている VOT3 |
委任された VOT3 が市民のウォレットから出ることはありません。ナビゲーターが投票先を決め、各市民の委任額は個別の票として投じられます。
B3TR↔VOT3 の変換フロー: register()/addStake() 時:B3TR がコントラクトに転送され、VOT3.convertToVOT3() を通じて VOT3 に変換されます。reduceStake()/withdrawStake()/スラッシュ時:VOT3 が VOT3.convertToB3TR() を通じて B3TR に戻され、外部に転送されます。
経済性: ステークされた B3TR により、ナビゲーターは投票権を得ます。手数料を得るには、委任も集める必要があります。例:50K B3TR をステーク(投票権は 50K VOT3)し、最大 500K VOT3 の委任を集める → ナビゲーターは、その 500K VOT3 が生み出す報酬に対して20%の手数料を得ます。
コントラクトレベルの保護
| 保護 | コントラクト | エラー |
|---|---|---|
| 自己委任をブロック | NavigatorDelegationUtils | SelfDelegationNotAllowed |
| 委任者はナビゲーターとして登録できない | NavigatorStakingUtils | DelegatorCannotRegister |
| 市民は手動投票(配分)できない | XAllocationVoting | DelegatedToNavigator |
| 市民は手動投票(ガバナンス)できない | GovernorVotesLogic | DelegatedToNavigator |
| ナビゲーターは自動投票を有効にできない | XAllocationVoting | NavigatorCannotEnableAutoVoting |
| 市民は自動投票を有効にできない | XAllocationVoting | DelegatedToNavigator |
| 手数料の入金は VoterRewards に限定 | NavigatorRegistry | UnauthorizedCaller |
| 退出/無効化時に遅延無効化 | NavigatorDelegationUtils | _isNavigatorDead() |
主要コントラクト
新規
NavigatorRegistry— 6 つのライブラリを備えた UUPS アップグレード可能なファサード:NavigatorStakingUtils、NavigatorDelegationUtils、NavigatorVotingUtils、NavigatorFeeUtils、NavigatorSlashingUtils、NavigatorLifecycleUtils
変更済み
VOT3.sol(V2)— 重複するストレージを持たず、NavigatorRegistry から委任ロックを読み取りますXAllocationVoting.sol(V9)— 市民とガバナンス向けのcastNavigatorVote、disableAutoVotingFor、startNewRoundB3TRGovernor.sol(V10)—castNavigatorVote、getActiveProposals、proposalsForRound、relayerRewardsPoolVoterRewards.sol(V7)— マルチプライヤーのチェックポイント、ナビゲーター手数料の控除、インテントのマルチプライヤーRelayerRewardsPool.sol(V3)— ユーザーごとのスキップ追跡、setTotalActionsForRoundWithGovernance、activeProposalsForRound
依存関係(読み取り専用)
VOT3.sol— 最大ステーク上限の計算に使用する流通供給量VeBetterPassport— 人物性チェック(ナビゲーターに委任された市民についてはスナップショット時に検証し、人物性が確認できない場合はスキップ)RelayerRewardsPool— リレイヤー登録の確認、preferredRelayer、ユーザーごとのスキップ追跡B3TRGovernor— ラウンド開始時のアクティブな提案の照会
コードベースのリファレンス
ナビゲーターのコントラクト
/packages/contracts/contracts/navigator/NavigatorRegistry.sol— メインファサード/packages/contracts/contracts/navigator/libraries/NavigatorStorageTypes.sol— 単一の ERC-7201 名前空間/packages/contracts/contracts/navigator/libraries/NavigatorStakingUtils.sol/packages/contracts/contracts/navigator/libraries/NavigatorDelegationUtils.sol/packages/contracts/contracts/navigator/libraries/NavigatorVotingUtils.sol/packages/contracts/contracts/navigator/libraries/NavigatorFeeUtils.sol/packages/contracts/contracts/navigator/libraries/NavigatorSlashingUtils.sol/packages/contracts/contracts/navigator/libraries/NavigatorLifecycleUtils.sol/packages/contracts/contracts/interfaces/INavigatorRegistry.sol
変更済みコントラクト
/packages/contracts/contracts/x-allocation-voting-governance/XAllocationVoting.sol/packages/contracts/contracts/x-allocation-voting-governance/libraries/VotesUtils.sol/packages/contracts/contracts/governance/B3TRGovernor.sol/packages/contracts/contracts/governance/libraries/GovernorVotesLogic.sol/packages/contracts/contracts/governance/libraries/GovernorStorageTypes.sol/packages/contracts/contracts/governance/libraries/GovernorConfigurator.sol/packages/contracts/contracts/VoterRewards.sol/packages/contracts/contracts/VOT3.sol/packages/contracts/contracts/RelayerRewardsPool.sol
v1 に含まれない機能
- ナビゲーターが設定できる手数料率(固定 20%)