早晨起来看大家都在喊 $smart, @josephdelong开发的基于smart account的meme token。研究了下,必须通过AA钱包才能正常transfer和交易 。下午写了个中间交互合约来mint,并归集到AA钱包(可以用 @safe,正常交易)。 很久没分享代码相关的内容了,全是日常吐槽,简单写一个介绍,抛砖引玉。很长时间没写合约了,还停留在半年多前的认知,如果有更好的改进方案,也可以一起交流。
主要完成功能:批量创建代理合约+mint+转账归集。
考虑到节省gas的需求,中间合约里把claim单独拆分出来并通过mini proxy来完成新建临时地址mint的功能。
如果有需要的,可以直接加入套利(uniswap)逻辑到中间合约中,因为剩的不多了,并且想囤着看一波后续,我就没有添加套利的逻辑。
- ClaimProxy 合约
ClaimProxy 是一个代理合约,用于代表MintHelper 合约从SmartToken 合约中执行操作。它的主要功能包括:
代币申领(claim):通过 claim() 函数,ClaimProxy 代理合约可以调用 SmartToken 合约的申领功能,并确保每个代理只能执行一次申领操作,防止重复。
代币转账(transfer):transfer() 函数允许从代理合约向指定地址转账所有代币,确保代理合约中持有的代币不会被滞留。
初始化(initialize):代理合约在创建后,通过 initialize() 函数关联具体的 SmartToken 合约,从而开始执行其代理功能。
- MintHelper 合约
MintHelper 是管理整个代理合约系统的核心。它可以批量创建ClaimProxy 代理合约,并控制这些代理执行代币申领和转账。MintHelper 主要提供以下功能:
批量创建代理合约:通过createMiniProxies() 函数,合约可以批量创建ClaimProxy 代理合约,并初始化它们以关联到SmartToken。这一过程使用了最小代理(Minimal Proxy)模式,能够极大地节省Gas费用。
申领代币:MintHelper 可以调用指定代理合约的claim() 函数,帮助多个代理合约批量完成代币的申领操作。
转账代币:同样,MintHelper 可以通过transfer() 函数批量调用代理合约,将代币从代理合约转移到指定地址。
查询余额:通过getProxyBalance() 函数,MintHelper 可以查询某个代理合约中持有的代币余额,确保管理的方便性。
- 最小代理模式(Minimal Proxy)
ClaimProxy 合约的创建采用了最小代理(Minimal Proxy)模式, 减少了部署成本和Gas消耗。
createClone() 函数使用了Solidity 的内联汇编(assembly)来创建这种最小代理合约。通过这种方式,我们可以在Gas费用最小化的前提下,批量部署大量代理合约。
- 使用注意:
具体交互(claim, transfer, createMiniProxies)可在python或者JS中实现。
安全性请自行添加owner权限等,以及对于mini proxy的控制权限。
转账切记转到AA地址,不要误转到EOS地址。
+ There are no comments
Add yours