買比特幣 買比特幣
Ctrl+D 買比特幣
ads
首頁 > AVAX > Info

KEN:一文學習如何創建自己的ERC20代幣支付拆分器_itokenwallet下載

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

BitfinexAlpha:比特幣現貨交易量自上月達到峰值后大幅下降:4月18日消息,根據BitfinexAlpha最新報告,3月份消費者價格指數(CPI)有所改善,盡管仍居高不下。月通貨膨脹率下降主要是由于能源價格大幅下降。剔除食品和能源,核心通脹依然存在。然而,我們認為過去一年已經做了足夠的工作,可以暫停加息。雖然我們預計5月3日還會加息25個基點,但在那之后預計會進一步收緊。支持這一觀點的事實是,生產者價格指數(PPI),或批發通脹,見證了近三年來的最大跌幅。能源價格和貿易服務的大幅下跌在一定程度上夸大了該指數的跌幅,盡管本月早些時候OPEC+宣布石油減產后,能源價格可能再次飆升,但其他方面應該有足夠的下行壓力,讓美聯儲可以從經濟進一步收緊中喘息一下。[2023/4/18 14:10:20]

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

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

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

CryptoPunk #5179以119ETH的價格成交:金色財經報道,最新數據顯示,CryptoPunk #5179以119ETH的價格成交。[2023/4/3 13:40:54]

}

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

const{expect}=require('chai')

const{ethers}=require('hardhat')

現在,為了設置測試,我們將首先創建必要的變量,創建beforeEach函數,該函數在每次測試之前調用,并創建一個空的describe函數,該函數將很快包含我們的測試。

Aptos鏈上SUCKR項目疑似rug pull,相關代幣暴跌99.99%:金色財經報道,據區塊鏈安全審計公司Beosin旗下Beosin EagleEye安全風險監控、 預警與阻斷平臺監測顯示,Aptos鏈上的SUCKR項目疑似rug pull,賬戶地址0x7600ee2b357ff993bd00a303a00f57a4c3db44263a1e8be7862ef1266bcecff3調用mint_SUCKR(admin特權函數)函數鑄造大量SUCKR代幣兌換為USDT,導致SUCKR代幣24h價格暴跌99.99%。[2023/3/10 12:54:24]

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)

Google Cloud Web3技術負責人加入Alchemy Pay管理顧問委員會:金色財經報道,Alchemy Pay 官方宣布正式從中心化管理制過渡至管理顧問委員會管理制。據官網公示,委員會成員包括前 Lazada SVP、Grab CPO Andy Ng,Google Cloud Web3 創始團隊成員&技術負責人、Libra 創始團隊成員 Ethan Wang,阿根廷傳奇足球運動員、Alchemy Pay 品牌大使 Javier Mascherano 等七位委員組成,在合規、風控、產品、安全、市場等與加密支付相關的領域擁有豐富經驗。[2023/2/16 12:11:31]

})

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

《南華早報》:加密熊市是香港對虛擬資產施加監管的理想時機:11月15日消息,《南華早報》今日撰文《加密熊市是香港對虛擬資產施加監管的理想時機》(Cryptocurrency bear market is an ideal time for Hong Kong to put its regulatory stamp on virtual assets),文章指出香港財經事務及庫務局在金融科技周幾天后發布了有關虛擬資產的政策聲明,隨后FTX破產引發市場震蕩,一些批評人士認為政策聲明來得太晚,但如果香港想成為國際虛擬資產中心,相比于牛市,在混亂的熊市中展示自己的力量和發展監管會顯得更加強大,這場風暴是對香港監管機構開發結構的一次很好的壓力測試,在此基礎上可以建立一個可持續和有彈性的國際虛擬資產中心。[2022/11/15 13:06:54]

})

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

AVAX
LARIX:Gate.io 即將首發上線Larix (LARIX)交易的公告_AquariusCoin

Gate.io將于2021年9月17日12:00上線Larix(LARIX)交易。Larix是Solana公鏈的終極借貸門戶,采用動態利率模型,創建高效的風險管理資金池,在保障資產安全性的前提下.

1900/1/1 0:00:00
ALA:幣安逐倉槓桿新增 GALA、XEC 資產,BUSD年利率低至6.20%!_BUSD

親愛的用戶:幣安逐倉槓桿已增加GALA、XEC資產,並開放GALA/USDT、GALA/BUSD、GALA/BTC、XEC/USDT、XEC/BUSD逐倉交易對.

1900/1/1 0:00:00
LOGO:德國私人銀行Hauck & Aufh?user收購加密托管平臺Kapilendo Custodian_The Smokehouse

據Thepaypers9月20日消息,總部位于德國的私人銀行Hauck&Aufh?userPrivatbankiers宣布與Bloxxon就收購加密貨幣托管機構KapilendoCust.

1900/1/1 0:00:00
BIT:一文了解 Layer2 擴容方案 Arbitrum_bitkeep中文名叫什么

為了更好地閱讀本文,你需要先了解以太坊及其轉賬基本概念。閱讀這篇文章的「以太坊簡介」和「以太坊轉賬」了解.

1900/1/1 0:00:00
SDT:關于WBF對已上線幣種的下線調整公告(四十六)_USDT

尊敬的用戶: 為了營造健康的數字資產環境,給用戶提供良好的交易體驗,根據《WBF交易分區及轉板試行管理辦法‘退市規則’》規定,WBF審核團隊將平臺已上線項目進行了全面的市場監測和進展跟蹤.

1900/1/1 0:00:00
OIN:“尋找寶藏幣,交易贏獎勵,瓜分50,000USDT!”獎勵已發放_COI

親愛的KuCoin用戶:KuCoin已完成“尋找寶藏幣,交易贏獎勵,瓜分50,000USDT!”的獎勵發放!所有活動福利的獎勵均已發放.

1900/1/1 0:00:00
ads