Comment on page
AAVE Token
The AAVE token is an ERC-20 compatible token with the addition of a snapshot feature (used in governance balance tracking) and integrates EIP 2612 permit function, allowing gas-less transactions and one transaction approval/transfer.
This section will cover the technical aspects of the token.
Mainnet
Proxy Contracts | Address and ABIs |
Auditor | Audit Type |
Smart Contract | |
Smart Contract | |
Properties Verification |
Besides the standard ERC20 token features (
transfer()
, balanceOf()
, allowance()
, etc), the following features are also available.function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external
Allows a user to permit another account (or contract) to use their funds using a signed message. This enables gas-less transactions and single approval/transfer transactions.
Parameter | Type | Description |
owner | address | The owner of the funds |
spender | address | The spender for the funds |
value | uint256 | The amount the spender is permitted to use |
deadline | uint256 | The deadline timestamp that the permit is valid. Use type(uint).max for no deadline. |
v | uint8 | Signature parameter |
r | bytes32 | Signature parameter |
s | bytes32 | Signature parameter |
Web3.js
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}`)
})
function _nonces(address owner) public
Returns the next valid nonce to submit when calling
permit()
event SnapshotDone(address owner, uint128 oldValue, uint128 newValue)
An event emitted on every
transfer
, mint
(with a valid to
address), and burn
(with a valid from
address).The snapshots are used for governance balance tracking.
Parameter | Type | Description |
owner | address | The owner of the AAVE tokens |
oldValue | uint128 | The value before the operation was executed |
newValue | uint128 | The value after the operation was executed. |
Last modified 2yr ago