在加密貨幣的幾乎每個領域,支付都是一個反復出現的話題,特別是向多個質押者提供支付。例如,DAO希望為多個計劃提供資金,DEX希望合并向某些參與者分配交易費用,或者團隊希望將代幣作為月薪分發給團隊成員。
智能合約使我們能夠自動化這些類型的支付功能,這就限制了人工管理支付所導致的潛在錯誤,并允許我們將寶貴的時間花在其他生產性任務上。
今天,我們將學習如何創建自己的ERC20代幣支付拆分器,它可以合并到任何項目中!
先決條件和設置
下面的內容要求你對Solidity有點熟悉,不過任何人都可以學習。
項目架構
我們將創建兩個合約。第一個將是ERC20代幣支付拆分智能合約,第二個將是模擬池智能合約。ERC20代幣支付拆分器智能合約將是抽象的,并持有用于管理收付方及其各自支付部分的邏輯和數據。模擬池將繼承ERC20代幣支付拆分器,以便我們可以自動將支付分發給多個質押者。在兩個合約中拆分支付功能的原因有兩個:
展示在真實世界的用例中代幣支付拆分合約的使用
確保代幣支付拆分合約足夠靈活,任何人都可以選擇并集成到自己的項目中
OpenZeppelin已有一個名為PaymentSplitter
SafeERC20
paymentToken是我們用于支付的ERC20代幣的地址。
_totalShares提供來自所有收款人的份額相加。
_totalTokenReleased是已支付給所有收款人的支付代幣總額。
_payees提供了當前所有收款人地址的數組。
_shares是收款人地址與分配給他們的份額數量的映射。
_tokenReleased是收款人地址到支付代幣數量的映射。
現在放置一個接受三個參數的構造函數。第一個參數是我們希望在合約部署中初始化的收款人的數組。第二個參數是每個收款人的份額數組。第三個是將用于支付的ERC20代幣的地址。
pragmasolidity0
構造函數包含一個require語句,以確保兩個數組具有相同的長度,以便每個收款人都有分配給他們的份額。還有另一個require語句,以確保合約初始化與至少有一個收款人。
還有一個for循環,它將每個收款人及其份額分配我們上面創建的變量。這是通過一個名為_addPayee的函數完成的,我們將很快創建這個函數。
CashApp創建者刺殺案嫌疑人被捕,系與Bob Lee相識的科技企業家:4月14日消息,經舊金山地區檢察官Brooke Jenkins證實,刺殺Cash App創建者Bob Lee的嫌疑人,科技企業家Nima Momeni已被捕。官方回應稱,Nima Momeni認識BobLee,但不愿就作案動機置評。Nima Momeni將于周五被提審,檢察官表示提出一項動議,要求其不得被保釋。(CNBC)[2023/4/14 14:03:09]
構造函數就緒后,再添加幾個函數來調用和獲取合約變量。
pragmasolidity0
functionshares(addressaccount)publicviewreturns(uint256){??return_shares;}functionpayee(uint256index)publicviewreturns(address){??return_payees;}
現在我們將創建用于添加收款人的函數。
pragmasolidity0
_addPayee是我們在構造函數中調用的用于設置收款人數組的函數。這個函數有兩個參數,收款人的帳戶和與其相關的份額數量。然后它會檢查賬戶是否為零地址,份額是否大于零,以及該賬戶是否已經注冊為收款人。如果所有檢查都通過,那么我們將數據添加到各自的變量中。
現在讓我們添加一個函數來支持將代幣分發給收款人。
pragmasolidity0
Release是一個任何人都可以調用的函數,它接受一個現有收款人帳戶的參數。來分析一下這個函數中發生了什么。首先,它檢查帳戶是否有分配給它的份額。然后,它創建一個名為tokenTotalReceived的變量,該變量將合約的當前代幣余額與之前釋放的代幣總數相加。創建另一個稱為payment的變量,該變量確定收到的代幣總額中有多少是欠賬戶的,然后減去多少已經釋放到賬戶。然后,一個require語句檢查當前支付金額是否大于零(即,當前是否欠下了更多代幣)。如果該檢查通過,則更新賬戶的tokenReleased,并更新totalTokenReleased。最后,支付給賬戶的代幣金額被轉賬。
現在函數已經就位了!但是這個合約還有一件事要做....事件!
我們將在合約中添加兩個事件,將事件添加到合約頂部是一個良好的實踐。
pragmasolidity0
functionrelease(addressaccount)publicvirtual{??///existingFunctionCode??emitPaymentReleased(account,payment);}
Ripple將推出規模達10億XRP的贈款計劃,激勵開發者基于該平臺創建項目:3月17日消息,跨境支付網絡Ripple將在未來10-20年發放 10 億個 XRP(目前價值約8億美元) 代幣作為贈款,供開發人員基于其面向支付的分布式賬本創建項目。報道還透露,Ripple公司在今年1月份的估值為150億美元。
Ripple 開源開發平臺總經理 Monica Long 表示,在更多開發人員在其名為 XRP Ledger 的平臺上構建項目后,Ripple 被鼓勵加入其資助計劃。新資金擴大了該初創公司去年啟動的贈款計劃。它之前已經為 50 多個開源項目提供了超過 600 萬美元的資金。 (The Information)[2022/3/17 14:02:12]
現在代幣支付拆分合約已經建立!為了理解這在真實場景中是如何工作的,讓我們創建一個模擬池合約,它將導入代幣支付拆分器。
創建模擬池合約
這個合約不會很復雜,因為我們只是想演示如何集成代幣支付拆分器。這個合約定期收到我們想分發給收款人列表的特定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);??}}
在這份合約中,導入三樣東西。首先是OpenZeppelin的Ownable實用程序,它在某些函數上使用唯一的onlyOwner修飾符。第二個是SafeERC20,它允許安全的ERC20代幣轉賬,正如將在合約中看到。第三個是我們的TokenPaymentSplitter合約。
在MockPool構造函數中,我們需要TokenPaymentSplitter提供相同的三個參數,我們只是將它們傳遞給我們繼承的合約。
巴西中央銀行律師提議創建數字美元MttP:巴西中央銀行律師Marcelo M. Prates提議創建一種CBDC,它將由雇主在支付工資時發行,只有在個人和企業之間流通后才能到達央行。MttP將需要立法行動來建立,并被視為合法貨幣,在此過程中需要進行一些繁重的工作,但其實現相對簡單。MttP模型通過賦予負責支付工資的公共和私人機構發行新貨幣的權力,直接解決失業問題。不必為現有資產設押,當雇主簽發MttP支付其雇員時,也不會產生任何負債。從這個意義上說,MttP是憑空創造出來的,只有當它出現在員工數字錢包中時才成為資產。具有稅務識別號的雇主必須為持有納稅人識別號的雇員設置數字錢包。這些錢包可由PayPal或Coinbase等金融科技公司開發,使用已存在的技術。但錢包將得到驗證,最終由央行管理。由于所有用戶將通過稅務識別號進行識別,因此錢包將自動符合反洗錢規則。一旦美國地方或國家政府宣布進入緊急狀態,受影響的雇主將被自動授權以MttP支付一定數額作為下個月工資。MttP系統通過使目標刺激計劃能夠以遞延成本迅速實施,克服了當前貨幣體系在面臨極端情況時的局限性。MttP也可以作為CBDC的沙箱。(CoinDesk)[2020/4/23]
在這個合約中添加了另一個函數,drainTo。它實際上與TokenPaymentSplitter合約沒有任何關系。它只是在另一個沒有設置為支付代幣的ERC20代幣被發送到池時的一種安全機制,然后有一種方法讓合約所有者釋放該代幣。
測試合約
測試智能合約與創建它們同樣重要。這些合約處理的資產通常是屬于其他人的,所以作為開發人員,我們有責任確保這些資產按照他們應該的方式工作,并且我們的測試可以覆蓋幾乎所有的邊緣情況。
將在這里進行的測試是一些示例,以顯示TokenPaymentSplitter智能合約按照我們的預期工作。在處理自己的項目時,可能希望創建專門適合自己的用例的測試。
為了支持我們的測試,我們希望包含一個ERC20代幣,為此,我們將創建一個新的solididity文件,該文件導入OpenZepplinERC20模板以供我們的測試使用。在合約文件夾中,創建一個名為Imports.sol的新文件,并包括以下代碼:
pragmasolidity^0.8.0;import"
現在,在test文件夾中創建一個名為test.js的文件。在這個文件的頂部,我們將導入支持我們的測試的包。
const{expect}=require('chai')const{ethers}=require('hardhat')
前SoFi CEO創建的區塊鏈公司完成首次區塊鏈資產證券化:由前SoFi首席執行官Mike Cagney創建的區塊鏈公司Figure Technologies已經完成了其在區塊鏈上的首個資產證券化過程。該公司稱其為“突破性”成就,表示該流程幫助相關各方節省了超過100個基點的運營和第三方成本。此前消息,Figure Technologies已完成了1.03億美元的C輪融資。該輪融資使公司的總資金超過2.25億美元,估值達到12億美元。(The Block)[2020/3/11]
現在,為了設置測試,我們將首先創建必要的變量,創建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。)
分析 | Atoshima Konsato一周轉入超10萬枚ETH 轉入地址創建至轉賬平均不足5小時 ?:據第三方大數據評級機構RatingToken監測數據顯示,近一周ETH轉入前3名的合約分別是Kraken_5(143126.76)、 Atoshima Konsato(129743.03)、R1Exchange(78057.10),其中Atoshima Konsato七日轉入129743.03枚ETH。RatingToken團隊研究發現,Atoshima Konsato愿景是打造一個基于AI的去中心化的金融系統,自2月5日智能合約創建以來,累計轉入1374184枚ETH,參與地址數43281,轉賬筆數129307,轉入Atoshima Konsato的地址自創建至發生該筆轉賬平均用時4.37小時。RatingToken特別提示,投資者須高度警惕此類項目。詳情見原文鏈接。[2018/11/15]
在這個測試中,我們將合約分配給4個收款人,每個人都有10個相同的份額。然后我們向合約發送100000單位的testPaymentToken,并向每個收款人發放付款。在測試中可以注意到,每個收款人都在調用函數來向自己釋放代幣。
支付代幣不均勻地分配給多個收款人
在第二個測試中,我們希望確保即使每個收款人的份額分配不均,數學計算仍然有效。
it('paymenttokenisdistributedunevenlytomultiplepayees',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)??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:KENTOKETOKENTOKBlue Whale TokenAirdropTokenTCW Tokengoldricetoken
在廣州越秀區較場東路,盧文鋒通過手持終端實時查看臨時泊位的車輛狀態。孫秋霞攝中新網廣州9月28日電(孫秋霞)隨著信息技術不斷發展,區塊鏈在稅收征管中應用日益廣泛.
1900/1/1 0:00:00DeFi數據 1.DeFi總市值:1148.6億美元 DeFi總市值數據來源:Coingecko2.過去24小時去中心化交易所的交易量:54.
1900/1/1 0:00:00你愛刷抖音、快手嗎?你在騰訊視頻、優酷、愛奇藝看過愛豆影視綜藝作品嗎?如果答案是“是”的,這正反映了一個事實:現在互聯網絕大多數帶寬都用于觀看視頻.
1900/1/1 0:00:00ETH2質押機制 2020年12月1日,以太坊啟動信標鏈,開始從工作量證明向權益證明過渡——以太坊2.0進入第0階段。以太坊網絡將由質押32個及以上ETH的驗證者保護.
1900/1/1 0:00:001.什么是數字人民幣??數字人民幣是由中國人民銀行發行的數字形式的法定貨幣。由指定運營機構參與運營,以廣義賬戶體系為基礎,支持銀行賬戶松耦合功能,與實物人民幣等價,具有價值特征和法償性、支持可控.
1900/1/1 0:00:00DeFi可以說是區塊鏈歷史上最偉大的創新之一,而流動性挖礦是DeFi火爆的導火索。得益于去中心化協議Compound,流動性挖礦在2020年夏天一鳴驚人.
1900/1/1 0:00:00