auto-voting-relayers について
auto-voting-relayersは、VeBetterDAOのコントラクト、relayerノード、ダッシュボード、ドキュメント向けのドメイン知識を提供します。自動投票とNavigatorへの委任投票、報酬処理や手数料の仕組みを扱います。
主な機能
- 01自動投票と設定を解説
- 02Navigatorへの委任投票を網羅
- 03relayer登録と報酬分配を説明
- 04コントラクトの役割と投票手順を詳述
- 05報酬からの手数料控除を説明
活用シーン
- 01VeBetterDAOの投票機能を開発・保守
- 02Navigator委任市民の投票手順を把握
- 03relayerの処理や報酬請求を調査
- 04コントラクト関数やラウンド別処理を参照
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ vechain/ vechain-ai-skills --skill auto-voting-relayersインストール後、Claude Code で/auto-voting-relayersを入力して読み込まれたか確認します。
詳細
VeBetterDAO 自動投票・リレイヤーシステム
自動投票とリレイヤーのエコシステムに関する包括的なドメイン知識です。このスキルは、スマートコントラクト、リレイヤーノード、リレイヤーダッシュボード、ドキュメントなど、システムのあらゆるコンポーネントに取り組む際のコンテキストを提供します。
システム概要
VeBetterDAO の自動投票システムでは、ユーザーが毎週の X Allocation 投票を自動化できます。ユーザーはお気に入りのアプリを一度選んで自動投票を有効にするだけで、リレイヤー(オフチェーンサービス)が投票と報酬の請求をすべてガス代無料で行います。リレイヤーは報酬プールから手数料を獲得します。トークンがユーザーのウォレットから出ることはありません。
Navigators 機能により、リレイヤーはナビゲーターに委任した市民にも対応します。市民に代わって、配分ラウンドとガバナンス提案の両方に投票します。市民も自動投票ユーザーとともに、予想アクション数に完全に含まれます。
アーキテクチャ
Users (toggle auto-voting, set preferences)
Citizens (delegate VOT3 to a navigator)
|
v
Smart Contracts (on-chain logic)
- XAllocationVoting (v9): auto-voting state, vote execution, castNavigatorVote
- B3TRGovernor (v10): governance castNavigatorVote, getActiveProposals
- VoterRewards (v7): reward claiming, fee deduction (relayer + navigator fees)
- RelayerRewardsPool (v3): relayer registration, reward distribution, per-user skip tracking
- NavigatorRegistry: delegation state, preferences, governance decisions
|
v
Relayer Nodes (off-chain execution)
- relayer-node/ (standalone CLI, no monorepo dependency)
- Monitor rounds, batch vote/claim, loop every 5 min
- Serve both auto-voting users and navigator citizens
|
v
Relayer Dashboard (monitoring/analytics)
- apps/relayer-dashboard/ (static Next.js, GitHub Pages)
- Round analytics, relayer stats, ROI tracking
仕組み(技術に詳しくない方向け)
ユーザー向け(自動投票)
- 1 以上の VOT3 を保有し、3 件以上のサステナブルなアクションを完了して、VeBetterPassport の認証に合格します
- 最大 15 個のアプリを選び、自動投票を有効にします
- 次のラウンドから有効になります(現在のラウンドには適用されません)
- 毎週、リレイヤーがユーザーに代わって投票し、報酬をユーザーのウォレットに請求します
- 手数料:報酬の 10%(週あたり最大 100 B3TR)。すべてのガス代をカバーします
- 有効な間は、手動での投票や請求はできません
- 手動請求のフォールバック:ラウンド終了から 5 日後に利用可能。リレイヤーが処理していない場合に限ります
市民向け(ナビゲーターへの委任)
- 特定の VOT3 数量をナビゲーターに委任します
- 委任すると、自動投票は自動的に無効になります
- リレイヤーはナビゲーターのアプリ設定を使用して、配分ラウンドに投票します
- リレイヤーはナビゲーターの判断(賛成/反対/棄権)を使用して、ガバナンス提案に投票します
- リレイヤーが報酬を請求します。まずナビゲーターの手数料が差し引かれ、その後リレイヤーの手数料が差し引かれます
- 残りの報酬が市民のウォレットに送られます
自動無効化の条件(自動投票)
- VOT3 が 1 未満になる
- 選択したアプリがすべて対象外になる
- サステナブルなアクションのしきい値を満たさない
- アプリオーナーによるボット検出
リレイヤー向け
- RelayerRewardsPool で registerRelayer() を呼び出し、オンチェーンで登録します(誰でも登録可能)
- ウォレット(MNEMONIC または RELAYER_PRIVATE_KEY)を使って relayer-node を実行します
- ノードが自動投票ユーザーとナビゲーターの市民を自動的に検出します
- 重み付きポイントを獲得します。投票=3 ポイント、請求=1 ポイント(自動投票と市民の投票の両方が対象)
- 市民に代わるガバナンス投票でも、投票の重み(各 3 ポイント)を獲得します
- 予想されるすべてのアクションが完了(またはスキップ)した後、報酬プールから比例配分を請求します
リレイヤーとしてのアプリ
アプリはリレイヤーとして登録し、ユーザーに自分を設定に加えてもらい、ノードを実行できます。投票のために veDelegate に支払う代わりに、リレイヤー手数料を獲得できます。重要:アプリは他のアプリを置き換えるのではなく、自分を設定リストに追加してください。
veDelegate との比較
| 機能 | veDelegate | VeBetterDAO 自動投票 |
|---|---|---|
| X Allocation 投票 | はい | はい |
| ガバナンス投票 | はい(常に「棄権」) | はい(市民の場合:ナビゲーターの判断) |
| 複利運用(B3TR->VOT3) | 自動 | 手動 |
| トークンの保管 | ウォレットから出る | ウォレットに残る |
| 中央集権性 | 単一の組織 | 多数のリレイヤー |
| アプリのコスト | アプリが veDelegate に支払う | アプリが手数料を獲得 |
veDelegate:docs.vedelegate.vet / github.com/vechain-energy/vedelegate-for-dapps
スマートコントラクトの詳細
XAllocationVoting.sol (v9)
v8 で自動投票が追加され、v9 でナビゲーター投票が追加されました。現在は外部ライブラリアーキテクチャを使用しています。
ストレージ(AutoVotingLogic / XAllocationVotingStorageTypes 内):
_autoVotingEnabled:ユーザーごとのチェックポイント付きステータス(変更は次のラウンドから有効)_userVotingPreferences:ユーザーごとのアプリ ID の配列(最大 15 件、検証済み、重複なし)_totalAutoVotingUsers:チェックポイント付きの合計数navigatorRegistry:INavigatorRegistry 参照(V9)
主な関数:
toggleAutoVoting(address user) // Enable/disable
setUserVotingPreferences(bytes32[] memory appIds) // Set apps (1-15)
castVoteOnBehalfOf(address voter, uint256 roundId) // Relayer executes auto-vote
castNavigatorVote(address citizen, uint256 roundId) // Relayer executes citizen vote (vote-or-skip)
disableAutoVotingFor(address user) // Privileged, called by NavigatorRegistry on delegation
getUserVotingPreferences(address) // View preferences
isUserAutoVotingEnabled(address) // Current status
isUserAutoVotingEnabledForRound(address, uint256) // Status at round snapshot
getTotalAutoVotingUsersAtRoundStart() // Count at last emission
getTotalAutoVotingUsersAtTimepoint(uint48) // Historical count
投票の実行(castVoteOnBehalfOf — 自動投票ユーザー):
- 早期アクセスを検証します(期間中にリレイヤーが登録済みであること)
- ユーザー設定を取得し、投票可能なアプリを絞り込みます
- 投票権を投票可能なアプリに均等に分割します
- 内部の
_countVote()経由で投票します - RelayerRewardsPool に VOTE アクションを登録します(ウェイトポイント 3)
ナビゲーター投票の実行(castNavigatorVote — 市民):
スキップまたは投票の判定フロー(関数に統合されており、個別のスキップ呼び出しはありません):
- スナップショット時点でナビゲーターが停止している →
NotDelegatedToNavigatorを返してリバートします - 現在、ナビゲーターが停止している(スナップショット後に退出/無効化された)→
pool.reduceUserAllocationVoteでスキップし、NavigatorVoteSkippedを発行します - ナビゲーターが有効で設定がある → ナビゲーター独自の割合(ベーシスポイント、合計が 10000 であること)を使って通常どおり投票し、
RelayerAction.VOTEを登録します - ナビゲーターが有効で設定がなく、スキップ期間に達している → スキップし、
NavigatorVoteSkippedを発行します - ナビゲーターが有効で設定がなく、スキップ期間に達していない →
SkipWindowNotReachedを返してリバートします
スキップ期間:XAllocationVoting.citizenSkipWindowBlocks() — ストレージで設定可能(V9 の移行)、デフォルトは約 720 ブロック(ラウンド期限の約 2 時間前)です。getter を使ってチェーンから読み取ってください。ハードコードしないでください。ガバナンスによって setCitizenSkipWindowBlocks で更新でき、値はネットワークごとに異なる場合があります。
startNewRound() — 期待されるアクションの設定:
ラウンドの期待されるアクションを計算します。
allocationUsers = autoVotingUsers + totalDelegatedCitizensgovernanceUsers = totalDelegatedCitizens(市民のみ — リレイヤーは自動投票ユーザーのガバナンス投票を行いません)governor.getActiveProposals()を取得しますpool.setTotalActionsForRoundWithGovernance(roundId, allocationUsers, governanceUsers, activeProposals)を呼び出します
B3TRGovernor.sol (v10)
V10 ではナビゲーターによるガバナンス投票とリレイヤー連携が追加されました。
castNavigatorVote(proposalId, citizen) — 市民によるガバナンス投票:
XAllocationVoting と同じスキップまたは投票のパターンです。
- スナップショット時点でナビゲーターが停止している →
NotDelegatedToNavigatorを返してリバートします - 現在、ナビゲーターが停止している →
pool.reduceUserGovernanceVoteでスキップし、NavigatorGovernanceVoteSkippedを発行します - ナビゲーターが有効で決定が設定されている → 通常どおり投票し、RelayerRewardsPool に
RelayerAction.VOTEを登録します - ナビゲーターが有効で決定がなく、スキップ期間に達している → スキップし、
NavigatorGovernanceVoteSkippedを発行します - ナビゲーターが有効で決定がなく、スキップ期間に達していない →
GovernanceSkipWindowNotReachedを返してリバートします
スキップ期間:B3TRGovernor.governanceSkipWindowBlocks() — ストレージで設定可能(V10 の移行)、デフォルトは約 720 ブロック(提案の期限の約 2 時間前)です。getter を使ってチェーンから読み取ってください。ハードコードしないでください。ガバナンスによって setGovernanceSkipWindowBlocks で更新でき、値はネットワークごとに異なる場合があります。
ナビゲーターの決定をマッピングします:1=Against、2=For、3=Abstain → ガバナーの支持値 0、1、2。 報酬にはインテント倍率を適用します。
getActiveProposals() — 現在有効な提案 ID を返します(提案作成時に入力される proposalsForRound マッピングから絞り込み)。XAllocationVoting.startNewRound がガバナンスの期待されるアクションを計算するために使用します。
VoterRewards.sol (v7)
V6 ではリレイヤー手数料との連携が追加されました。V7 ではナビゲーター手数料の差し引きと報酬倍率が追加されました。
V7 のストレージ追加項目: navigatorRegistry
claimReward(uint256 cycle, address voter) の手数料フロー:
- ラウンド開始時にユーザーが自動投票または委任を行っていたことを確認します(チェックポイントに記録済み)
- 報酬の総額を計算します(投票報酬+GM 報酬)
- 市民(委任済み)の場合:総報酬から最初にナビゲーター手数料を差し引き、NavigatorRegistry の手数料エスクローに入金します
- 自動投票または委任を行っていた場合:残額からリレイヤー手数料を差し引き、
RelayerRewardsPool.deposit(fee, cycle)に入金します registerRelayerAction(msg.sender, voter, cycle, CLAIM)— 呼び出し元に重みポイントを 1 点付与します- 手取りの報酬を投票者のウォレットに送金します
手数料の計算式:
Navigator fee = gross * navigatorFeePercentage / 10000 (citizens only, goes to NavigatorRegistry escrow)
Relayer fee = min((gross - navigatorFee) * relayerFeePercentage / 100, feeCap) (auto-voters AND citizens)
重要: claimReward() を呼び出す msg.sender が、CLAIM アクションの報酬を受け取るリレイヤーになります。
早期アクセス: 期間中、呼び出し元が投票者本人であるか、登録済みリレイヤーでない場合はリバートします。自動投票ユーザーと市民の両方に適用されます。
RelayerRewardsPool.sol (v3)
登録、アクション追跡、報酬分配、ユーザーごとのスキップ追跡を管理します。
コアストレージ:
totalRewards[roundId] // Pool amount (funded by fees)
relayerWeightedActions[roundId][relayer] // Per-relayer weighted work
totalWeightedActions[roundId] // Expected weighted total
completedWeightedActions[roundId] // Completed weighted total
registeredRelayers[address] // Registration mapping
relayerAddresses[] // All registered addresses
voteWeight = 3 // Points per vote action
claimWeight = 1 // Points per claim action
earlyAccessBlocks = 432,000 // ~5 days on VeChain
relayerFeePercentage = 10 // 10%
feeCap = 100 ether // 100 B3TR
V3 のストレージ追加項目:
activeProposalsForRound[roundId] // Cached governance proposal IDs
userAllocationVoteReduced[roundId][user] // Per-user allocation skip flag
userGovernanceVoteReduced[roundId][user][proposalId] // Per-user/proposal governance skip flag
userClaimReduced[roundId][user] // Per-user claim auto-reduction flag
報酬の計算式:
relayerShare = (relayerWeightedActions / completedWeightedActions) * totalRewards
報酬の請求条件: isRewardClaimable(roundId) は、以下の条件を満たす必要があります。
- ラウンドが終了している(
emissions.isCycleEnded(roundId)) - すべての作業が完了している(
completedWeightedActions >= totalWeightedActions) - ユーザーごとのスキップにより
totalWeightedActionsが自動的に減るため、スキップした市民が請求可能になるのを妨げることはありません
登録(誰でも可能):
registerRelayer()— 自己登録unregisterRelayer(address)— 管理者またはリレイヤー本人が呼び出せます
想定アクションの設定:
setTotalActionsForRound(roundId, userCount)— 旧方式。governanceUsers=0としてsetTotalActionsForRoundWithGovernanceに委譲しますsetTotalActionsForRoundWithGovernance(roundId, allocationUsers, governanceUsers, activeProposalIds)— V3:想定アクションを設定します。合計 =allocationUsers * 2(投票+請求)+governanceUsers * activeProposals(ガバナンス投票)。activeProposalIdsをキャッシュします
アクション数の削減:
reduceExpectedActionsForRound(roundId, userCount)— 対象外の自動投票ユーザーについて、一括で削減しますreduceUserAllocationVote(roundId, user)— ユーザーごとの配分投票のスキップ。ユーザーの投票がすべてスキップされた場合、請求アクションも自動的に削減しますreduceUserGovernanceVote(roundId, user, proposalId)— ユーザー/提案ごとのガバナンス投票のスキップ。同じ自動削減ロジックが適用されます- 二重スキップの防止:同じユーザー/ラウンド/提案について、すでに削減済みの場合はリバートします
アクションの登録:
registerRelayerAction(relayer, voter, roundId, action)— 投票または請求の作業を記録しますdeposit(amount, roundId)— 手数料の差し引き分をプールに入金します
早期アクセス:
- 投票期間:
roundSnapshot + earlyAccessBlocks - 請求期間:
roundDeadline + earlyAccessBlocks - 期間中:登録済みリレイヤーのみが操作でき、ユーザー本人は操作できません
- 期間終了後:誰でも操作できます
リレイヤーのライフサイクル(ラウンドごと)
Round N: Users enable auto-voting / citizens delegate to navigators (checkpointed)
Round N+1:
1. startNewRound() - snapshot locks status
- allocationUsers = autoVotingUsers + totalDelegatedCitizens
- governanceUsers = totalDelegatedCitizens
- fetches activeProposals from B3TRGovernor
- calls setTotalActionsForRoundWithGovernance(roundId, allocationUsers, governanceUsers, activeProposals)
2. ALLOCATION VOTING:
a. Relayers call castVoteOnBehalfOf(voter, roundId) for auto-voting users
- Ineligible users: reduceExpectedActionsForRound()
- Each successful vote: +3 weighted points
b. Relayers call castNavigatorVote(citizen, roundId) for citizens
- Navigator dead/no-prefs + skip window reached: skip (reduceUserAllocationVote)
- Navigator alive + prefs set: vote, +3 weighted points
3. GOVERNANCE VOTING (concurrent with allocation):
For each active proposal:
Relayers call B3TRGovernor.castNavigatorVote(proposalId, citizen) for each citizen
- Navigator dead/no-decision + skip window reached: skip (reduceUserGovernanceVote)
- Navigator alive + decision set: vote, +3 weighted points
4. Round ends (deadline block)
5. CLAIMS:
Relayers call VoterRewards.claimReward(cycle, user) for auto-voters and citizens
- Navigator fee deducted first (citizens only), then relayer fee
- Each successful claim: +1 weighted point
- If all votes for a citizen were skipped, claim is auto-reduced (no claim needed)
6. All expected actions completed (or reduced via skips) -> pool unlocks
7. Relayers call RelayerRewardsPool.claimRewards(roundId)
ナビゲーターの市民との連携
リレイヤーは、既存の自動投票ユーザーに加えて、ナビゲーターに委任された市民にもサービスを提供します。これは既存の自動投票ロジックに追加されるものであり、置き換えるものではありません。
自動投票との主な違い
| 項目 | 自動投票ユーザー | ナビゲーター市民 |
|---|---|---|
| 投票関数(配分) | castVoteOnBehalfOf(voter, roundId) | castNavigatorVote(citizen, roundId) |
| 投票関数(ガバナンス) | 該当なし | B3TRGovernor.castNavigatorVote(proposalId, citizen) |
| 検出 | AutoVotingToggled イベント | DelegationCreated/Removed イベント |
| 設定 | ユーザー自身のアプリ一覧(均等配分) | ナビゲーターの AllocationPreferencesSet(カスタム割合) |
| ガバナンス | 該当なし | ナビゲーターの GovernanceDecisionSet |
| 投票権 | スナップショット時点の VOT3 残高全額 | スナップショット時点の委任額(チェックポイント記録済み) |
| 人物確認 | あり | なし |
| 予定アクションに含まれるか | はい(配分のみ) | はい(配分+ガバナンス) |
| スキップの仕組み | reduceExpectedActionsForRound(一括) | ユーザーごとのスキップとスキップ期間 |
| 報酬請求関数 | claimReward(cycle, voter) | 同じ — claimReward(cycle, citizen) |
| 請求時の手数料 | リレイヤー手数料のみ | まずナビゲーター手数料、その後リレイヤー手数料 |
予定アクションにおける市民
市民は予定アクションに含まれます。ラウンド開始時:
allocationUsers = autoVotingUsers + totalDelegatedCitizens(配分投票+報酬請求用)governanceUsers = totalDelegatedCitizens(ガバナンス投票用 — 自動投票ユーザーではなく、市民のみ)- リレイヤーは自動投票ユーザーに代わってガバナンス投票を行わないため、
governanceUsersは別にカウントされます
スキップ期間(ネットワークごとにストレージで設定可能。デフォルトは約 720 ブロック/期限の約 2 時間前 — XAllocationVoting.citizenSkipWindowBlocks()/B3TRGovernor.governanceSkipWindowBlocks() から読み取ります)とユーザーごとのスキップ追跡により、デッドロックを防止します。ナビゲーターが設定を行わなかった場合、スキップ期間の開始後にリレイヤーがその市民の投票をスキップでき、予定アクション数をそれに応じて減らします。
スキップまたは投票のフロー(配分とガバナンスの両方)
castNavigatorVote は投票とスキップを単一の関数で処理します。
- スナップショット時点でナビゲーターが無効 → リバート(スナップショット時点で市民は委任されていません)
- 現在、ナビゲーターが無効(スナップショット後に離脱/無効化) → 即座にスキップし、予定アクション数を減らします
- ナビゲーターが有効で、設定/判断が設定済み → 通常どおり投票します
- ナビゲーターが有効で、設定/判断が未設定で、スキップ期間に達している → スキップします
- ナビゲーターが有効で、設定/判断が未設定で、スキップ期間に達していない →
SkipWindowNotReached/GovernanceSkipWindowNotReachedをリバートします(リレイヤーは後で再試行します)
ユーザーごとのスキップ追跡
市民の投票がスキップされた場合:
- 配分:
reduceUserAllocationVote(roundId, citizen)— 予定アクション数を減らします - ガバナンス:
reduceUserGovernanceVote(roundId, citizen, proposalId)— 提案ごとに減らします - 市民のすべての投票(配分+すべてのガバナンス提案)がスキップされると、報酬請求アクションも自動的に減らされます
- 各スキップはユーザーごと、ラウンドごと、提案ごとに行われるため、二重に減算されるのを防ぎます
ガバナンス投票の登録
B3TRGovernor.castNavigatorVote は、各ガバナンス投票について RelayerRewardsPool に RelayerAction.VOTE を登録します。リレイヤーは配分投票と同様、ガバナンス投票ごとに重みポイントを 3 点獲得します。
市民の手数料の順序
- ナビゲーター手数料:報酬総額から差し引かれます(NavigatorRegistry の手数料エスクローに入ります)
- リレイヤー手数料:残額から差し引かれます(自動投票と同じ割合および上限で、RelayerRewardsPool に入ります)
- 残りが市民に支払われます
委任時の自動投票の無効化
ユーザーがナビゲーターに委任すると、XAllocationVoting.disableAutoVotingFor(citizen) によって自動投票が自動的に無効化されます。これにより、二重カウントや投票経路の競合を防ぎます。委任解除後、ユーザーは手動で自動投票を再度有効にする必要があります。
優先リレイヤー
- 市民は
relayerRewardsPool.setPreferredRelayer(relayer)を使ってpreferredRelayerを手動で設定します - 早期アクセス期間中は、優先リレイヤーが設定済みで登録されている場合、そのリレイヤーのみが市民に代わって操作できます
- 委任時に自動設定されることはありません — 市民が手動で設定する必要があります
- 市民はいつでも変更または解除できます
リレーノード(relayer-node/)
スタンドアロンの CLI ツールです。モノレポへの依存はありません。
依存関係: @vechain/sdk-core、@vechain/sdk-network、@vechain/vebetterdao-contracts
relayer-node/src/
index.ts # Entry, env parsing, main loop, SIGINT
config.ts # Mainnet + testnet-staging addresses
contracts.ts # 26 view functions + event pagination
relayer.ts # Batch vote/claim with isolation/retry
display.ts # Terminal UI (box drawing + chalk)
types.ts # Shared interfaces
環境変数: MNEMONIC / RELAYER_PRIVATE_KEY、RELAYER_NETWORK、RUN_ONCE、DRY_RUN
サイクル: イベントからユーザーを検出 -> 投票済みのユーザーを除外 -> castVoteOnBehalfOf と castNavigatorVote を一括実行 -> Governance の castNavigatorVote を一括実行 -> claimReward を一括実行 -> 5 分ごとに繰り返し
リレーダッシュボード(apps/relayer-dashboard/)
静的な Next.js 14(output: "export")、Chakra UI v3、VeChain Kit、Recharts で構成されています。GitHub Pages の /b3tr で公開されます。
データ: 静的な report.json(1 時間ごとの GH Action で一時的に生成)と、useCallClause によるオンチェーン読み取り
ページ(ファイルルーティングではなく、状態ベースのナビゲーション):
- ホーム:StatsCards(2x2)、RoundsChart、RoundsList、情報カード
- マイリレー:ConnectedWallet ビュー
- 情報:BecomeRelayer + AppsAsRelayers
- ラウンド詳細:
/round?roundId=X- 2 列のレイアウト、概要/アクション/財務情報
フック:
contracts.ts-@repo/configの ABI とアドレスuseCurrentRoundId- XAllocationVoting.currentRoundId()useTotalAutoVotingUsers- getTotalAutoVotingUsersAtTimepoint()useRegisteredRelayers- getRegisteredRelayers()useRoundRewardStatus- isRewardClaimable() + getTotalRewards()useReportData- /data/report.json を取得useB3trToVthoRate- オラクルの為替レート
コマンド: yarn relayer:dev:staging、yarn relayer:dev:mainnet、yarn relayer:build:staging、yarn relayer:build:mainnet
ガス代の分析
| アクション | ガス | VTHO | B3TR 換算 |
|---|---|---|---|
| 投票(5~8 アプリ) | ~441K | ~4.41 | ~0.075 |
| 請求 | ~208K | ~2.08 | ~0.035 |
| ユーザー/ラウンドあたりの合計 | ~6.49 | ~0.11 |
平均的なユーザーは約 10.8k~22.6k VOT3 を保有し、1 ラウンドあたり約 90~190 B3TR を獲得します。 手数料 10% の場合、プールにはユーザー 1 人あたり約 9~19 B3TR が入ります。リレーのコストは約 0.11 B3TR です。利益幅はユーザー 1 人あたり約 8.9~18.9 B3TR です。
外部リソース
- ドキュメント:https://docs.vebetterdao.org/vebetter/automation
- ガバナンス提案:https://governance.vebetterdao.org/proposals/93450486232994296830196736391400835825360450263361422145364815974754963306849
- Discourse:https://vechain.discourse.group/t/vebetterdao-proposal-auto-voting-for-x-allocation-with-gasless-voting-and-relayer-rewards/559
- NPM:
@vechain/vebetterdao-contracts - コントラクトのソース:https://github.com/vechain/vebetterdao-contracts