AAVE token 是一种兼容 ERC-20 的 token,增加了快照功能(用于治理余额跟踪),并集成了 EIP-2612 许可功能,允许无 gas 交易和一次交易批准/转移。

本部分将介绍 token 的技术层面

AAVE token 源码:https://github.com/aave/aave-token

已部署合约

主网:

审计报告

Auditor Audit Type
Consensys Diligence (AAVE token) smart contract
Certik (AAVE token) smart contract
Certora (AAVE token) 属性验证

Methods

除了标准的 ERC20 代币功能(tansfer()balanceOf()allowance()等)还提供以下功能:

permit

function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external

允许用户允许其他用户(或合约)使用已签名的消息使用其资金。这实现了无 gas 交易和单一 approval/transfer 交易。

参数名称 类型 描述
owner address 资金的所有者
spender address 资金的花费者
value uint256 允许 spender使用的金额
deadline uint256 许可有效的截止时间戳。使用 type(uint).max表示无截止日期
v uint8 签名参数
r bytes32 签名参数
s bytes32 签名参数
import { signTypedData_v4 } from 'eth-sig-util'
import { fromRpcSig } from 'ethereumjs-util'

// ... other imports

import AaveTokenAbi from "./AaveTokenAbi.json"

// ... setup your web3 provider

const aaveTokenAddress = "AAVE_TOKEN_ADDRESS"
const aaveTokenContract = new web3.eth.Contract(AaveTokenAbi, aaveTokenAddress)

const privateKey = "YOUR_PRIVATE_KEY_WITHOUT_0x"
const chainId = 1
const owner = "OWNER_ADDRESS"
const spender = "SPENDER_ADDRESS"
const value = 100 // Amount the spender is permitted
const nonce = 1 // The next valid nonce, use `_nonces()`
const deadline = 1600093162

const permitParams = {
  types: {
    EIP712Domain: [
      { name: "name", type: "string" },
      { name: "version", type: "string" },
      { name: "chainId", type: "uint256" },
      { name: "verifyingContract", type: "address" },
    ],
    Permit: [
      { name: "owner", type: "address" },
      { name: "spender", type: "address" },
      { name: "value", type: "uint256" },
      { name: "nonce", type: "uint256" },
      { name: "deadline", type: "uint256" },
    ],
  },
  primaryType: "Permit",
  domain: {
    name: "Aave Token",
    version: "1",
    chainId: chainId,
    verifyingContract: aaveTokenAddress,
  },
  message: {
    owner,
    spender,
    value,
    nonce,
    deadline,
  },
}

const signature = signTypedData_v4(
  Buffer.from(privateKey, "hex"),
  { data: permitParams }
)

const { v, r, s } = fromRpcSig(signature)

await aaveTokenContract.methods
    .permit({
      owner,
      spender,
      value,
      deadline,
      v,
      r,
      s
    })
    .send()
    .catch((e) => {
        throw Error(`Error permitting: ${e.message}`)
    })

_nonces()

function _nonces(address owner) public

返回调用permit()时要提交的下一个有效 nonce

event SnapshotDone

event SnapshotDone(address owner, uint128 oldValue, uint128 newValue)

在每次 transfermint(具有有效的 to地址)和 burn(具有有效的 from地址)时触发的事件。

快照用于监管余额跟踪。

参数名称 类型 描述
owner address AAVE token 的持有者
oldValue uint128 执行操作之前的值
newValue uint128 执行操作之后的值