用我自己的 ERC20 代幣交換 USDC 並返回 - Vyper 合約
我想在我自己的 ERC20 和 USDC 之間創建一個非常簡單的交換。
我正在用 Vyper 和 Python 編寫這一切。
我設想這項工作的一種方法是監控區塊鏈上的 USDC 轉移事件,然後有一個鏈下程序,根據是否有人想使用 USDC 購買或出售我的 ERC20 代幣,相應地鑄造和銷毀我的 ERC20。
我設想的機制如下:
收到 USDC 發送我的 ERC20 代幣(有人購買我的代幣)
USDC 轉賬事件將具有:我的合約地址。然後,我的鏈下監聽器會鑄造我的 ERC20 代幣並將其發送到將 USDC 發送到我的合約的 from: 地址。
問題一:
- 如果我的合約收到 USDC,它如何獲得這些資金?它如何將它們發送到另一個錢包。我想確保發送到合約的任何 USDC 都可以輕鬆訪問。Vyper 上的範常式式碼會很棒。
接收 ERC20 代幣發送 USDC(有人出售我的代幣以換取 USDC)
我會有一個方法可以燒掉我的 ERC20 代幣並發出一個特殊事件(我們稱之為 SELL2USDC)。
**問題 2:**如何將我的合約中的 USDC 發送到第三方地址?範例 Vyper 程式碼會很棒。
**問題 3:**我的合約在發送 USDC 之前是否需要有 USDC 餘額?如果不夠怎麼辦?我猜契約會恢復並且交易會失敗。
我無法幫助您實現 Vyper/Python,但我認為更好的解決方案是將整個工作流程保持在鏈上。當使用者想要將 USDC 換成您的 ERC20 代幣時,您可以從 USDC 合約呼叫 Approve/TransferFrom 函式將代幣轉移到您的智能合約,一旦完成,您就可以鑄造代幣並將其發送給使用者。不需要鏈下程式碼(因此更安全)。
如果您希望合約中的 USDC 可訪問,則始終可以實現一個僅限管理員的“提款”功能,該功能允許您將代幣發送到任何其他地址。您還可以在合約中以程式方式確定合約對 USDC 的作用(例如,通過 Aave 將其借出)。
關於你的第三個問題,是的。如果你想確保使用者可以隨意來回交換,你必須始終確保你的合約有足夠的 USDC 餘額來支持未償還的 ERC20。否則交易失敗。
未來自己的注意事項:
這看起來與手頭的任務非常相關:
https://github.com/curvefi/curve-contract-polygon/blob/master/contracts/burners/BTCBurner.vy