資安

Aave協議JavaScript對接教程

不到一個月的時間裡,在區塊鏈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池,主要步驟如下:

  1. 載入LendingPoolAddressesProvider合約
  2. 獲取LendingPool地址
  3. 載入LendingPool合約
  4. 向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了。具體步驟如下:

  1. 從LendingPool合約獲取儲備數據
  2. 使用儲備數據載入aToken合約
  3. 贖回以太幣

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協議對接開發入門 — 匯智網

Leave a Reply

Your email address will not be published. Required fields are marked *