以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads

一文學習如何創建自己的ERC20代幣支付拆分器_KEN:GOZ Fan Token

Author:

Time: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。最后,支付給賬戶的代幣金額被轉賬。

CZ:曾起訴Binance的VC如今成為了Binance Labs第二期基金的LP:7月15日消息,Binance創始人CZ于今日發布六周年公開信,他在信中表示,Binance的成長并不是一帆風順的。此前,一家潛在風險投資機構向Binance提起訴訟,這場官司持續了若干年,Binance最終獲得全面勝利。官司結束幾年后,在Binance的邀請下,這家潛在投資機構還成為了Binance Labs第二期基金的有限合伙人,至今于Binance維持著良好的關系,大部分問題都可以得到解決。

據悉,紅杉資本曾于2018年在香港對CZ提起訴訟,指控他在談判期間接觸IDG資本,違反了排他性協議。[2023/7/15 10:56:42]

現在函數已經就位了!但是這個合約還有一件事要做....事件!

我們將在合約中添加兩個事件,將事件添加到合約頂部是一個良好的實踐。

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);??}

Web3啟動加速器Beacon新一期Demo Day開放申請:金色財經報道,由Polygon聯合創始人Sandeep Nailwal推出的Web3啟動加速器Beacon官方宣布新一期Demo Day已正式開放申請,此前該加速器Demo Day已吸引了Paradigm、Polychain Capital、LightSpeed等頭部風投參與。Sandeep Nailwal 于去年12月推出了Beacon,旨在通過指導和資金支持來資助早期加密項目并提供為期12周的計劃來幫助和資助創業者。[2023/7/15 10:56:08]

}

在這份合約中,導入三樣東西。首先是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的文件。在這個文件的頂部,我們將導入支持我們的測試的包。

日本國際加密峰會 IVS Crypto 將于 6 月 28 日至 30 日舉行:4月21日消息,IVS KYOTO 執行委員會宣布將于 2023 年 6 月 28 日至 30 日在日本京都國際展覽中心 Miyako Messe 和京都 Rohm 劇院舉辦日本國際加密峰會 IVS Crypto,IVS Crypto 2023 KYOTO 是日本區塊鏈周的主要活動,是 Web3 企業家、投資者、開發者、媒體、以及政府機構的盛會。 本次峰會的演講者包括 Aptos 的首席執行官 Mo Shaikh、日本 Web3 白皮書起草者和自民黨 web3PT 秘書長鹽崎彰久、Scroll 聯合創始人 Sandy Peng、穩定幣 USDC 的發行商 Circle 首席執行官 Jeremy Allaire、日本銀行 CBDC 政策負責人鳩貝淳一郎、Digital Garage 聯合創始人和元 MIT 媒體實驗室主管伊藤穰一;Ripple 全球戰略戰略和運營副總裁吉川繪美以及 Astar Network 的 CEO 渡辺創太等。日本區塊鏈周由 Non Fungible Tokyo 舉辦,以推動區塊鏈、Web3 的普及和加密貨幣行業的健康發展。2023 年日本區塊鏈周將從 6 月 18 日開始,7 月 13 日結束。[2023/4/21 14:18:09]

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()=>{}

ETH Research Grant首輪資助二次方投票在DoraHacks.io正式開啟:1月16日消息,以太坊研究長期資助Grant(ETH Research Grant)首輪二次方投票已在開發者激勵平臺DoraHacks.io正式開啟。本次投票將首次使用基于PLONK系統的零知識投票(DoraHacks MACI-PLONK)。1月15日-1月20日,vcDORA社區可以通過DoraHacks平臺為所支持的項目進行投票,零知識投票結果將決定首期5000美金Grant分配。

ETH Research Grant旨在長期資助以太坊社區的開發者和研究者,資助課題覆蓋賬戶抽/ERC4337,零知識證明,DeGov,Data Availability,Rollups,zkEVM/zkVM,ERC/EIP,以及以太坊應用采用等。

在第一輪19個BUIDL團隊中,5個BUIDL進入Grant,分別是Eigen Network,Soul Wallet,EthStorage,ERC1155Delta,ZKSAFE。[2023/1/16 11:14:16]

}

在這些部分就位后,讓我們進入這些測試的核心部分!

支付代幣平均分配給多個收款人

在我們的第一個測試中,我們想看看當我們部署一個包含平均分配份額的收款人列表的合約時會發生什么。下面是測試代碼。

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)

Tornado Cash在被實施制裁后存款下降了79%:金色財經報道,根據The Block Research的數據,Tornado Cash在被實施制裁后,存款大幅下降,提款增加。自被制裁以來,該協議僅存入了600萬美元。與前一周的相同時間相比,這意味著下降了78.5%。

與此同時,用戶急于提取資金,導致整體交易量增加。自宣布制裁以來,已從協議中提取了6200萬美元,使其地址中持有的加密貨幣數量減少了15%。其中,僅在前三個小時內就提取了1470萬美元。[2022/8/12 12:19:51]

})

在這個測試中,我們將合約分配給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)

})

看起來收款人還能拿到錢,但注意到什么了嗎?合約中還剩下一個單位的支付代幣!由于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

本文來自去中心化金融社區,星球日報經授權轉載。

Tags:TOKTOKENKENTOKEFSP TokenGOZ Fan TokenWater Rabbit TokenTESE Token

以太坊價格
比特幣成為薩爾瓦多法幣的第十天,反對派燒了比特幣ATM_比特幣:CHI

作者|秦曉峰 編輯|郝方舟 出品|Odaily星球日報9月7日,比特幣合法化法案在拉美國家薩爾瓦多正式生效,比特幣終成法定貨幣.

1900/1/1 0:00:00
幣安將上線GALA 1-25倍 U本位永續合約_ACE:Decentralized Community Investment Protocol

親愛的用戶:幣安將於東八區時間2021年09月18日上午11:30上線GALAUSDT1-25倍U本位永續合約。注意:GALAU本位永續合約是正向合約,即穩定幣合約,採用穩定幣作為保證金.

1900/1/1 0:00:00
關于上線CHIA(XCH)及其交易的公告_MEM:meme幣成功

尊敬的EXX用戶:? ????您好!根據市場的情況及用戶的建議,EXX將于香港時間2021年4月21日12:00上線開放XCH/USDT、XCH/ETH交易市場,用戶可提前準備.

1900/1/1 0:00:00
SushiSwap MISO平臺遭攻擊,被盜逾300萬美元的ETH_SUSHI:shibking幣價格今日行情

本文來自Decrypt,原文作者:AndrewAsmakovOdaily星球日報譯者?|念銀思唐據報道,SushiSwap的Launchpad平臺MISO遭到攻擊,黑客竊取了864.8枚ETH.

1900/1/1 0:00:00
關于上線CECF的公告_EER:Bitblocks Fire

關于上線CECF的公告 尊敬的用戶: DeerBitGlobal交易平臺將于2021年9月18日10:00在幣幣交易正式開啟CECF/USDT交易.

1900/1/1 0:00:00
Gate.io 非首發上線Startup項目 X World Games (XWG) 及免費認購規則公告(免費瓜分329,406 個XWG)_Gate.io:gate.io怎么下載

關于Gate.ioStartup免費空投計劃為回饋平臺用戶,Gate.io上線“免費空投計劃”,在Startup區不定期進行區塊鏈項目的免費空投計劃.

1900/1/1 0:00:00
ads