V2 Locker
V2 Locker は、設定済みの BDEX V2 Factory が作成した ERC20 LP トークンを保管します。ETERNAL_LOCK は type(uint256).max です。永久ロックは引き出しや期間短縮ができませんが、数量の追加、分割、移転は可能です。
書き込み関数
lockLPToken
function lockLPToken(
address _lpToken,
uint256 _amount,
uint256 _unlock_date,
address payable _referral,
bool _fee_in_eth,
address payable _withdrawer,
uint16 _countryCode
) external payable
呼び出し元から LP を転送し、現在の手数料を差し引いてロックを作成します。
| 名前 | 型 | 説明 |
|---|---|---|
_lpToken | address | BDEX V2 ペアトークン。 |
_amount | uint256 | 手数料控除前に転送する LP 数量。 |
_unlock_date | uint256 | 秒単位の Unix タイムスタンプ、または ETERNAL_LOCK。 |
_referral | address payable | 条件を満たす紹介者、またはゼロアドレス。 |
_fee_in_eth | bool | true は固定手数料をネイティブトークンで、false はセカンダリトークンで支払います。 |
_withdrawer | address payable | 初期ロック Owner。 |
_countryCode | uint16 | COUNTRY_LIST が受け付けるコード。 |
アクセス / payable: 任意の呼び出し元;payable;nonReentrant。
_amount は 0 より大きい必要があります。ETERNAL_LOCK を除き、解除日時は将来かつ 10_000_000_000 未満でなければなりません。国・地域と Factory ペアも有効である必要があります。呼び出し元は LP allowance を設定し、セカンダリトークン払いではその allowance も設定します。許可リスト外のネイティブ手数料支払者は計算額と完全に一致する金額を送信します。コントラクトはゼロの _withdrawer を受け付けるため、クライアント側で拒否してください。amount と initialAmount には LP 手数料控除後の数量が保存されます。その後 NONCE を増加し、onNewLock を発行します。
relock
function relock(uint256 _lockID, uint256 _unlock_date) external
ロック期間を延長するか、永久ロックに変換します。
| 名前 | 型 | 説明 |
|---|---|---|
_lockID | uint256 | 延長するロック。 |
_unlock_date | uint256 | 秒単位の新しい時刻、または ETERNAL_LOCK。 |
アクセス / payable: ロック Owner のみ;nonpayable;nonReentrant。
新しい値は現在の unlockDate より大きく、秒形式チェックを通る必要があります。コントラクトは block.timestamp を超えることを別途要求しないため、クライアントは _unlock_date > max(current unlockDate, current block time) を要求してください。残り全量から現在の LP 手数料を差し引き、onRelock を発行します。最小受取量パラメーターはありません。
withdraw
function withdraw(uint256 _lockID, uint256 _amount) external
期限切れの時限ロックから一部または全部を引き出します。
| 名前 | 型 | 説明 |
|---|---|---|
_lockID | uint256 | 元ロック。 |
_amount | uint256 | 引き出す数量。type(uint256).max は残り全 LP を表します。 |
アクセス / payable: ロック Owner のみ;nonpayable;nonReentrant。
数量は 0 より大きく、ロックは永久ロック以外で、unlockDate < block.timestamp を満たす必要があります。全額引き出しでは Owner の有効インデックスから ID が削除されますが、amount が 0 の履歴 LOCKS レコードは残ります。onWithdraw を発行します。
incrementLock
function incrementLock(uint256 _lockID, uint256 _amount) external
既存ロックに LP を追加します。
| 名前 | 型 | 説明 |
|---|---|---|
_lockID | uint256 | 追加先ロック。 |
_amount | uint256 | 手数料控除前の LP 数量。 |
アクセス / payable: 任意の呼び出し元;nonpayable;nonReentrant。
この関数は意図的に Owner を確認しません。追加された LP は既存ロック Owner のものになります。数量は 0 より大きく承認済みである必要があります。クライアントは LOCKS(_lockID).lpToken != address(0) を検証してください。現在の LP 手数料控除後の純額は amount に加算され、initialAmount には加算されません。onIncrementLock を発行します。
splitLock
function splitLock(uint256 _lockID, uint256 _amount) external payable
ロックの一部を、同じ Owner と条件を持つ新しいロックへ移します。
| 名前 | 型 | 説明 |
|---|---|---|
_lockID | uint256 | 元ロック。 |
_amount | uint256 | 子ロックへ割り当てる数量。 |
アクセス / payable: ロック Owner のみ;payable;nonReentrant。
数量は 0 より大きく、元残高以下である必要があります。許可リスト登録済みアカウントでも msg.value は gFees.ethFee と一致しなければなりません。子ロックは lpToken、lockDate、unlockDate、Owner、国・地域コードを継承し、amount と initialAmount は _amount になります。onSplitLock と onNewLock を発行します。
transferLockOwnership
function transferLockOwnership(
uint256 _lockID,
address payable _newOwner
) external
ロックと有効インデックスを即時移転します。
| 名前 | 型 | 説明 |
|---|---|---|
_lockID | uint256 | 移転するロック。 |
_newOwner | address payable | 新しい Owner。 |
アクセス / payable: ロック Owner のみ;nonpayable。
新 Owner は呼び出し元と異なる必要があります。承認呼び出しのない 1 段階移転です。コントラクトはゼロアドレスを受け付けるため、クライアント側で拒否してください。onTransferLockOwnership を発行します。
読み取り関数
LOCKS
function LOCKS(uint256 _lockID) external view returns (
address lpToken,
uint256 lockDate,
uint256 amount,
uint256 initialAmount,
uint256 unlockDate,
uint256 lockID,
address owner,
uint16 countryCode
)
ロックの public mapping Getter です。amount は残り LP、initialAmount は作成時の純額です。未知の ID はゼロ値を返します。
TOKEN_LOCKS
function TOKEN_LOCKS(address lpToken, uint256 index)
external view returns (uint256 lockID)
LP トークンの index にある履歴ロック ID を返します。
トークン列挙
function getNumLocksForToken(address _lpToken)
external view returns (uint256);
function getNumLockedTokens() external view returns (uint256);
function getLockedTokenAtIndex(uint256 _index)
external view returns (address);
_lpToken は履歴ロック数を調べる LP トークンです。_index は 0 始まりのグローバルインデックスで、範囲外では revert します。グローバルトークン集合は削除されず、TOKEN_LOCKS は履歴 ID を含みます。
ユーザー列挙
function getUserNumLockedTokens(address _user)
external view returns (uint256);
function getUserLockedTokenAtIndex(address _user, uint256 _index)
external view returns (address);
function getUserNumLocksForToken(address _user, address _lpToken)
external view returns (uint256);
function getUserLockForTokenAtIndex(
address _user,
address _lpToken,
uint256 _index
) external view returns (TokenLock memory);
これらは有効トークン集合数、インデックスのトークン、特定トークンの有効ロック数、完全なロックを返します。全額引き出し済みロックは削除されます。インデックスは 0 始まりで、範囲外では revert します。
手数料許可リスト照会
function getWhitelistedUsersLength() external view returns (uint256);
function getWhitelistedUserAtIndex(uint256 _index)
external view returns (address);
function getUserWhitelistStatus(address _user)
external view returns (bool);
許可リスト長、インデックスのアドレス、登録状態を返します。無効なインデックスは revert します。
公開設定 Getter
function NONCE() external view returns (uint256);
function ETERNAL_LOCK() external view returns (uint256);
function uniswapFactory() external view returns (address);
function COUNTRY_LIST() external view returns (address);
function owner() external view returns (address);
function gFees() external view returns (
uint256 ethFee,
address secondaryFeeToken,
uint256 secondaryTokenFee,
uint256 secondaryTokenDiscount,
uint256 liquidityFee,
uint256 referralPercent,
address referralToken,
uint256 referralHold,
uint256 referralDiscount
);
NONCE は次のロック ID であり、有効ロック数ではありません。割合フィールドの分母は 1000(10 = 1%)です。手数料は即時変更できるため、書き込みトランザクション送信直前に再取得してシミュレーションしてください。
イベント
onNewLock
event onNewLock(uint256 lockID, address lpToken, address owner, uint256 amount, uint256 lockDate, uint256 unlockDate, uint16 countryCode);
lockLPToken と splitLock の子ロック作成時に発行されます。
| パラメータ | 説明 |
|---|---|
lockID | 新しいロック ID。 |
lpToken | ロックされたペアトークン。 |
owner | ロック Owner。 |
amount | 保存された純数量。 |
lockDate | 作成タイムスタンプ。 |
unlockDate | 解除タイムスタンプまたは ETERNAL_LOCK。 |
countryCode | 検証済みの国・地域コード。 |
onRelock
event onRelock(uint256 lockID, address lpToken, address owner, uint256 amountRemainingInLock, uint256 liquidityFee, uint256 unlockDate);
ロックの延長と手数料控除後に発行されます。
| パラメータ | 説明 |
|---|---|
lockID | 延長されたロック。 |
lpToken | ペアトークン。 |
owner | ロック Owner。 |
amountRemainingInLock | 純残高。 |
liquidityFee | 控除された LP 手数料。 |
unlockDate | 新しい解除時刻。 |
onWithdraw
event onWithdraw(uint256 lockID, address lpToken, address owner, uint256 amountRemainingInLock, uint256 amountRemoved);
一部または全額引き出し後に発行されます。
| パラメータ | 説明 |
|---|---|
lockID | 引き出されたロック。 |
lpToken | ペアトークン。 |
owner | Owner 兼受取人。 |
amountRemainingInLock | 残りの LP 数量。 |
amountRemoved | 転送された LP 数量。 |
onIncrementLock
event onIncrementLock(uint256 lockID, address lpToken, address owner, address payer, uint256 amountRemainingInLock, uint256 amountAdded, uint256 liquidityFee);
ロックへの LP 追加時に発行されます。
| パラメータ | 説明 |
|---|---|
lockID | 数量が追加されたロック。 |
lpToken | ペアトークン。 |
owner | 受益 Owner。 |
payer | LP 提供者。 |
amountRemainingInLock | 新しい残高合計。 |
amountAdded | 追加された純 LP 数量。 |
liquidityFee | 控除された LP 手数料。 |
onSplitLock
event onSplitLock(uint256 lockID, address lpToken, address owner, uint256 amountRemainingInLock, uint256 amountRemoved);
子ロック作成時に元ロックに対して発行されます。
| パラメータ | 説明 |
|---|---|
lockID | 元ロック。 |
lpToken | ペアトークン。 |
owner | 両ロックの Owner。 |
amountRemainingInLock | 分割後の元ロック数量。 |
amountRemoved | 子ロック数量。 |
onTransferLockOwnership
event onTransferLockOwnership(uint256 lockID, address lpToken, address oldOwner, address newOwner);
1 段階所有権移転の完了時に発行されます。
| パラメータ | 説明 |
|---|---|
lockID | 移転されたロック。 |
lpToken | ペアトークン。 |
oldOwner | 旧 Owner。 |
newOwner | 新 Owner。 |
エラー
V2 Locker の主要な revert を以下に示します。文字列は完全一致で扱ってください。コントラクトでは ZERO WITHDRAWL という綴りが使われています。
| Error / Revert | 関連関数 | 条件 |
|---|---|---|
TIMESTAMP INVALID | lockLPToken, relock | 通常の解除時刻が 10_000_000_000 以上。多くはミリ秒の誤入力です。 |
DATE PASSED | lockLPToken | 通常の解除時刻が現在より後ではありません。 |
INSUFFICIENT | lockLPToken | _amount == 0。 |
COUNTRY | lockLPToken | _countryCode が COUNTRY_LIST 検証に失敗。 |
NOT UNIV2 | lockLPToken | _lpToken が設定済み BDEX V2 Factory のペアではありません。 |
INADEQUATE BALANCE | lockLPToken | 紹介者が referralHold 要件を満たしません。 |
FEE NOT MET | lockLPToken, splitLock | msg.value が必要なネイティブ手数料と完全一致しません。 |
NOT OWNER | relock、withdraw、splitLock、transferLockOwnership | 呼び出し元がロック Owner ではありません。 |
UNLOCK BEFORE | relock | 新しい時刻が現在の unlockDate より厳密に大きくありません。 |
ZERO WITHDRAWL | withdraw | _amount == 0 または算出された引き出し量が 0。 |
ETERNAL_LOCK | withdraw | 永久ロックを引き出そうとしています。 |
NOT YET | withdraw | 時限ロックが期限前です。 |
ZERO AMOUNT | incrementLock, splitLock | 追加または分割量が 0。 |
OWNER | transferLockOwnership | _newOwner が呼び出し元と同じです。 |
TransferHelper: APPROVE_FAILED | トークン承認 | approve が失敗または false を返します。 |
TransferHelper: TRANSFER_FAILED | トークン転送 | transfer が失敗または false を返します。 |
TransferHelper: TRANSFER_FROM_FAILED | lockLPToken, incrementLock | 残高・allowance 不足、または transferFrom 失敗。 |
Panic(0x11) | withdraw、splitLock などの数量演算 | 要求量が残高を超えるか、手数料計算で underflow/overflow が発生します。 |
管理関数とリエントランシー保護は、継承した次のエラーも返す場合があります。
| Error / Revert | 条件 |
|---|---|
Ownable: caller is not the owner | Owner 以外が管理関数を呼び出します。 |
ReentrancyGuard: reentrant call | nonReentrant 関数へ再入します。 |
Factory、LP トークン、紹介トークン、手数料トークンの revert は変更されず伝播します。フロントエンドは元の revert data を保持してください。