Skip to main content

自己做一個 PERP 交易所 APP

Opass
A life well lived

前情提要

這是我在 2025 年 9 ~ 12 月的專案,我花了 86 天完成了一個交易所的 App 並上架到 Google Play Store,包含中間去旅遊2個禮拜。

2025年,Perpetual Procol 面臨了很大的壓力,探索了幾個月但找不到明確可行的產品方向,我們嘗試做了一個跨鏈的現貨交易所 Nekodex,但一直找不到 Product Market Fit,用戶數量上不去。

同時維護 Nekodex 也成為負擔。Nekodex 的目標用戶是那些不熟悉幣圈的新手用戶,為了讓這些用戶不用理解 Gas 的概念也能使用,我們使用了 AA Wallet 當作底層基礎建設。但實務上發現維護是個大坑,每個用戶在鏈上都有一個合約錢包,每次遇到合約需要升級,永遠都會有一部分的用戶還停留在最舊的版本。最近一次是2025 9月的時候,ZeroDev 回報說他們的 AA Wallet 合約有個漏洞需要升級才能繼續使用,我們花了將近一週才搞定這件事。

因此在2025年9月,我們決定先做一個更好維護的 PERP 交易 APP,並計畫之後下架 Nekodex,將用戶轉移到新的產品上,以減輕維護負擔,保留精力探索其他產品方向,這個產品叫做 PERP GO,一個 mobile 的 perp 交易 app。

但 12 月時,公司決定將 Perpetual Protocol 出售移交給另一個團隊。和老闆討論後,我們決定開源這個專案,身為 PERP GO 主要的開發者,我會在這篇文章分享開發與當時的決策細節。

整個 PERP GO App 的程式碼都已經 Open Source 放置在 github 並採用 CC 4.0 授權,您在移除 PERP GO 商標後可以自由使用。

PERP GO Demo

怎麼決定背後的技術選型?

PERP GO 的目標是減少維護成本。因此直接以當前 PERP defi 市占率前最大的 Hyperliquid 當做後端,會是最簡單的。

深入研究會發現,Hyperliquid 官方只維護前端和後端 API,但 Hyperliquid 本身並沒有跳下去做 mobile App,反而是在官方網站推薦了其他 App 的前端

CleanShot_2026-02-01_at_15.03.112x.png

我們下載並研究了所有競品,最後的結論是:透過 Hyperliquid 官方提供的分潤機制可能是有利可圖的。

Builder Code 是 Hyperliquid 官方提供的分潤機制,開發者透過打造一個 Hyperliquid 前端介面來吸引用戶,如果使用者透過該前端介面下單,那開發者可以獲得分潤,最高可以拿到用戶交易金額的 0.1%。

最關鍵的數據是 Hyperliquid BuilderCode 的收益,DUNE 上可以查到當前常見最賺錢的 BuilderCode 有哪些,其中最賺錢的是黃色的 phantom 和粉紅色的 based(大約一天有4~5萬美金的收入)。

CleanShot_2026-02-01_at_15.25.002x.png

產品定位

一開始我們想,有沒有辦法引流平時會用 Hyperliquid 網頁版本的用戶?

Hyperliquid 官方網站上,有一個 Link Mobile Device 的按鈕,會提供一個 QR Code,允許用戶用手機打開 Hyperliquid 來交易。

CleanShot_2026-02-01_at_15.43.042x.png

是否有辦法做一個手機 App 來,直接掃描該 QR Code,我們就直接把該用戶綁定到我們的 PERP GO app 內呢?

結論是不行,不是技術上不行,而是商業上缺乏價值。

Hyperliquid 之所以能做到不用每次交易都簽名,是因為使用者在登入後,會授權另一個 Agent Wallet 代為操作用戶的資產。這個 Agent Wallet 可以下單,但不能存款與提款。

最重要的是:直接透過這個 Agent Wallet 下單,Builder 是沒辦法抽手續費的。

用戶必須用主要的錢包(master wallet)授權前端介面能夠抽手續費,最高不超過 0.1 %,前端交易介面才能夠在每次交易時,攜帶一個 builder code 到 Hyperliquid 後端 API,成交時抽 Builder Fee。

所以如果你研究了競品(based app, dexari, lootbase)會發現,所有的競品都在鼓勵用戶「在 app 上建立錢包」,原因是 app 上自建錢包就能夠替用戶簽 approve Builder Fee。

