不到一個月的時間裡,在區塊鏈DeFi協議中鎖定的資產價值就已經翻了一倍,超過20億美元。Aave是第五大並且是第一個支持Flash Loan的DeFi平臺,在這篇文章中,我們將學習如何在DApp應用中對接Aave協議,實現存入資產、贖回資產等功能。本教程使用的開發語言為JavaScript。
用自己熟悉的語言學習 以太坊DApp開發 : Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart
1、Aave協議簡介
Aave目前支持17個市場: ETH, DAI, USDC, SUSD, TUSD, USDT, BUSD, BAT, KNC, LEND, LINK, MANA, MKR, REP, SNX, WBTC以及ZRX。
讓我們以LINK為例進行說明Aave的作用。通過將LINK存入Aave協議,即表明你允許協議借出你的資產,並因此獲得利息收入。你可以隨時取回你存入的加密資產,就像儲蓄賬戶一樣。
將你的LINK存入協議後,你可以進行一些其他操作,例如檢查目前的利率、借入其他資產等等。
2、Aave協議技術概述
那麼上述過程從技術角度是怎樣的?與Compound相比,Aave的協議過程會複雜一點,不過還不難掌控。
Aave協議的核心是LendingPools
智能合約,它也是整個Aave協議的入口點。開發者可以利用LendingPool合約的deposit()
方法存入加密資產。此外,開發者也可以獲取Aave協議的一些儲備數,例如用戶的流動性、當前的利率,總體流動性等等。
在Aave協議中,LendingPool合約是可升級的。這意味著其部署地址在將來可能變化。為了讓DApp兼容未來的地址,Aave提供了一個LendingPoolAddressesProvider
智能合約來解決這個問題,該合約永遠不會升級,可以利用它來獲取最新的LendingPool合約的地址。只要我們拿到了最新的LendingPool合約的地址,就可以對接Aave協議了。
不過我們沒法用LendingPool合約贖回存入的資產,這需要用到其他一些智能合約,即aTokens
。aTokens是一類ERC-20兼容的智能合約,用於實現與各種標的資產(underlying assets)的兌換。例如,當存入LINK代幣後,我們就會收到按當前匯率折算數量的aLink代幣,aLink合約則提供redeem()
方法用於贖回之前存入的資產。
總的說來,與Aave協議的交互主要包括以下環節:
- 利用LendingPoolAddressesProvider合約獲取最新的LendingPool合約的部署地址
- 利用LendingPool合約存入資產
- 利用aToken類合約贖回資產
上述步驟讓Aave協議的對接要比Compound協議複雜一些,因為DApp需要用到若干個不同的智能合約與ABI。
3、向Aave協議存入資產
首先我們先學習如何將ETH資產存入Aave池,主要步驟如下:
- 載入LendingPoolAddressesProvider合約
- 獲取LendingPool地址
- 載入LendingPool合約
- 向LendingPool合約存入ETH
3.1 載入LendingPoolAddressesProvider合約
我們需要的第一個ABI是LendingPoolAddressesProvider合約的,該合約在不同網絡的部署地址可查閱Aave官方文檔,以太坊主網上該合約的部署地址為0x24a42fD28C976A61Df5D00D0599C34c4f90748c8
。
下面的示例代碼展示瞭如何載入Provider合約:
const providerInstance = new web3.eth.Contract(
addressProviderABI,
"0x24a42fD28C976A61Df5D00D0599C34c4f90748c8"
);
3.2 獲取LendingPool合約的部署地址
Aave的Provider合約提供了getLendingPool()
方法返回LendingPool合約的最新部署地址。例如下面的示例代碼展示瞭如何調用該方法獲取最新的LendingPool合約地址:
const lendingPoolAddress = await providerInstance.methods.getLendingPool().call()
.catch((e) => {
throw Error(`Error getting lendingPool address: ${e.message}`)
});
3.3 載入LendingPool合約實例
LendingPool ABI 是我們需要使用的第二個ABI。下面的示例代碼展示瞭如何利用前面獲得地址載入LendingPool合約實例:
const lendingPoolInstance = new web3.eth.Contract(lendingPoolABI, lendingPoolAddress);
3.4 向LendingPool合約存入以太幣
當向Aave協議存入資產時,需要告訴LendingPool我們將存入的資產類型和數量。這需要傳入標的資產的儲備地址,不同類型資產對應的儲備地址清單可以查閱Aave文檔。對於ETH而言,其儲備地址是0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
。
下面的示例代碼展示瞭如何向LendingPool合約存入ETH:
lendingPoolInstance.methods.deposit("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", supplyValue, 0)
.send({from: account, value: supplyValue})
.once('transactionHash', (hash) => {
// transaction hash
})
.on('confirmation', (number, receipt) => {
// number of confirmations
})
.on('error', (error) => {
console.log(error);
});
在上面的代碼中,supplyValue
表示要存入的ETH數量,單位:wei。
下面是到目前為止我們已經實現的與Aave協議對接的全部代碼:
// Load the address provider
const providerInstance = new web3.eth.Contract(addressProviderABI, "0x24a42fD28C976A61Df5D00D0599C34c4f90748c8");
// Get lending pool address
const lendingPoolAddress = await providerInstance.methods.getLendingPool().call()
.catch((e) => {
throw Error(`Error getting lendingPool address: ${e.message}`)
});
// Load lending pool
const lendingPoolInstance = new web3.eth.Contract(lendingPoolABI, lendingPoolAddress);
// Deposit funds
lendingPoolInstance.methods.deposit("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", supplyValue, 0)
.send({from: account, value: supplyValue})
.once('transactionHash', (hash) => {
// transaction hash
})
.on('confirmation', (number, receipt) => {
// number of confirmations
})
.on('error', (error) => {
console.log(error);
});
好了,現在已經將ETH存入Aave了,等著賺利息吧!
4、從Aave協議贖回資產
為了贖回之前存入的資產,我們首先需要了解應該使用哪個aToken合約,然後調用該合約的redeem()
方法就可以收到贖回的ETH了。具體步驟如下:
- 從LendingPool合約獲取儲備數據
- 使用儲備數據載入aToken合約
- 贖回以太幣
1、獲取資產儲備數據
儲備數據(Reserve Data)描述了所存入資產的信息,例如總體流動性和當前利率。我們可以利用
儲備數據獲取aToken的地址。下面的代碼展示了這一過程:
const reserveData = await lendingPool.methods
.getReserveData("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE")
.call()
.catch((e) => {
throw Error(`Error getting aave reserve data: ${e.message}`)
});
const aTokenAddress = reserveData.aTokenAddress;
2、載入aToken實例
aToken ABI 是我們要用到的最後一個ABI,下面的代碼展示瞭如何載入aToken實例:
const aTokenInstance = new web3.eth.Contract(aTokenABI, aTokenAddress);
3、贖回資產
最後,下面的代碼展示瞭如何贖回標的資產:
aTokenInstance.methods.redeem(withdrawAmount)
.send({from: account})
.once('transactionHash', (hash) => {
// transaction hash
})
.on('confirmation', (number, receipt) => {
// number of confirmations
})
.on('error', (error) => {
console.log(error);
});
withdrawAmount
表示要從Aave協議中贖回的ETH數量,單位還是wei。
下面是Aave協議資產贖回功能的完整代碼:
// Get reserve data
const reserveData = await lendingPool.methods
.getReserveData("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE")
.call()
.catch((e) => {
throw Error(`Error getting aave reserve data: ${e.message}`)
});
// Get aToken address
const aTokenAddress = reserveData.aTokenAddress;
// Load aToken
const aTokenInstance = new web3.eth.Contract(aTokenABI, aTokenAddress);
// Redeem asset
aTokenInstance.methods.redeem(withdrawAmount)
.send({from: account})
.once('transactionHash', (hash) => {
// transaction hash
})
.on('confirmation', (number, receipt) => {
// number of confirmations
})
.on('error', (error) => {
console.log(error);
});
5、Aave協議接入教程小結
隨著DeFi變得越來越簡單易用,學習如何與這些協議交互將迅速成為開發人員工具箱中的有力武器。
原文鏈接:Aave協議對接開發入門 — 匯智網