メインコンテンツまでスキップ

V2 Locker

V2 Locker は、設定済みの BDEX V2 Factory が作成した ERC20 LP トークンを保管します。ETERNAL_LOCKtype(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 を転送し、現在の手数料を差し引いてロックを作成します。

名前説明
_lpTokenaddressBDEX V2 ペアトークン。
_amountuint256手数料控除前に転送する LP 数量。
_unlock_dateuint256秒単位の Unix タイムスタンプ、または ETERNAL_LOCK
_referraladdress payable条件を満たす紹介者、またはゼロアドレス。
_fee_in_ethbooltrue は固定手数料をネイティブトークンで、false はセカンダリトークンで支払います。
_withdraweraddress payable初期ロック Owner。
_countryCodeuint16COUNTRY_LIST が受け付けるコード。

アクセス / payable: 任意の呼び出し元;payable;nonReentrant。

_amount は 0 より大きい必要があります。ETERNAL_LOCK を除き、解除日時は将来かつ 10_000_000_000 未満でなければなりません。国・地域と Factory ペアも有効である必要があります。呼び出し元は LP allowance を設定し、セカンダリトークン払いではその allowance も設定します。許可リスト外のネイティブ手数料支払者は計算額と完全に一致する金額を送信します。コントラクトはゼロの _withdrawer を受け付けるため、クライアント側で拒否してください。amountinitialAmount には LP 手数料控除後の数量が保存されます。その後 NONCE を増加し、onNewLock を発行します。

relock

function relock(uint256 _lockID, uint256 _unlock_date) external

ロック期間を延長するか、永久ロックに変換します。

名前説明
_lockIDuint256延長するロック。
_unlock_dateuint256秒単位の新しい時刻、または 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

期限切れの時限ロックから一部または全部を引き出します。

名前説明
_lockIDuint256元ロック。
_amountuint256引き出す数量。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 を追加します。

名前説明
_lockIDuint256追加先ロック。
_amountuint256手数料控除前の 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 と条件を持つ新しいロックへ移します。

名前説明
_lockIDuint256元ロック。
_amountuint256子ロックへ割り当てる数量。

アクセス / payable: ロック Owner のみ;payable;nonReentrant。

数量は 0 より大きく、元残高以下である必要があります。許可リスト登録済みアカウントでも msg.valuegFees.ethFee と一致しなければなりません。子ロックは lpTokenlockDateunlockDate、Owner、国・地域コードを継承し、amountinitialAmount_amount になります。onSplitLockonNewLock を発行します。

transferLockOwnership

function transferLockOwnership(
uint256 _lockID,
address payable _newOwner
) external

ロックと有効インデックスを即時移転します。

名前説明
_lockIDuint256移転するロック。
_newOwneraddress 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 であり、有効ロック数ではありません。割合フィールドの分母は 100010 = 1%)です。手数料は即時変更できるため、書き込みトランザクション送信直前に再取得してシミュレーションしてください。

イベント

onNewLock

event onNewLock(uint256 lockID, address lpToken, address owner, uint256 amount, uint256 lockDate, uint256 unlockDate, uint16 countryCode);

lockLPTokensplitLock の子ロック作成時に発行されます。

パラメータ説明
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ペアトークン。
ownerOwner 兼受取人。
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。
payerLP 提供者。
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 INVALIDlockLPToken, relock通常の解除時刻が 10_000_000_000 以上。多くはミリ秒の誤入力です。
DATE PASSEDlockLPToken通常の解除時刻が現在より後ではありません。
INSUFFICIENTlockLPToken_amount == 0
COUNTRYlockLPToken_countryCodeCOUNTRY_LIST 検証に失敗。
NOT UNIV2lockLPToken_lpToken が設定済み BDEX V2 Factory のペアではありません。
INADEQUATE BALANCElockLPToken紹介者が referralHold 要件を満たしません。
FEE NOT METlockLPToken, splitLockmsg.value が必要なネイティブ手数料と完全一致しません。
NOT OWNERrelockwithdrawsplitLocktransferLockOwnership呼び出し元がロック Owner ではありません。
UNLOCK BEFORErelock新しい時刻が現在の unlockDate より厳密に大きくありません。
ZERO WITHDRAWLwithdraw_amount == 0 または算出された引き出し量が 0。
ETERNAL_LOCKwithdraw永久ロックを引き出そうとしています。
NOT YETwithdraw時限ロックが期限前です。
ZERO AMOUNTincrementLock, splitLock追加または分割量が 0。
OWNERtransferLockOwnership_newOwner が呼び出し元と同じです。
TransferHelper: APPROVE_FAILEDトークン承認approve が失敗または false を返します。
TransferHelper: TRANSFER_FAILEDトークン転送transfer が失敗または false を返します。
TransferHelper: TRANSFER_FROM_FAILEDlockLPToken, incrementLock残高・allowance 不足、または transferFrom 失敗。
Panic(0x11)withdrawsplitLock などの数量演算要求量が残高を超えるか、手数料計算で underflow/overflow が発生します。

管理関数とリエントランシー保護は、継承した次のエラーも返す場合があります。

Error / Revert条件
Ownable: caller is not the ownerOwner 以外が管理関数を呼び出します。
ReentrancyGuard: reentrant callnonReentrant 関数へ再入します。

Factory、LP トークン、紹介トークン、手数料トークンの revert は変更されず伝播します。フロントエンドは元の revert data を保持してください。