dapp元宇宙鏈遊開發【詳情】技術實現及原始碼實現方式
什麼是dApp和Web3應用?
如果不提及dApp,關於Web3的討論就不會完整。簡而言之,dApp或去中心化應用程式是Web3革命的支柱。術語“Web3應用程式”、“Web3應用程式”、“去中心化應用程式”、“dApps”或“Web3 dApps”在很大程度上都是同義詞。它們都指作為Web3一部分的分散的、通常基於區塊鏈的應用程式。
那麼,什麼是Web3應用程式?許多dApp或Web3應用程式的一個組成部分是所謂的“智慧合約”。有區塊鏈技術經驗的人可能熟悉智慧合約的概念。智慧合約本質上是自動執行的軟體協議,是在以太坊區塊鏈等區塊鏈上執行的程式碼片段。這些會自動“執行”,或在滿足一組相關條款時執行。因此,這些“合約”可以自動驗證和執行不同方之間的交易。
內部函式(僅供合約內部呼叫)
_swapSupportingFeeOnTransferTokens
程式碼速瀏覽
function _swapSupportingFeeOnTransferTokens(address[]memory path,address _to)internal virtual{
for(uint i;i<path.length-1;i++){ DAPP鏈遊開發176應用0206詳細5616
(address input,address output)=(path<i>,path[i+1]);
(address token0,)=UniswapV2Library.sortTokens(input,output);
IUniswapV2Pair pair=IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output));
uint amountInput;
uint amountOutput;
{
(uint reserve0,uint reserve1,)=pair.getReserves();
(uint reserveInput,uint reserveOutput)=input==token0?(reserve0,reserve1):(reserve1,reserve0);
amountInput=IERC20(input).balanceOf(address(pair)).sub(reserveInput);
amountOutput=UniswapV2Library.getAmountOut(amountInput,reserveInput,reserveOutput);
}
(uint amount0Out,uint amount1Out)=input==token0?(uint(0),amountOutput):(amountOutput,uint(0));
address to=i<path.length-2?UniswapV2Library.pairFor(factory,output,path[i+2]):_to;
pair.swap(amount0Out,amount1Out,to,new bytes(0));
引數分析
函式swapETHForExactTokens的入參有2個,出參有0個,對應的解釋如下:
function _swapSupportingFeeOnTransferTokens( DAPP鏈遊開發威:wwqqyy420
address[]memory path,//交易路徑列表
address _to//交易獲得的token傳送到的地址
)internal virtual{
函式_swapSupportingFeeOnTransferTokens相比函式_swap為了支援path中有交易後可變數量的代幣,不需要輸入amounts,但需要額外做一些操作。
實現分析
……
{
//迴圈交易路徑列表
for(uint i;i<path.length-1;i++){
//從path中取出input和output
(address input,address output)=(path<i>,path[i+1]);
//從input和output中算出誰是token0
(address token0,)=UniswapV2Library.sortTokens(input,output);
//獲得input,output的流動池
IUniswapV2Pair pair=IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output));
uint amountInput;
uint amountOutput;
{
//獲取流動池庫存reserve0,reserve1
(uint reserve0,uint reserve1,)=pair.getReserves();
//如果input==token0,那麼(reserveInput,reserveOutput)就是(reserve0,reserve1);反之則相反
(uint reserveInput,uint reserveOutput)=input==token0?(reserve0,reserve1):(reserve1,reserve0);
//amountInput等於流動池餘額減去reserveInput
amountInput=IERC20(input).balanceOf(address(pair)).sub(reserveInput);
//獲取amountOutput
amountOutput=UniswapV2Library.getAmountOut(amountInput,reserveInput,reserveOutput);
}
//如果input==token0,那麼amount0Out就是0,amount1Out就是amountOut;反之則相反
(uint amount0Out,uint amount1Out)=input==token0?(uint(0),amountOutput):(amountOutput,uint(0));
//如果這是最後的一筆交易,那麼to地址就是_to,否則to地址是下一筆交易的流動池地址
address to=i<path.length-2?UniswapV2Library.pairFor(factory,output,path[i+2]):_to;
//執行input和output的交易
pair.swap(amount0Out,amount1Out,to,new bytes(0));
總結
可以看到,因為沒有amounts,需要使用流動池餘額減去庫存來計算amountInput。
外部函式(僅供合約外部呼叫)
swapExactTokensForTokensSupportingFeeOnTransferTokens
程式碼速瀏覽
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[]calldata path,
address to,
uint deadline
)external virtual override ensure(deadline){
TransferHelper.safeTransferFrom(
path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amountIn
);
uint balanceBefore=IERC20(path[path.length-1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path,to);
require(
IERC20(path[path.length-1]).balanceOf(to).sub(balanceBefore)>=amountOutMin,
'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT'
引數分析
函式swapExactTokensForTokensSupportingFeeOnTransferTokens的入參有5個,出參有0個,對應的解釋如下:
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,//交易支付代幣數量
uint amountOutMin,//交易獲得代幣最小值
address[]calldata path,//交易路徑列表
address to,//交易獲得的token傳送到的地址
uint deadline//過期時間
)external virtual override ensure(deadline){
函式swapExactTokensForTokensSupportingFeeOnTransferTokens相比函式swapExactTokensForTokens,少了amounts,因為交易後可變數量的代幣不能做amounts的預測。
實現分析
……
//檢查交易是否過期
ensure(deadline)
{
//將amountIn數量的path[0]代幣從使用者賬戶中轉移到path[0],path[1]的流動池
TransferHelper.safeTransferFrom(
path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amountIn
);
//記錄to地址path[path.length-1]代幣的餘額
uint balanceBefore=IERC20(path[path.length-1]).balanceOf(to);
//按path列表執行交易集合
_swapSupportingFeeOnTransferTokens(path,to);
//如果to地址獲得的代幣數量小於amountOutMin,交易失敗
require(
IERC20(path[path.length-1]).balanceOf(to).sub(balanceBefore)>=amountOutMin,
'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT'
);
}
該函式適用於支付確定數量的代幣,獲得不定數量的代幣,且在path路徑列表中有交易後數量可變的代幣。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70029396/viewspace-2953408/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 元宇宙鏈遊開發技術實現及原始碼實現方式元宇宙原始碼
- 元宇宙鏈遊系統開發原始碼(成熟技術)元宇宙原始碼
- NFT元宇宙鏈遊/鏈遊系統技術開發/應用/DAPP元宇宙APP
- nft鏈遊元宇宙(NFT遊戲)系統模式開發技術詳情元宇宙遊戲模式
- NFT鏈遊遊戲元宇宙系統技術開發設計詳情遊戲元宇宙
- 陽光農場鏈遊元宇宙系統開發技術詳情元宇宙
- GameFi+NFT鏈遊系統開發/NFT遊戲元宇宙技術開發詳情GAM遊戲元宇宙
- NFT鏈遊系統開發丨NFT元宇宙遊戲功能開發技術詳情元宇宙遊戲
- 金武盟NFT鏈遊元宇宙系統開發詳情(技術分析)元宇宙
- NFT鏈遊系統技術開發/NFT元宇宙鏈遊開發/Defi/應用/DAPP元宇宙APP
- NFT遊戲GameFi元宇宙(鏈遊遊戲)系統原始碼開發(詳情方案)遊戲GAM元宇宙原始碼
- 區塊鏈商城dapp系統開發技術詳情丨區塊鏈商城dapp開發原始碼案例部署區塊鏈APP原始碼
- 3D丨2D鏈遊系統開發實現技術方案及原始碼3D原始碼
- NFT鏈遊元宇宙遊戲/系統開發/NFT元宇宙技術開發搭建元宇宙遊戲
- 元宇宙遊戲系統開發(功能詳情)丨元宇宙鏈遊系統開發(開發原理)元宇宙遊戲
- ProTradex(PRT)普瑞緹/提智慧合約系統開發實現技術方案及原始碼詳情原始碼
- 量化交易系統開發技術實現方案及原始碼原始碼
- NFT遊戲鏈遊系統開發技術詳細丨NFT遊戲鏈遊DAPP開發原始碼模式遊戲APP原始碼模式
- 深入分析馬蹄鏈DAPP智慧合約系統開發實現技術詳細及方案APP
- 3D-2D鏈遊系統開發實現技術方案.原始碼3D原始碼
- 佛薩奇2.0版開發功能丨原力元宇宙MetaForce佛薩奇2.0系統開發實現技術詳情及分析元宇宙
- NFT遊戲鏈遊開發設計丨NFT鏈遊元宇宙系統技術開發丨DAPP丨NFT遊戲元宇宙APP
- NFT數藏(鏈遊)元宇宙藝術交易系統功能開發詳情元宇宙
- NFT鏈遊/NFT遊戲元宇宙開發/鏈遊系統開發設計詳情遊戲元宇宙
- 3D元宇宙鏈遊開發說明 鏈遊系統開發技術方案 3D鏈遊原始碼模式3D元宇宙原始碼模式
- NFT初元星球農場鏈遊系統開發詳情丨DAPP技術框架介紹APP框架
- NFT卡牌鏈遊系統dapp開發元宇宙鏈遊APP元宇宙
- NFT鏈遊元宇宙遊戲系統技術開發程式設計丨DAPP丨NFT元宇宙遊戲程式設計APP
- 泰山眾籌4.0商城開發詳情丨泰山眾籌4.0商城系統開發實現技術案例及原始碼原始碼
- 潮玩宇宙/系統開發/NFT鏈遊/NFT元宇宙開發技術元宇宙
- NFT元宇宙鏈遊開發|需求|遊戲|原始碼示例元宇宙遊戲原始碼
- Dapp/Stepn跑鞋鏈遊系統開發詳細技術案例/成熟方案/原始碼功能APP原始碼
- GameFi鏈遊系統技術開發/NFT遊戲元宇宙系統開發詳情分析GAM遊戲元宇宙
- 鏈遊開發:數字藏品開發技術詳情
- IPPswap流動性挖礦系統開發原始碼DAPP技術詳情原始碼APP
- 區塊鏈多鏈錢包開發詳情版丨區塊鏈多鏈錢包系統開發實現技術方案及邏輯區塊鏈
- DAPP/Stepn跑鞋鏈遊跑步運動模式/系統開發/技術案例/方案詳細/規則及原始碼APP模式原始碼
- 區塊鏈技術Python(鏈遊)元宇宙系統開發程式詳細講解方案區塊鏈Python元宇宙