Skip to content

領取與結算

領取必須憑驗證服務為通過 Gate 的參與者簽署的憑證。合約在放款前會在鏈上再驗一次。

憑證是 EIP-712ClaimAuth 結構的 typed-data 簽名。domain 把簽名綁定到特定獎池:

domain = {
name: "GatollRewardPool",
version: "1",
chainId,
verifyingContract: <pool address>
}
ClaimAuth = {
address poolAddress; // 目標獎池
address recipient; // 收款地址
uint256 amount; // 同質資產數量或 NFT 數量
uint256[] tokenIds; // NFT id(否則為空)
uint256 deadline; // 過期時間(unix 秒)
uint256 nonce; // 一次性,由驗證服務發放
}
  1. 參與者通過 Loot 的 Gate。
  2. 驗證服務為參與者錢包簽發 ClaimAuth,為該 (pool, recipient) 釘死一次性 nonce,設短 deadline,完成簽名。
  3. 有人向獎池提交 claim(auth, signature)——要嘛是收款人自己,要嘛(開啟免 Gas 時)是平台中繼
  4. 獎池驗證通過後,計算或讀取分配,並轉給 recipient

拼手氣均分 Loot 的憑證攜帶零分配,金額在領取時由合約計算;自訂 Loot 由驗證服務簽入確切金額或 token ID。

支援中繼的獎池會暴露 RELAY_ENABLED,並以 immutable 指向 RelayerRegistry。領取檢查為:

recipient == msg.sender || RelayerRegistry.isRelayer(msg.sender)
  • 自領 — 參與者自己付 Gas、自己送(永遠可用)。
  • 中繼 — registry 白名單內的 EOA 代送並代付 Gas;資金仍只轉到簽死的 recipient
  • 其他人 — revert。若完全開放提交,mempool 搶跑可能操弄拼手氣中簽額;registry 關掉這個向量,中繼金鑰外洩時也能立刻吊銷。

中繼金鑰就算外洩,最壞也只是花自己的 Gas、把合法獎勵送到合法收款人手上。沒有驗證服務的新簽名,就改不了 recipient。創作者以鏈下原生幣押金購買中繼名額;名額用完時產品降級為自領。

獎池在動帳前獨立檢查:

  • 簽名恢復的地址等於獎池快照的驗證者地址;
  • poolAddress 等於本獎池(不能跨池重用);
  • recipient 等於 caller, caller 是已登記的中繼;
  • deadline 未過期;
  • nonce 未使用;
  • 領取者尚未領過,且還有名額。

四重約束讓憑證不可重放:綁定單一獎池(domain + poolAddress)、單一領取者、一次性 nonce(使用後銷毀)、短 deadline。再加上合約強制每場 Loot 一個錢包只能領一次。憑證外洩或重用也無效——只能做驗證服務授權過的那一次。

這是 Gatoll 信任模型的核心:驗證服務決定資格,合約決定結算。即使驗證服務作惡,也無法讓獎池對同一地址付兩次,或付到錯誤的池。中繼只決定誰付 Gas,從不決定誰拿到錢