# 閃電貸三角套利實作 ## 閃電貸套利運作 #### Step1. 在 Goerli 建立2個 ERC20 Token - tokenA Address : 0x3b4457569ca35083d245d7608E6C9Ed7245B9E00 - tokenB Address : 0x039421C5232BdeDaffa06d7e387bf9564d8DC7cc  --- #### Step2. 在 Uniswap V2 上建立3個交易對 1. DAI <-> TokenB : ==1000:100000 (1:100)== 3. TokenB <-> TokenA : ==10000:10000 (1:1)== 4. DAI <-> TokenA : ==2500:40000 (1:16)== **透過以上設計產生套利空間** <br>  --- #### Step3. 部屬實作完成的閃電貸合約測試閃電貸部分有無BUG (未加入套利Operation) - Deplyed Address : 0x8561417a3612d49658f97d05Ff90901E5e7bB92A (https://goerli.etherscan.io/address/0x8561417a3612d49658f97d05ff90901e5e7bb92a) - Code 程式碼: https://gist.github.com/Charming0420/f480fc7fb5cae8d1a707b03fe6d7e87d --- #### Step4. 部屬實作完成的閃電貸合約測試套利部分有無BUG (加入套利Operation) - Deplyed Address : 0xDE94cc1801AE4cFd464E68B57764e5a9d2C5CFDf (https://goerli.etherscan.io/address/0xDE94cc1801AE4cFd464E68B57764e5a9d2C5CFDf) - Code 程式碼: https://gist.github.com/Charming0420/006a8cac9ba17d30e1bb57886ba5e47f --- #### Step5. 測試閃電貸三角套利成功 交易明細 - Txn Hash:0xd206fd994a72d129be31521aca40bb57e11217dc321918774cc483b972425969 (https://goerli.etherscan.io/tx/0xd206fd994a72d129be31521aca40bb57e11217dc321918774cc483b972425969)  --- <br> ## 閃電貸執行邏輯 1. 透過Aave提供的**flashLoanSimple**進行DAI借貸 2. 將拿到的**DAI**全部轉換為**TokenB** (1:100) 3. 將拿到的**TokenB**全部轉換為**TokenA** (1:1) 4. 將拿到的**TokenA**全部轉換回**DAI** (1:16) 5. 因為100/16=6.25,表示這結構存在6.25倍套利空間,故借**1個DAI**最終可換出**6.25個DAI**(理論值,未計算交易摩擦成本) 6. 以上皆在一個Block內完成,且由於是使用**flashLoanSimple**,故不須主動還款,僅需Approve相應資金,POOL將會自動收款(借款+手續費) <br> ## 心得 - **學到甚麼** 我認為這次的練習非常有價值和意義,由於過去最不想碰、最沒興趣的就是DeFi產品,所以第一次接觸發現還挺有趣的,也學到了非常多包含Aave閃電貸的玩法還有Uniswap各種介面的有趣使用,雖然一直都知道結構化套利的方式但是這是第一次親手實做出來,感覺還有很多可探索的玩法值得開發,包含更多層的結構套利。 - **遇到的困難** 其實Coding部分難度沒有到很誇張,雖然沒接觸過DeFi但看著Document邊查邊做大概兩小時內做得出來,不過至少花了5小時在Debug,做了無數次的Coding Review、部署無數個合約,都找不出問題到底出在哪邊,結果最後是被Uniswap建立交易對時的介面預設的Dai騙,此Dai非彼Dai,不是同一種代幣,重新建立流動池之後才結束鬧劇。 ###### tags: `進階創新科技技術作業`
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.