月亮链 月亮链
Ctrl+D收藏月亮链
首页 > UNI > 正文

TOKEN:一文学习如何创建自己的ERC20代币支付拆分器_globalusdtoken

作者:

时间:1900/1/1 0:00:00

在加密货币的几乎每个领域,支付都是一个反复出现的话题,特别是向多个质押者提供支付。例如,DAO希望为多个计划提供资金,DEX希望合并向某些参与者分配交易费用,或者团队希望将代币作为月薪分发给团队成员。

智能合约使我们能够自动化这些类型的支付功能,这就限制了人工管理支付所导致的潜在错误,并允许我们将宝贵的时间花在其他生产性任务上。

今天,我们将学习如何创建自己的ERC20代币支付拆分器,它可以合并到任何项目中!

项目架构

我们将创建两个合约。第一个将是ERC20代币支付拆分智能合约,第二个将是模拟池智能合约。ERC20代币支付拆分器智能合约将是抽象的,并持有用于管理收付方及其各自支付部分的逻辑和数据。模拟池将继承ERC20代币支付拆分器,以便我们可以自动将支付分发给多个质押者。在两个合约中拆分支付功能的原因有两个:

展示在真实世界的用例中代币支付拆分合约的使用

确保代币支付拆分合约足够灵活,任何人都可以选择并集成到自己的项目中

OpenZeppelin已有一个名为PaymentSplitter

functionshares(addressaccount)publicviewreturns(uint256){??return_shares;}functionpayee(uint256index)publicviewreturns(address){??return_payees;

}

现在我们将创建用于添加收款人的函数。

pragmasolidity0

Release是一个任何人都可以调用的函数,它接受一个现有收款人帐户的参数。来分析一下这个函数中发生了什么。首先,它检查帐户是否有分配给它的份额。然后,它创建一个名为tokenTotalReceived的变量,该变量将合约的当前代币余额与之前释放的代币总数相加。创建另一个称为payment的变量,该变量确定收到的代币总额中有多少是欠账户的,然后减去多少已经释放到账户。然后,一个require语句检查当前支付金额是否大于零(即,当前是否欠下了更多代币)。如果该检查通过,则更新账户的tokenReleased,并更新totalTokenReleased。最后,支付给账户的代币金额被转账。

数据:3月份Coinbase的现货交易量为494亿美元,较去年同期下降46%:金色财经报道,据 The Block 的数据,随着加密货币价格飙升,第一季度加密货币交易所的整体现货交易量略有上升,TD Cowen 分析师指出,Coinbase 交易所每月的平均每日现货交易量继续呈下降趋势。我们认为美国对加密银行的监管打击(Signature 和 Silvergate 的 24/7 交易支持网络)可能在这方面发挥了作用。

根据 The Block 的数据,3 月份 Coinbase 的现货交易量为 494 亿美元,比去年同期的 918 亿美元下降了 46%。此外,Coinbase 上一季度来自 USDC 的利息收入为 1.46 亿美元,较上一季度增长超过 100%,尽管全年收入有所下降。这一收入有助于提高本季度交易所的收入。?[2023/5/4 14:40:39]

现在函数已经就位了!但是这个合约还有一件事要做....事件!

我们将在合约中添加两个事件,将事件添加到合约顶部是一个良好的实践。

pragmasolidity0

functionrelease(addressaccount)publicvirtual{??///existingFunctionCode??emitPaymentReleased(account,payment);

}

现在代币支付拆分合约已经建立!为了理解这在真实场景中是如何工作的,让我们创建一个模拟池合约,它将导入代币支付拆分器。

创建模拟池合约

这个合约不会很复杂,因为我们只是想演示如何集成代币支付拆分器。这个合约定期收到我们想分发给收款人列表的特定ERC20代币。这个ERC20代币可以通过不同的场景到达,比如用户存款或来自另一个智能合约的重定向费用。在现实生活中,根据不同的项目,可能会有一个更复杂的合约,包含更多的功能来满足用户的用例。

在合约文件夹中,创建一个名为MockPool.sol的新文件。然后添加以下代码。

pragmasolidity^0.8.0;import"????functiondrainTo(address_transferTo,address_token)publiconlyOwner{????require(????_token!=paymentToken,????"MockPool:TokentodrainisPaymentToken"????);????uint256balance=IERC20(_token).balanceOf(address(this));????require(balance>0,"MockPool:Tokentodrainbalanceis0");????IERC20(_token).safeTransfer(_transferTo,balance);??}

