領取與結算
領取必須憑驗證服務為通過 Gate 的參與者簽署的憑證。合約在放款前會在鏈上再驗一次。
EIP-712 憑證
Section titled “EIP-712 憑證”憑證是 EIP-712 對 ClaimAuth 結構的 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; // 一次性,由驗證服務發放}- 參與者通過 Loot 的 Gate。
- 驗證服務為參與者錢包簽發
ClaimAuth,為該(pool, recipient)釘死一次性nonce,設短deadline,完成簽名。 - 有人向獎池提交
claim(auth, signature)——要嘛是收款人自己,要嘛(開啟免 Gas 時)是平台中繼。 - 獎池驗證通過後,計算或讀取分配,並轉給
recipient。
拼手氣和均分 Loot 的憑證攜帶零分配,金額在領取時由合約計算;自訂 Loot 由驗證服務簽入確切金額或 token ID。
免 Gas 中繼路徑
Section titled “免 Gas 中繼路徑”支援中繼的獎池會暴露 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,從不決定誰拿到錢。