本ドキュメントは、NewLo Point (NLP) トークンシステムの実運用における手順書です。ScenarioTest.t.solで検証されたシナリオに基づき、安全で効率的な運用のための詳細な手順を提供します。
graph TD
A[コントラクトデプロイ] --> B[初期Mint実行]
B --> C[配布システム準備]
C --> D[ホワイトリスト設定]
D --> E[配布実行]
E --> F[ユーザー利用開始]
F --> G[段階的転送開放]
G --> H[完全サービス化]
前提条件:
- 管理者ウォレットの準備
- 十分なガス代の確保
- デプロイ用環境変数の設定
手順:
# 1. 環境変数設定
export DEFAULT_ADMIN=0x... # 管理者アドレス
export PAUSER=0x... # 一時停止権限者
export MINTER=0x... # Mint権限者
# 2. デプロイ実行
forge script script/Deploy.s.sol --rpc-url $RPC_URL --broadcast --verify
# 3. デプロイ結果確認
forge verify-check --chain-id 1 [GUID]成功確認項目:
- ✅ NewLoPoint プロキシコントラクトの正常デプロイ
- ✅ 管理者ロールの正しい設定
- ✅ 初期状態(transfers disabled)の確認
// 管理者ロール確認
bool isAdmin = nlpToken.hasRole(nlpToken.DEFAULT_ADMIN_ROLE(), adminAddress);
// 初期状態確認
bool transfersEnabled = nlpToken.transfersEnabled(); // false
bool whitelistMode = nlpToken.whitelistModeEnabled(); // false
uint256 totalSupply = nlpToken.totalSupply(); // 0目的: サービスで配布する初期トークン供給量を確保
手順:
// 1. Minter権限で初期Mint実行
uint256 INITIAL_SUPPLY = 100_000_000 * 10**18; // 1億NLP
nlpToken.mint(adminAddress, INITIAL_SUPPLY);
// 2. Mint成功確認
uint256 adminBalance = nlpToken.balanceOf(adminAddress);
uint256 totalSupply = nlpToken.totalSupply();
assert(adminBalance == INITIAL_SUPPLY);
assert(totalSupply == INITIAL_SUPPLY);注意事項:
- Mint量は事業計画に基づいて設定
- 一度にMintする量はガス制限を考慮
- Mint履歴は必ずログに記録
// 1. 配布コントラクトデプロイ
TokenDistributionV2 distributionContract = new TokenDistributionV2(
address(nlpToken), // NLPトークンアドレス
distributionOwner // 配布管理者
);
// 2. デプロイ確認
address tokenAddress = distributionContract.nlpToken();
address owner = distributionContract.owner();// 1. 転送機能を有効化
nlpToken.setTransfersEnabled(true);
// 2. ホワイトリストモードを有効化
nlpToken.setWhitelistModeEnabled(true);
// 3. 配布コントラクトをホワイトリストに追加
nlpToken.setWhitelistedAddress(address(distributionContract), true);
// 4. 配布管理者をホワイトリストに追加
nlpToken.setWhitelistedAddress(distributionOwner, true);// 1. 配布管理者にトークンを転送
uint256 BULK_DEPOSIT_AMOUNT = 50_000_000 * 10**18; // 5000万NLP
nlpToken.transfer(distributionOwner, BULK_DEPOSIT_AMOUNT);
// 2. 配布コントラクトに預入
nlpToken.approve(address(distributionContract), BULK_DEPOSIT_AMOUNT);
distributionContract.depositTokens(BULK_DEPOSIT_AMOUNT);
// 3. 預入確認
uint256 contractBalance = nlpToken.balanceOf(address(distributionContract));
assert(contractBalance == BULK_DEPOSIT_AMOUNT);必須確認項目:
- ✅ ホワイトリストモードが有効
- ✅ 配布コントラクトがホワイトリストに登録済み
- ✅ 配布コントラクトに十分な残高がある
- ✅ 受信者アドレスの重複チェック完了
- ✅ ネットワーク混雑状況の確認
// セットアップ状況確認
(
bool isWhitelistModeEnabled,
bool isContractWhitelisted,
uint256 contractBalance,
bool canDistribute
) = distributionContract.checkSetupStatus();
require(canDistribute, "Distribution setup not ready");推奨バッチサイズ:
| ネットワーク状況 | 推奨ユーザー数 | 予想ガス使用量 | 備考 |
|---|---|---|---|
| 混雑時 | 50ユーザー | ~3.8M ガス | 最も安全 |
| 通常時 | 75ユーザー | ~5.6M ガス | バランス重視 |
| 空いている時 | 100ユーザー | ~7.5M ガス | 効率重視 |
// 1. 受信者アドレス配列の準備
address[] memory recipients = new address[](batchSize);
// ... recipients配列に受信者アドレスを設定 ...
// 2. 配布実行
uint256 DISTRIBUTION_AMOUNT = 1000 * 10**18; // 1,000 NLP per user
uint256 batchId = distributionContract.distributeEqual(recipients, DISTRIBUTION_AMOUNT);
// 3. 配布成功確認
for (uint i = 0; i < recipients.length; i++) {
uint256 balance = nlpToken.balanceOf(recipients[i]);
assert(balance >= DISTRIBUTION_AMOUNT);
}// 配布統計の確認
(
uint256 totalDistributed,
uint256 totalDistributions,
uint256 todayDistributed,
uint256 contractBalance,
bool isLowBalance,
bool isAntiDuplicateEnabled
) = distributionContract.getDistributionStats();
// ログ出力例
console.log("Batch ID:", batchId);
console.log("Recipients:", recipients.length);
console.log("Total distributed today:", todayDistributed);
console.log("Remaining balance:", contractBalance);特徴:
- ユーザー間転送は制限
- 承認されたアドレス(取引所等)のみ転送可能
- サービス内ポイントとして機能
管理操作:
// 重要パートナー(取引所等)をホワイトリストに追加
address[] memory partners = [exchange1, exchange2, marketplace];
nlpToken.setWhitelistedAddresses(partners, true);よくある問題と対応:
-
「転送ができない」
- 現在の転送設定を確認
- ホワイトリスト状況を説明
-
「残高が表示されない」
- ウォレットでのトークン追加方法を案内
- コントラクトアドレスを提供
-
「配布を受け取れない」
- アドレスの正確性を確認
- 重複配布防止機能の説明
事前準備:
- 取引所との技術的調整完了
- 流動性確保の準備
- 価格監視体制の構築
// 主要取引所をホワイトリストに追加
address[] memory exchanges = [binance, coinbase, kraken];
nlpToken.setWhitelistedAddresses(exchanges, true);実行手順:
// 1. 最終確認
require(nlpToken.whitelistModeEnabled(), "Already in whitelist mode");
require(exchangesReady, "Exchanges not ready");
// 2. 完全転送有効化
nlpToken.setTransfersEnabled(true);
nlpToken.setWhitelistModeEnabled(false); // 段階的解放の場合はオプション
// 3. 解放確認
bool transfersEnabled = nlpToken.transfersEnabled();
bool whitelistMode = nlpToken.whitelistModeEnabled();緊急停止が必要な状況:
- セキュリティ脆弱性の発見
- 不正な大量転送の検知
- システム障害の発生
// 1. 全機能の緊急停止
nlpToken.pause();
distributionContract.pause();
// 2. 状況確認
bool isPaused = nlpToken.paused();
bool isDistributionPaused = distributionContract.paused();
// 3. 関係者への通知
emit EmergencyPause(block.timestamp, reason);// 1. 問題解決の確認
require(issueResolved, "Issue not resolved");
// 2. 段階的復旧
nlpToken.unpause();
distributionContract.unpause();
// 3. 復旧確認
require(!nlpToken.paused(), "Token still paused");
require(!distributionContract.paused(), "Distribution still paused");トークンコントラクト:
- 総供給量の変化
- 大口転送の監視
- 異常なガス使用量
配布コントラクト:
- 残高の監視
- 配布頻度の監視
- 重複配布の検知
// 監視スクリプト例
const monitoringConfig = {
largeTransferThreshold: 1000000 * 10**18, // 100万NLP
lowBalanceThreshold: 1000000 * 10**18, // 残高100万NLP以下
dailyDistributionLimit: 10000000 * 10**18, // 日次配布上限1000万NLP
};- Level 1: 運用担当者
- Level 2: 技術責任者
- Level 3: 経営陣・法務
- セキュリティ監査会社
- ブロックチェーン専門法律事務所
- 主要取引所の技術窓口
# 残高確認
cast call $TOKEN_ADDRESS "balanceOf(address)(uint256)" $USER_ADDRESS
# 転送設定確認
cast call $TOKEN_ADDRESS "transfersEnabled()(bool)"
cast call $TOKEN_ADDRESS "whitelistModeEnabled()(bool)"
# 配布統計確認
cast call $DISTRIBUTION_ADDRESS "getDistributionStats()(uint256,uint256,uint256,uint256,bool,bool)"| 問題 | 原因 | 解決方法 |
|---|---|---|
| Mint失敗 | MINTER_ROLE不足 | ロール確認・付与 |
| 転送失敗 | ホワイトリスト未登録 | アドレス追加 |
| 配布失敗 | ガス不足 | バッチサイズ削減 |
作成日: 2024年12月 バージョン: 1.0 最終更新: ScenarioTest.t.sol v1.0 対応