因此最終所有 hyperliquid 前端 app 會導向三種註冊方式的選擇

  • 幫用戶產生 seed phrase 並保存在手機上、或是允許用戶匯入 seed phrase
  • 讓用戶能夠用 email 註冊一個對應的錢包(使用 privy 或是 turnkey 之類的服務)
  • 讓用戶能夠掃 Hyperliquid 官方 QR Code 但是賺不到錢

而我在訂定 PERP GO 規格時,考量到幫用戶產生 seed phrase 會有很高的資安風險,最終選擇是

  • 對於初階用戶,使用 email 可以註冊一個錢包
  • 對於進階用戶,可以使用 mobile wallet app 直接進行跨 App 的簽名授權與交易。

這麼一來,就可以保證交易過程都是自託管的(self-custody),用戶永遠擁有錢包的控制權,我也不用承擔幫用戶保管 private key 的風險。另外因為知道用戶的 master wallet,所以用戶在使用前,可以請求用戶給予 Builder Fee 的授權。

技術選型與坑

  • Mobile App Framework
    • Expo,React Native Based 的跨平台 App 開發框架,能夠同時開發 iOS 與 Android App 並獲得近似原生的體驗,另外提供 Expo Update 能進行 Live update,小升級的情況下用戶不用重新到 App Store 重新安裝套件。
  • TypeScript Hyperliquid SDK
    • Hyperliquid 有兩個非官方的 SDK,@nktkas/hyperliquid@nomeida/hyperliquid
    • 雖然乍看之下,@nomeida/hyperliquid 的設計比較漂亮,但最終我會選擇使用 @nktkas/hyperliquid 。原因是 @nomeida/hyperliquid 只提供了透過 private key 來初始化 SDK 的方法。但能夠不碰到用戶的 private key 會是更好的選擇。而 @nktkas/hyperliquid 能夠提供了 viem 相容的 account 來初始化 SDK,這代表我們可以在不用知道用戶 private key 請用戶簽名授權與送出交易。
    • 實務上,還是會遇到 @nktkas/hyperliquid 的一些內部設計問題,要記得刻意不使用某些 SDK 提供的功能。像是盡量不要使用 SymbolConverter,原因是雖然這個 helper method 方便,但其背後的實作是打另外一個 API 來取得當前的 Symbol,這個另外打的 API 會成為 Rate Limit 的破口,讓你沒辦法很好的掌握 API Rate Limit,另外你也很難確定 Symbol Converter 背後有沒有對市場做快取。
  • privy
    • 優點
      • 提供用戶能夠透過 email 註冊帳號,由 privy 幫你保管 private key。此外具備了讓用戶能夠自行匯出 private key 的功能,出問題時用戶可以自行逃生。
      • Stripe 已經在2025年6月收購了 privy,是個相對值得信任的服務。
      • privy 的 react-native-SDK 功能相對原始,由 privy SDK 提供 UI 套件,並沒有提供太多能夠自訂的空間。
      • 我會選擇使用原生的 EOA 錢包,而不是 AA Wallet,讓用戶自己處理 gas 問題,保持簡單。選 AA Wallet 幫用戶代付 gas 會有 PTSD。
  • reown/appkit
    • 優點
      • reown 背後是原本的 wallet connect。reown/appkit 的好處是能夠選擇手機上的其他 mobile wallet 來連接到我們的 app 上,需要簽名時,再跳轉到對應的 wallet app。
      • 支援大部分的 mobile wallet。
      • wallet connect 普遍的問題是,用一陣子後可能會遺失連線需要重連。或是 Mobile Wallet App 在需要簽名的時候一直沒有反應。背後原因可能是太多連線跳轉和狀態管理。通常把 Mobile Wallet App 強制斷線重開就會正常。但在我們的使用場景下,因為大多數的交易都是授權給 Agent Wallet 做操作,所以不算是大問題。
      • 沒辦法使用 metamask,不知道為什麼 metamask 就是連不上。
  • charting_library
      • 目前市面上,你常常在交易所看到那些好看的 Charting Library 是 Trading View 的 Advanced Chart,是需要用公司的名義和 Trading View 聯繫簽署申請授權才能拿到 Source Code。Trading View 會檢視公司是誰、要用在哪裡,如果惡意使用會求償。我當時申請授權是免費的
      • 因此如果你仔細看一些其他交易所的 Trading Chart,會發現很多交易所其實都是自己開發自己的版本。大概是因為不想被綁定在 Trading View 的緣故吧。
      • 就算你用了 Advanced Chart,你會發現你依然沒辦法實作出很多交易所會看到的「拖曳設定Limit Order 或是止盈止損」,因為這功能被 v28.0.0 的 Trading View Advanced Chart 鎖住當作進階功能了
      • 如果申請不到授權,那免費的選擇會是使用 Trading View 的 Open Source 版本 LightWeight Charts。但就頗陽春,很多沒有任何技術指標。

