# [TEM] 去中心化領稿費機制實驗 1
###### tags: `TEM`
[ToC]
---
## 🧙♂️ 1. 申請人
:::info
Johnson
:::
## ⛲️ 2. 申請贊助之公共財
去中心化領稿費機制實驗
### 📣 2.1 Introduction
目前的 TEM Medium 稿費領取機制為中心化,文章在 Telegram Reviewer 群組裡審完後由各自審稿人給出稿費金額並取平均,接著由稿費發放者手動在鏈上轉稿費至文章作者的地址。這個 Grant 想要藉著這個機會實驗新技術(AA、zkEmail、TLSNotary 等),嘗試在生活中的例子用上這些技術,而 TEM Medium 的稿費領取機制剛好適合作為實驗對象。希望能透過這些技術的結合,在不影響審稿人與投稿人的使用體驗前提下,讓稿費領取機制能更去中心化。
### 🎯 2.2 Objectives
這個實驗性的 Grant 希望能做出一個去中心化的稿費發放系統:
1. 稿費會直接打進鏈上合約
2. 審稿人可以各自直接到鏈上合約給出稿費金額,合約會取平均
3. 在稿費決定後,作者可以直接到鏈上領取稿費
這個系統會透過抽象帳戶讓審稿人及文章作者用簽名的方式就可以完成操作,在這個基礎之上可考慮加上審稿人隱私保護,以及用 TLSNotary 取代 Oracle。
### 📕 2.3 Plan
這個 Grant 會需要
- 一個合約實作整個稿費計算及領取的流程,以及提供抽象帳戶的功能
- 一個前端讓審稿人能給出稿費金額、讓文章作者能領取稿費
- 最終還需要包含輸出一篇文章分享技術與開發過程給社群。
這個版本的審稿人地址及給的稿費金額會是公開的,另外依然需要一個 Oracle 來作證「文章 <-> 作者的鏈上地址」這件事。
#### 延伸(不包含在這個 Grant 之中)
- 如果要提供審稿人隱私保護,會需要零知識證明讓審稿人能隱藏身份。
- 如果要拿掉 Oracle,則可以採用兩種方式:
1. 透過 zkEmail 讓文章作者能自己產生「我收到 TEM 來信認證我的文章和地址的信件」的證明
- 這會需要 TEM 回信包含文章名稱及作者地址
2. 透過 TLSNotary 讓文章作者能自己產生「我是這篇文章作者」的證明
## 💰 3. 申請贊助金額
USD$ 2000
## 📝 4. 補充
### Spec
#### 1. 系統組成
- 鏈上合約(暫稱為 `RoyaltyAutoClaim`)、前端
- `RoyaltyAutoClaim` 合約:管理稿費批准與發放
- 前端:讓以下角色能透過前端和 `RoyaltyAutoClaim` 合約互動
- 參與角色:Admin、Reviewer、投稿人
- Admin:負責登記投稿題目、登記每篇投稿的投稿人地址
- Reviewer:負責給予投稿文章一個稿費金額
- 投稿人:在稿費金額決定後領取稿費
#### 2. 執行流程
##### a. 初始化
- Admin 將手續費與稿費轉給 `RoyaltyAutoClaim` 合約
- Admin 註冊 Reviewer 們的地址
##### b. 登記投稿與投稿人地址
Admin 將新投稿的文章的題目及投稿人地址登記至 `RoyaltyAutoClaim` 合約
##### c. Review 並決定稿費金額
(至少兩位)Reviewer 決定一篇投稿的稿費。稿費有四個等級,最終稿費取所有 Reviewer 的稿費平均。稿費等級:
1. 20
2. 40
3. 60
4. 80
##### d. 領取稿費
投稿人到 `RoyaltyAutoClaim` 合約領取稿費
#### 3. `RoyaltyAutoClaim` 合約
- 這是一個支援 4337 標準的 AA 合約,所以它會有 `validateUserOp` 函式
- 所有角色的操作都會以 4337 交易形式來發起並執行
- 禁止使用 Paymaster,完全以合約身上的 ETH 支付手續費
- 檢查手續費最多不能超過 X ETH(X 的值待定)
- 這會是一個採用 UUPS 標準的可升級合約,由一個 Owner 控制升級
一篇投稿會有三種狀態:
1. 未登記(`NotExist`)
2. 已登記(`Registered`)
3. 已領取(`Claimed`)
`function inititlaize(address owner, address admin, address token, address[] reviewers)`
- `token` 為稿費幣種的代幣地址
`function updateReviewers(address[] reviewers, bool[] status)`
- 驗證 Admin 簽章
- `status=true` 表示註冊 Reivewer;`false` 表示註銷 Reviewer
`function registerSubmission(string title, address royaltyRecipient)`
- 驗證 Admin 簽章
- 將投稿狀態更新為 `Registered`
`function reviewSubmission(string title, RoyaltyLevel royaltyLevel)`
- 驗證 Reviewer 簽章
- 只有狀態為 `Registered` 才可執行
- 紀錄已經 Review 過的 Reviewer 地址,Review 僅限一次
- `RoyaltyLevel` 對應稿費的四個等級
`function isSubmissionClaimable(string title) view returns (uint256 royalty)`
- 投稿狀態必須為 `Registered`
- 必須有兩位以上 Reviewer 給出稿費
- 如果以上檢查未通過,返回 `0`;如果通過,返回 Reviewer 們給出的稿費的平均值
`function claimRoyalty(string title)`
- 驗證是該篇投稿所登記的地址的簽章(因此此地址必須是 EOA 帳戶)
- 且 `isSubmissionClaimable` 返回 `>0` 的值
- 將稿費轉給該地址,並將投稿狀態更新為 `Claimed`
`function updateRoyaltyRecipient(string title, address newRoyaltyRecipient)`
- 驗證 Admin 簽章
- 只有狀態為 `Registered`(不能是 `Claimed`)才可執行
(Optional) `function revokeSubmission(string title)`
- 驗證 Admin 簽章
- 清空該篇投稿的紀錄
##### Owner 函式
`function transferOwnership(address newOwner)`
`function changeAdmin(address newAdmin)`
`function changeRoyaltyToken(address newRoyaltyToken)`
`function upgradeToAndCall(...)`