NLPToJPYCExchangeAdapterは、Soneium上のNewLo Point (NLP) トークンとPolygon上のJPYC (Japanese Yen Coin) のクロスチェーン交換を可能にする、バックエンド制御型のエスクローコントラクトです。
- クロスチェーン対応: Soneium ↔ Polygon間のトークン交換
- バックエンド制御: すべての操作はOPERATOR_ROLEによって実行
- ガスレストランザクション: EIP-2612 permitによる署名ベースの承認
- 手数料システム: 交換手数料とオペレーション手数料の柔軟な設定
- セキュリティ重視: ReentrancyGuard、Pausable、AccessControl実装
- エスクロー追跡: ユーザーごとのエスクロー残高管理
┌─────────────────────────────────────────────────────────────────┐
│ 1. User Signs Permit │
│ (Frontend Only) │
└───────────────────────┬─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 2. Backend Executes exchangeNLPWithPermit │
│ (Soneium - OPERATOR_ROLE) │
│ Escrow NLP │
└───────────────────────┬─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 3. Backend Sends JPYC to User │
│ (Polygon - Off-chain) │
└───────────────────────┬─────────────────────────────────────────┘
│
┌───────────┴───────────┐
│ │
▼ ▼
┌───────────────────┐ ┌───────────────────────┐
│ 4a. SUCCESS │ │ 4b. FAILURE │
│ │ │ │
│ burnEscrowedNLP │ │ transferEscrowedNLP │
│ (Soneium - Burn) │ │ (Soneium - Refund) │
└───────────────────┘ └───────────────────────┘
NLPToJPYCExchangeAdapter
├── AccessControl (ロールベースアクセス制御)
│ ├── OPERATOR_ROLE (バックエンド操作)
│ ├── CONFIG_ROLE (設定変更)
│ └── PAUSER_ROLE (緊急停止)
├── ReentrancyGuard (リエントランシー攻撃防止)
├── Pausable (緊急停止機能)
└── Core Functions
├── exchangeNLPWithPermit (エスクロー預け入れ)
├── burnEscrowedNLP (エスクロー焼却)
├── transferEscrowedNLP (エスクロー返金・転送)
└── Configuration (設定変更)
function exchangeNLPWithPermit(
TokenType tokenType,
uint nlpAmount,
uint deadline,
uint8 v,
bytes32 r,
bytes32 s,
address user
) external nonReentrant whenNotPaused onlyRole(OPERATOR_ROLE)用途: ユーザーのpermit署名を使用してNLPをエスクロー
パラメータ:
tokenType: トークンタイプ (JPYCのみサポート)nlpAmount: エスクローするNLP量deadline: permit署名の有効期限v, r, s: ECDSA署名パラメータuser: ユーザーアドレス (トークン所有者)
フロー:
- フロントエンドでユーザーがpermit署名を生成
- バックエンドがこの関数を呼び出し (tokenTypeはJPYCを指定)
- NLPがコントラクトにエスクロー
function burnEscrowedNLP(
address user,
uint nlpAmount,
string calldata reason
) external nonReentrant whenNotPaused onlyRole(OPERATOR_ROLE)用途: JPYC付与成功後、エスクローされたNLPを焼却
function transferEscrowedNLP(
address from,
address to,
uint nlpAmount,
string calldata reason
) external nonReentrant whenNotPaused onlyRole(OPERATOR_ROLE)用途: JPYC付与失敗時の返金、または他のアドレスへの転送
function getExchangeQuote(TokenType tokenType, uint nlpAmount)
external
view
returns (
uint jpycAmount,
uint rate,
uint denominator,
uint exchangeFee,
uint operationalFee
)用途: フロントエンドで手数料込みの交換見積もりを表示
// 交換手数料: 0-10000 (0%-100%)
function updateExchangeFeeRate(uint newFeeRate) external
// オペレーション手数料: 0-10000 (0%-100%)
function updateOperationalFeeRate(uint newFeeRate) external// NLP to JPYC レート: 100 = 1:1
function updateNLPToJPYCRate(uint newRate) external
// 最小預け入れ額
function updateMinDepositAmount(uint newAmount) externalstruct UserEscrow {
uint totalDeposited; // 累積預け入れ額
uint totalBurned; // 累積焼却額
uint currentBalance; // 現在のエスクロー残高
uint depositCount; // 預け入れ回数
uint lastDepositTime; // 最終預け入れ時刻
}UserEscrow memory escrow = adapter.getUserEscrow(userAddress);✅ ReentrancyGuard: リエントランシー攻撃防止 ✅ Pausable: 緊急停止機能 ✅ AccessControl: ロールベースアクセス制御 ✅ Input Validation: ゼロアドレス・ゼロ金額チェック ✅ CEI Pattern: Checks-Effects-Interactions パターン ✅ Safe Math: Solidity 0.8.27のオーバーフロー保護
- 日付: 2025-01-13
- 結果: ✅ 合格
- 重大な脆弱性: なし
- 検出結果: すべて誤検知または情報提供のみ
event GaslessDepositExecuted(
address indexed user,
address indexed operator,
uint nlpAmount,
uint jpycEquivalent
);event EscrowedNLPBurned(
address indexed user,
address indexed operator,
uint nlpAmount,
uint jpycEquivalent,
string reason
);event EscrowedNLPTransferred(
address indexed from,
address indexed to,
address indexed operator,
uint nlpAmount,
string reason
);constructor(
address _nlpToken, // SoneiumのNLPトークンアドレス
address _defaultAdmin, // デフォルト管理者
uint _exchangeFeeRate, // 交換手数料 (0-10000)
uint _operationalFeeRate // オペレーション手数料 (0-10000)
)# Soneium Mainnet
forge script script/DeployJPYCExchangeAdapter.s.sol:DeployJPYCExchangeAdapter \
--rpc-url $SONEIUM_RPC_URL \
--broadcast \
--verify
# Soneium Minato Testnet
forge script script/DeployJPYCExchangeAdapter.s.sol:DeployJPYCExchangeAdapterSoneium \
--rpc-url $SONEIUM_MINATO_RPC_URL \
--broadcast \
--verifySONEIUM_ADMIN=0x... # 管理者アドレス
SONEIUM_OPERATOR=0x... # オペレーターアドレス
SONEIUM_NLP_TOKEN=0x... # NLPトークンアドレス(Soneium)
INITIAL_NLP_TO_JPYC_RATE=100 # 初期レート(100 = 1:1)
MIN_DEPOSIT_AMOUNT=1000000000000000000 # 最小預け入れ額(1 NLP)# NLPToJPYCExchangeAdapterのテストのみ
forge test --match-path test/NLPToJPYCExchangeAdapter.t.sol -vv
# すべてのテスト
forge test- テスト数: 39
- 合格率: 100%
- カバレッジ:
- ✅ 初期化とデプロイメント
- ✅ Permit預け入れ(正常系・異常系)
- ✅ エスクロー焼却(正常系・異常系)
- ✅ エスクロー転送・返金(正常系・異常系)
- ✅ 設定変更(レート、手数料、最小額)
- ✅ アクセス制御
- ✅ Pause機能
uncheckedブロックの使用(オーバーフロー保護が不要な箇所)- 状態変数の効率的な配置
- イベントの最適化
❌ ユーザーは直接コントラクトを呼び出せません
- すべての操作はOPERATOR_ROLE(バックエンド)が実行
- ユーザーはフロントエンドでpermit署名を生成するのみ
- このコントラクトはSoneium上のNLPエスクローのみを管理
- JPYC送金はPolygon上でバックエンドが別途実行
バックエンドは以下を実行する必要があります:
- ユーザーのpermit署名を受け取る
- Soneium上で
exchangeNLPWithPermitを呼び出し (tokenTypeはJPYCを指定) - Polygon上でJPYCを送金
- 成功時: Soneium上で
burnEscrowedNLPを呼び出し - 失敗時: Soneium上で
transferEscrowedNLPを呼び出し(返金)
問題や質問がある場合は、GitHubのIssueを作成してください。
最終更新日: 2025-01-13 バージョン: 1.0.0 Solidity: ^0.8.27 ライセンス: MIT