開發策略

我在實作 App 時,把相對內聚自然聚合成一個 contexts。

├── contexts/              # Core business logic (Hexagonal Architecture)
│ ├── agent/ # Agent wallet management
│ ├── bridge/ # Cross-chain bridging
│ ├── builderFee/ # Builder fee management
│ ├── history/ # Trade history
│ ├── margin/ # Margin & leverage
│ ├── market/ # Market data
│ ├── order/ # Order management
│ ├── position/ # Position management
│ ├── referral/ # Referral system
│ └── telemetry/ # Error tracking & analytics
  • contexts
    • agent 一個主帳號允許最多 3個 named agent + 1 個 unnamed agent
    • bridge:用戶 deposit / withdraw collateral 的本質就是把錢 bridge in/out hyperliquid。
    • builderFee:管理用戶是否已經授權 builder fee,有授權才能夠抽成
    • history:顯示交易歷史記錄
    • margin:設定每個市場的 margin mode、槓桿倍數
    • market:列出所有當前的市場
    • order:管理下單功能(有很多種不同的 Order)
    • position:管理用戶當前的倉位
    • referral:管理用戶是否設定了推薦碼
    • telemetry:追蹤用戶的操作行為分析

為什麼要拆解出這麼多 Context?

原因是: 交易所並不是一個隨隨便便就可以 Vibe Coding 出來的東西。完全放飛 Claude Code 自己開發,肯定會在某個時間點就陷入複雜度地獄。

最大的問題有三個

  1. 交易所的功能繁雜
  2. UI 行為難以驗證
  3. 很多問題是一邊做一邊探索才會浮現

功能繁雜

舉例來說,下單最主要有下列2種 Order

  1. Market Order
  2. Limit Order

搭配下列兩種變化

  1. Reduce Only:只允許減倉
  2. TP/SL:允許設定止盈、止損

你很容易就可以想到有下列問題需要測試

  1. 如果一個 Limit Order 勾選 Reduce Only,他是參考 Limit Order 時的 Position 還是 Limit Order 本身觸發時的 Position?
  2. TP/SL 也要可以設定 Limit Order 和 Market Order
  3. TP/SL 的觸發是 partial 成交就觸發,還是要完整成交才會觸發?
  4. 如果 parent 訂單取消了,那麼 TP/SL 訂單是否會跟著取消?

如果不加以管理,很快這些問題就會淹沒你的大腦,這還只是下單而已。

UI 難以測試

UI 測試一直都是個麻煩的問題。理想上當然可以使用類似 react-native-testing-library 的測試框架來模擬 react render 的結果。但對於一開始連 UI 要長什麼樣子都不確定的應用來說,這種測試方式只是確定「有 render 出你要的內容」,但並不能保證排版是你要的。

我有嘗試過使用 mobile mcp,想辦法讓 claude code 能夠在開發時,自行擷取手機畫面/或是取得 react-native DOM Tree來驗證結果。我會說效果差強人意。最主要的問題是「操作」到「看到結果」會有個時間差,基於截圖的測試難以檢查 pop up 之類的動畫,另外你也很難透過截圖來確認下單結果。

甚至最麻煩的是,很多時候,你一開始根本不確定要 UI 做成什麼樣子。

這種情況下,我會選擇先直接參考其他 App 是怎麼做的。例如打開 Based App,看看他們是怎麼處理各種下單的狀況、或是怎麼顯示不同精度的 OrderBook。

關注點分離

用一句話來說的話,在近三個月與 AI agent 一起 coding 的旅程,我認為最好的策略是關注點分離。

盡可能把問題縮小到一個足夠內聚的邊界,在修改時不會改壞其他東西。

我主要關心兩件事

  • 我希望能夠在問題規模變大時,依然能夠知道要改哪裡
  • 我希望功能之間盡可能的切乾淨,這代表我可以在同一時間做更多不相干的功能,而不會彼此打架。

