JAMMERC20 合约

JAMMERC20是JAMM DEX中LP代币的标准实现,它不仅完全符合ERC-20标准,还支持EIP-2612 Permit功能。每个JAMMPair合约都继承自JAMMERC20,使得流动性代币具备了完整的代币功能和现代化的授权机制。

合约基本信息

contract JAMMERC20 is IJAMMERC20 {
    string public constant name = "JAMM LPs";
    string public constant symbol = "JAMM-LP";
    uint8 public constant decimals = 18;
    uint public totalSupply;
    mapping(address => uint) public balanceOf;
    mapping(address => mapping(address => uint)) public allowance;
}

代币信息

  • 名称: "JAMM LPs" (所有交易对统一名称)

  • 符号: "JAMM-LP" (所有交易对统一符号)

  • 精度: 18位小数

  • 供应量: 动态变化,根据流动性添加/移除

EIP-2612 Permit支持

Permit相关状态变量

变量说明

  • DOMAIN_SEPARATOR: EIP-712域分隔符,用于签名验证

  • PERMIT_TYPEHASH: Permit消息类型的哈希值

  • nonces: 每个地址的随机数,防止重放攻击

域分隔符初始化

域分隔符构成

  • 域类型哈希

  • 代币名称哈希

  • 版本号哈希 ("1")

  • 链ID

  • 合约地址

核心ERC-20功能

内部函数

铸造代币

铸造逻辑

  1. 增加总供应量

  2. 增加目标地址余额

  3. 发射Transfer事件(从零地址)

销毁代币

销毁逻辑

  1. 减少源地址余额

  2. 减少总供应量

  3. 发射Transfer事件(到零地址)

内部授权

内部转账

外部函数

授权

转账

授权转账

授权转账特性

  • 检查授权额度是否足够

  • 如果授权额度不是最大值,则减少授权额度

  • 最大值授权不会减少(节省Gas)

Permit功能详解

Permit函数

Permit流程

  1. 检查截止时间

  2. 构建EIP-712消息摘要

  3. 恢复签名者地址

  4. 验证签名者是否为owner

  5. 执行授权操作

  6. 增加nonce防止重放

消息结构

Permit消息的结构化数据:

安全特性

溢出保护

使用Solidity 0.8.21的内置溢出保护:

  • 加法溢出会自动回滚

  • 减法下溢会自动回滚

  • 无需额外的SafeMath库

重放攻击防护

每次使用permit后,nonce会自动增加,防止签名被重复使用。

签名验证

严格验证签名的有效性和签名者身份。

使用示例

基本ERC-20操作

Permit签名生成

使用Permit授权

在Router中使用Permit

事件监听

监听Transfer事件

监听Approval事件

Last updated