游戏区块链Oasys推出生态基金以推动基于Oasys的游戏发展:1月12日消息,游戏区块链Oasys宣布推出生态基金以推动基于Oasys的游戏发展,孵化和投资一系列基于其网络或与之协同的游戏项目。该基金将优先考虑专注于构建生态的早期项目,包括游戏去中心化应用、基础设施、流动性相关项目和工作室。获得生态基金支持的项目除了资金支持,还将获得Oasys团队的专业知识和合作伙伴支持,包括游戏投资机构Galaxy Interactive。[2023/1/12 11:07:30]

}

在这份合约中,导入三样东西。首先是OpenZeppelin的Ownable实用程序,它在某些函数上使用唯一的onlyOwner修饰符。第二个是SafeERC20,它允许安全的ERC20代币转账,正如将在合约中看到。第三个是我们的TokenPaymentSplitter合约。

在MockPool构造函数中,我们需要TokenPaymentSplitter提供相同的三个参数,我们只是将它们传递给我们继承的合约。

在这个合约中添加了另一个函数,drainTo。它实际上与TokenPaymentSplitter合约没有任何关系。它只是在另一个没有设置为支付代币的ERC20代币被发送到池时的一种安全机制,然后有一种方法让合约所有者释放该代币。

测试合约

测试智能合约与创建它们同样重要。这些合约处理的资产通常是属于其他人的,所以作为开发人员,我们有责任确保这些资产按照他们应该的方式工作,并且我们的测试可以覆盖几乎所有的边缘情况。

将在这里进行的测试是一些示例,以显示TokenPaymentSplitter智能合约按照我们的预期工作。在处理自己的项目时,可能希望创建专门适合自己的用例的测试。

为了支持我们的测试,我们希望包含一个ERC20代币,为此,我们将创建一个新的solididity文件,该文件导入OpenZepplinERC20模板以供我们的测试使用。在合约文件夹中,创建一个名为Imports.sol的新文件,并包括以下代码:

pragmasolidity^0.8.0;import"

现在,在test文件夹中创建一个名为test.js的文件。在这个文件的顶部,我们将导入支持我们的测试的包。

Otherdeed#17 NFT以140枚以太坊的价格成交:9月8日消息,Yuga Labs元宇宙项目Otherside上地块Otherdeed #17 NFT以140枚以太坊(约22.7万美元)的价格成交,该枚NFT于今年6月30日首次出售,售价为100ETH。[2022/9/8 13:17:01]

const{expect}=require('chai')

const{ethers}=require('hardhat')

现在,为了设置测试,我们将首先创建必要的变量,创建beforeEach函数,该函数在每次测试之前调用,并创建一个空的describe函数,该函数将很快包含我们的测试。