因此我選擇把架構設計 UI 和業務邏輯分離。

App 的 UI 有自己的目錄,UI 怎麼改都只侷限在 UI 的目錄中。這可以有效減少和設計師協作時的 merge conflict,設計師在怎麼改,都只會在 UI 的目錄中調整編輯,UI 不影響功能。

至於業務邏輯,就按照功能進行切分,讓業務邏輯盡量與 UI 無關,這樣 AI agent 才方便驗證。功能太多的話,就按照當下的感受來切分 contexts,反正怎麼切是沒有標準答案的,更像是一種基於開發者直覺的藝術。這些 context 也會邊做邊調整,有可能做一做發現某些能應該獨立成一個新的功能類別、或是應該把兩個功能類別合併成一個。最主要的目標還是,讓開發者可以清楚的知道當前已經實作了哪些功能。

最後就是透過老方法:相依注入,把業務邏輯注入回 UI 入口中。

如果你想了解更具體實作,可以參考我的 六角架構開發規範

開發 Trading App 會遇到的 Domain 與非 Domain 知識

你需要掌握的 Hyperliquid Domain Knowledge

  • 不同市場下,精度的計算方式(szDecimals)
  • Deposit Withdraw 會在 Arbitrum 上進行 bridge,withdraw 會收走 1U 手續費。
  • 所有下單的行為(Market Order, Limit Order, Reduce Only, TP/SL Order)
  • API 是有權重的 Rate Limit
  • 每個市場可以設定獨立的保證金模式(Isolated, Cross)和最大的槓桿倍數
  • fee 的計算公式(Fee, Builder Fee, Referral Discount 與 Maker/Taker Fee 的差異)
  • 如果想要支援美股代幣化的市場 HIP-3,要記得開啟 dex abstraction,並且留意有些市場的交易對並不是 USDC。

除了 Hyperliquid Domain 外,我認為設計一個好的 CI 開發流程也很重要。

  • Expo 怎麼管理 env?
    • 我的建議是直接使用 Expo dashboard 管理 env,需要理解不同寫法的環境變數何時會生效。例如有的是在 build time 看得見,有的是在 runtime 才看得見。
    • 你可以參考我的 管理環境變數的規範
  • 如何管理 App 的版本號,什麼時候該升版?
    • 這是個討人厭的問題。必須先理解App 的更新方式有兩種,一種是可以直接 in-app 內升級,另一種是需要進到 App Store 重新安裝新版的 app。你會希望盡可能減少要進 App Store 升級,因為每次 App 升級就會需要重新 Apple 送審,耗時冗長 。如果是 OTA(Over-the-air) 升級就可以不用通過送審。但你又不可能完全只依賴 OTA 升級,總有一天你可能會需要 App Store Upgrade
    • 您可以參考 我的版本號的更新規範

上架會遇到的問題

開發之外,最困難的卡點應該會是上架。

容易解決的麻煩

  • 要提供 iOS, Android 在不同裝置(手機、平板)上的操作截圖,這部份可以靠安裝 iOS/Android 的虛擬機解決
  • 填寫一大堆隱私權與資料使用的許可

難以解決的麻煩

一開始一切都還算順利,Android Play Store 已經順利上架。而 App Store 要求一些 UX 上的改進。但沒想到 App Store 後來突然要求「需要當地政府的許可證明」,否則就不予上架。

我們決定先嘗試只在塞席爾上架。因為塞席爾對於虛擬貨幣業的規範是,沒有代為保管用戶資產的話,就不受虛擬貨幣交易法案 VASP 的監管限制。這個 App 完全使用自託管的方式運營,理應是符合規範的。但儘管對 App Store 進行解釋,App Store 依然進入了鬼打牆的狀態,沒有明確的政府文件允許,就是不許上架。

我記得 2026 年 1月之後,Android Play Store 也對於加密貨幣交易所相關的 App 進行更嚴格的限制。當然不公開上架,在自己手機上進行內測是沒問題的。如果有意圖公開上架記得先想辦法取得 App Store 同意。

結語

在此記錄並分享了過去三個月製作一個 Mobile Trading App 所有遇到的困難、踩過的坑,如果你曾經想自己做一個交易所 App,希望這篇文章可以讓你知道前方的道路是什麼樣子。