Skip to content

feat(frontend): ロールごとの分配係数(multiplier)をフロントエンドから入力できるようにする - #563

Merged
yu23ki14 merged 1 commit into
mainfrom
feat/role-multiplier-input
Aug 19, 2026
Merged

feat(frontend): ロールごとの分配係数(multiplier)をフロントエンドから入力できるようにする#563
yu23ki14 merged 1 commit into
mainfrom
feat/role-multiplier-input

Conversation

@takerunakao

Copy link
Copy Markdown
Collaborator

Closes #528

概要

分配ルール作成(splits)と予約分配作成(scheduled)で multiplier: 1 にハードコードされていたロールごとの分配係数を、UI から入力できるようにしました。

⚠️ Issue の前提と違った点(レビュー時に見てほしい箇所)

Issue には「送信パイプラインは既に係数に対応しているのでフロントの入力 UI を足すだけ」とありましたが、実際には SplitsCreator.sol:322roleMultiplier = multiplierTop / multiplierBottom と整数除算しているため、そのまま 1.53/2 として送ると 1 に切り捨てられて係数が効かず0.51/2)に至っては そのロールの全員の取り分が 0 になります

コントラクトは変更せずに解決しています。ロール配分は最後に roleTotalAllocation で正規化される(SplitsCreator.sol:212)ため、アクティブなロール全体を同じ定数倍しても結果は変わりません。この性質を使い、係数を一括で共通分母に載せた整数比として送るようにしました。

入力 送信される top/bottom
1.5, 1 3/1, 2/1
0.5, 1 1/1, 2/1
1.25, 0.5, 3 5/1, 2/1, 12/1
1.5(単独ロール) 1/1(単独では係数は比率として意味を持たないため)

比率は厳密に保たれ、小数係数・1 未満の係数も正しく分配に反映されます。

変更内容

  • pkgs/frontend/utils/multiplier.ts(新規) — 係数のパース / 検証 / 一括パック。文字列の桁を直接扱うので 1.15 * 100 = 114.99… のような浮動小数の破綻がありません。0・負数・非数・小数第 3 位以上は無効。最後に GCD で約分し、オンチェーンの整数を小さく保ちます。
  • app/components/splits/RoleMultiplierField.tsx(新規) — 両画面共通の「分配係数 [ 1 ] 倍」入力。FieldLabel + Input + Typography で構成し、不正時は aria-invalid とエラーメッセージを表示します。
  • $treeId_.splits.new.tsxRoleInput.multiplier を生入力の string に変更、updateMultiplier を追加、選択中のロール行の下に入力欄を表示。isFormValid に係数バリデーションを追加(不正な間は「プレビューを見る」を押せない)。プレビュー画面の「対象にした当番」に (1.5倍) を併記。
  • $treeId_.scheduled.new.tsx — 同じ入力欄を追加し、submitCreate で一括パックして multiplierTops / multiplierBottoms に反映。不正な値は toast で中断。

受け入れ条件

  • splits 作成画面でロールごとに係数を入力でき、プレビュー・作成結果に反映される
  • scheduled 作成画面でロールごとに係数を入力でき、multiplierTops/multiplierBottoms に反映されて送信される
  • 小数係数(例: 1.5)が正しく分配比率に反映される(※ 上記のとおり「素直な top/bottom 分解」ではなく共通分母スケーリングで実現)
  • pnpm frontend typecheck が通る

検証

  • pnpm frontend typecheck / pnpm frontend build / biome check すべて通過
  • パック処理を実データで確認(上表のケース、および "".0-11.2341e3 が無効判定になること)
  • ブラウザでの目視確認はワークスペース + ウォレット接続が必要なため未実施です

🤖 Generated with Claude Code

splits / scheduled の作成フローで multiplier が 1 固定だったため、両画面の
対象ロール行に「分配係数」入力欄を追加した。

係数は SplitsCreator が multiplierTop / multiplierBottom を整数除算して
評価する (SplitsCreator.sol:322) ため、1.5 を 3/2 として送ると 1 に切り捨て
られ、0.5 に至ってはロール全員の取り分が 0 になる。ロール配分は最後に
roleTotalAllocation で正規化される (SplitsCreator.sol:212) ので、アクティブな
ロール全体を同じ定数倍しても結果は変わらない。この性質を使い、係数を一括で
共通分母に載せた整数比として送ることで、コントラクトを変更せずに小数係数と
1 未満の係数を正しく反映させている (1.5, 1 → 3/1, 2/1)。

- utils/multiplier.ts: 入力のパース・検証・一括パック(文字列の桁を直接
  扱い浮動小数誤差を回避、最後に GCD で約分)
- components/splits/RoleMultiplierField.tsx: 両画面共通の係数入力欄
- splits: 不正な係数はプレビュー・作成をブロックし、プレビュー画面の対象
  当番一覧に係数を併記
- scheduled: 送信時に一括パックして multiplierTops / multiplierBottoms に反映

Closes #528

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
toban Ready Ready Preview Aug 10, 2026 2:06pm

Request Review

@yu23ki14
yu23ki14 merged commit e097539 into main Aug 19, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

フロントエンドからロールごとの分配係数(multiplier)を入力できるようにする(splits / scheduled)

2 participants