describe('TokenPaymentSplitterTests',()=>{letdeployerletaccount1letaccount2letaccount3letaccount4lettestPaymentTokenletmockPoolbeforeEach(async()=>{??=awaitethers.getSigners()??constTestPaymentToken=awaitethers.getContractFactory('ERC20PresetMinterPauser')??testPaymentToken=awaitTestPaymentToken.deploy('TestPaymentToken','TPT')??awaittestPaymentToken.deployed(。)?describe('Addpayeeswithvaryingamountsanddistributepayments',async()=>{}

}

在这些部分就位后,让我们进入这些测试的核心部分!

支付代币平均分配给多个收款人

在我们的第一个测试中,我们想看看当我们部署一个包含平均分配份额的收款人列表的合约时会发生什么。下面是测试代码。

it('paymenttokenisdistributedevenlytomultiplepayees',async()=>{??payeeAddressArray=??payeeShareArray=??constMockPool=awaitethers.getContractFactory('MockPool')??mockPool=awaitMockPool.deploy(????payeeAddressArray,????payeeShareArray,????testPaymentToken.address??)??awaitmockPool.deployed()??awaittestPaymentToken.mint(mockPool.address,100000)??awaitmockPool????.connect(account1)????.release(account1.address)??awaitmockPool????.connect(account2)????.release(account2.address)??awaitmockPool????.connect(account3)????.release(account3.address)??awaitmockPool????.connect(account4)????.release(account4.address)??constaccount1TokenBalance=awaittestPaymentToken.balanceOf(account1.address)??constaccount2TokenBalance=awaittestPaymentToken.balanceOf(account2.address)??constaccount3TokenBalance=awaittestPaymentToken.balanceOf(account3.address)??constaccount4TokenBalance=awaittestPaymentToken.balanceOf(account4.address)??expect(account1TokenBalance).to.equal(25000)??expect(account2TokenBalance).to.equal(25000)??expect(account3TokenBalance).to.equal(25000)??expect(account4TokenBalance).to.equal(25000)

BTC跌破26000美元:BTC跌破26000美元,现报25989.0美元,日内跌幅达到8.1%,行情波动较大,请做好风险控制。[2022/6/13 4:21:08]

})

在这个测试中,我们将合约分配给4个收款人,每个人都有10个相同的份额。然后我们向合约发送100000单位的testPaymentToken,并向每个收款人发放付款。在测试中可以注意到,每个收款人都在调用函数来向自己释放代币。

{??payeeAddressArray=??payeeShareArray=??constMockPool=awaitethers.getContractFactory('MockPool')??mockPool=awaitMockPool.deploy(????payeeAddressArray,????payeeShareArray,????testPaymentToken.address??)??awaitmockPool.deployed()??awaittestPaymentToken.mint(mockPool.address,100000)??awaitmockPool????.connect(account1)????.release(account1.address)??awaitmockPool????.connect(account2)????.release(account2.address)??awaitmockPool????.connect(account3)????.release(account3.address)??awaitmockPool????.connect(account4)????.release(account4.address)??constmockPoolTestPaymentTokenBalance=awaittestPaymentToken.balanceOf(????mockPool.address??)??constaccount1TokenBalance=awaittestPaymentToken.balanceOf(account1.address)??constaccount2TokenBalance=awaittestPaymentToken.balanceOf(account2.address)??constaccount3TokenBalance=awaittestPaymentToken.balanceOf(account3.address)??constaccount4TokenBalance=awaittestPaymentToken.balanceOf(account4.address)??expect(mockPoolTestPaymentTokenBalance).to.equal(1)??expect(account1TokenBalance).to.equal(30303)??expect(account2TokenBalance).to.equal(15151)??expect(account3TokenBalance).to.equal(33333)??expect(account4TokenBalance).to.equal(21212)

ANT Capital创始合伙人:USDT崩盘可能性较小:金色财经报道,ANT Capital创始合伙人Jun Yu在社交媒体上发文称,虽然USDT仍有无法100%赎回的风险,但崩盘可能性较小。Tether目前具有偿付能力,因为其储备资产价值多于USDT市值,当前Tether资产价值约为824亿美元,负债约为822亿美元(其中821亿美元为发行的稳定币)。尽管 Tether 的资产大于负债,但 Tether 在对资产进行估值时并未考虑流动性风险和违约风险,也未准备相应的预期信托损失准备金,85.64% 的Tether资产流动性较好,现金比例不到 5%,主要是美国国库券、商业票据和存单等,另外14.36%由公司债券、基金、贵金属和担保贷款组成。现金、美国国库券和货币资金相对安全,最大的问题是商业票据和存款证的风险,虽然到期日只有44天且评级为A-1,但流动性风险和违约风险不容忽视。

总的来说,Tether 60% 以上的资产具有良好的流动性,可以满足赎回的需求。以USDT在加密市场的渗透率,短期内不太可能触及60%赎回率,有人将 USDT 与 UST 进行比较,但两者完全不同。如果USDT破锚,USDT的资产储备不会像LUNA那样崩溃,因为这些储备资产是相对安全的,持有者没有理由恐慌。[2022/5/22 3:33:47]

})

看起来收款人还能拿到钱,但注意到什么了吗?合约中还剩下一个单位的支付代币!由于Solidity没有小数,当它达到最低单位时,它通常会四舍五入,这可能会导致合约尘埃飞扬,就像我们在这里看到的。不过不用担心,因为我们预计未来会有支付代币流入合约,所以它将继续分发。

支付代币不均匀地分配给多个收款人,并将额外的支付代币发送到池中

这与之前的测试类似,不过在资金被释放给收款人之间增加了更多支付代币发送到池中。这表明,随着支付代币不断流入模拟池合约,数学仍然可以确保收款人收到正确的金额。

it('paymenttokenisdistributedunevenlytomultiplepayeeswithadditionalpaymenttokensenttopool',async()=>{??payeeAddressArray=??payeeShareArray=??constMockPool=awaitethers.getContractFactory('MockPool')??mockPool=awaitMockPool.deploy(????payeeAddressArray,????payeeShareArray,????testPaymentToken.address??)??awaitmockPool.deployed()??awaittestPaymentToken.mint(mockPool.address,100000)??awaitmockPool????.connect(account1)????.release(account1.address)??awaitmockPool????.connect(account2)????.release(account2.address)??awaittestPaymentToken.mint(mockPool.address,100000)??awaitmockPool????.connect(account3)????.release(account3.address)??awaitmockPool????.connect(account4)????.release(account4.address)??awaitmockPool????.connect(account1)????.release(account1.address)??awaitmockPool????.connect(account2)????.release(account2.address)??constmockPoolTestPaymentTokenBalance=awaittestPaymentToken.balanceOf(????mockPool.address??????)??constaccount1TokenBalance=awaittestPaymentToken.balanceOf(account1.address)??constaccount2TokenBalance=awaittestPaymentToken.balanceOf(account2.address)??constaccount3TokenBalance=awaittestPaymentToken.balanceOf(account3.address)??constaccount4TokenBalance=awaittestPaymentToken.balanceOf(account4.address)??expect(mockPoolTestPaymentTokenBalance).to.equal(1)??expect(account1TokenBalance).to.equal(60606)??expect(account2TokenBalance).to.equal(30303)??expect(account3TokenBalance).to.equal(66666)??expect(account4TokenBalance).to.equal(42424)

})

现在所有的测试都就绪了,是时候运行它们了,看看它们是否工作!在项目根文件夹中,使用npxhardhattest启动测试。如果一切都是正确的,那么你应该看到如下图所示的所有绿色格子。

如上所述,我们需要做更多的测试,以确保整个项目/协议按照预期工作,支付拆分器是它的集成部分。这将意味着更多的单元测试来覆盖所有可用的功能,以及更复杂的集成测试,这取决于具体用例。

总结

支付是许多加密协议的一个常见方面,有几种方法可以解决它们。今天我们学习了一种管理支付的方法,尽管用户甚至可以在此合约的基础上构建以满足您的特定需求,如跨多个代币启用支付,添加额外的收款人或移除收款人,或在一个函数调用中同时分发所有支付。

Source:https://medium.com/coinmonks/create-an-erc20-token-payment-splitting-smart-contract-c79436470ccc

本文来自去中心化金融社区,星球日报经授权转载。

标签:TOKENTOKEKENTOKHealth TokenMr.FOX TOKENPlaas Farmers Tokenglobalusdtoken

UNI热门资讯
MEX:MEXC關於充值交易賽瓜分23,000XCAD獎勵發放的公告_EXC

尊敬的MEXC用戶:MEXC“充值交易賽瓜分23,000XCAD”活動已結束。現將交易排行獎名單公佈如下:恭喜以上獲得本次活動獎勵的用戶,其他獎項由於獲獎人數較多公告未展示,獎勵將於3日內發放,

1900/1/1 0:00:00
GAT:Gate.io 关于 Startup 首发 DAO SHO 项目NFTrade (NFTD) 的公告_Digital Currency Aggregate

Gate.io已上线“Startup上线通道”,为给优质初创项目提供更为快捷的上币通道,和给予用户提供早期投资机会.

1900/1/1 0:00:00
TOKEN:imToken 和 NFTGO 达成战略合作_TOKE

我们很高兴地宣布,imToken与NFTGO达成了战略合作,将共同促进NFT推广普及,一起帮助?imToken用户更好地探索NFT市场,管理NFT资产.

1900/1/1 0:00:00
ALA:中币关于上线Gala(GALA)的公告_VALAS价格

尊敬的中币用户:????中币将于香港时间2021年9月16日上线Gala。具体安排如下:????1、2021年9月16日17:00开放GALA充值;????2、2021年9月17日16:00开放.

1900/1/1 0:00:00
DOGE:XT关于即将上线JEJUDOGE的公告_UDOGE

尊敬的XT用户:XT即将上线JEJUDOGE,并在创新区开放JEJUDOGE/USDT交易对。具体开通时间,请关注后续公告。“Jejudoge代币是一种以社区为主导的类似于狗狗梗文化.

1900/1/1 0:00:00
数字资产:ZT创新板即将上线LIGHT_YFID

亲爱的ZT用户:ZT创新板即将上线LIGHT,并开启LIGHT/USDT交易对。具体上线时间如下:充值:已开启;交易:2021年9月22日16:00?;LIGHT项目简介:Lightning作为.

1900/1/1 0:00:00