在该合约中,我们将使用VRF(可验证随机函数)编写一个随机红包合约。该合约将允许用户创建和领取随机红包,并且具有丰富的数据结构和合约初始化方式。
以下是数据结构的定义:
结构体Envelope包含了红包的各项信息,如类型、代币地址、发送者、金额、允许领取者列表、最大领取数等。此外,存储数据的mapping包括红包hash对应的红包内容、红包对应的allowlist、已领取的地址列表等。还有一些用于Chainlink VRF的配置数据,如VRF key、回调的gas限制等。
合约的初始化:
在合约初始化时,将VRF的订阅id赋值给s_subscriptionId。
创建ETH红包:
通过createETHredEnvelope函数创建ETH红包,用户可以设置是否允许所有人领取、领取列表、最大领取数、是否平均分配、超时区块数等参数。
创建ERC20红包:
createERC20redEnvelope函数与createETHredEnvelope函数类似,不同之处在于使用的是ERC20代币。在函数内部,需要校验是否有足够的approve。
添加AllowList:
allowSome函数用于向红包添加允许领取的地址列表。
领取红包:
get函数用于领取红包,其中包含了对红包余额、是否已领取、红包超时、领取权限和是否已领取完的判断。针对不同类型的红包,领取逻辑也有所不同。
打开随机数红包:
openEnvelopes函数用于打开随机数红包,需要判断红包是否超时以及最大领取数是否大于0。在该方法中,会向VRF请求一个随机数。
手动打开红包:
openVRFEnvelop函数用于手动打开随机数红包,需要判断最大领取数是否大于0,并获取VRF随机数。
VRF订阅id获取:
在这一部分,介绍了如何在Chainlink上获取测试币、构建钱包合约、获取VRF订阅id等步骤,并附上了相应的网址和图片。
测试:
最后,对在测试网络上部署的红包合约进行了介绍,并提供了合约源码地址。
标签:游戏攻略