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遊戲鏈遊DAPP開發原始碼模式遊戲APP原始碼模式
- 3D丨2D鏈遊系統開發實現技術方案及原始碼3D原始碼
- 3D-2D鏈遊系統開發實現技術方案.原始碼3D原始碼
- nft鏈遊元宇宙(NFT遊戲)系統模式開發技術詳情元宇宙遊戲模式
- 金武盟NFT鏈遊元宇宙系統開發詳情(技術分析)元宇宙
- 陽光農場鏈遊元宇宙系統開發技術詳情元宇宙
- NFT鏈遊遊戲元宇宙系統技術開發設計詳情遊戲元宇宙
- NFT鏈遊系統技術開發/NFT元宇宙鏈遊開發/Defi/應用/DAPP元宇宙APP
- NFT鏈遊系統開發丨NFT元宇宙遊戲功能開發技術詳情元宇宙遊戲
- GameFi+NFT鏈遊系統開發/NFT遊戲元宇宙技術開發詳情GAM遊戲元宇宙
- 鏈遊開發:數字藏品開發技術詳情
- 區塊鏈商城dapp系統開發技術詳情丨區塊鏈商城dapp開發原始碼案例部署區塊鏈APP原始碼
- NFT遊戲GameFi元宇宙(鏈遊遊戲)系統原始碼開發(詳情方案)遊戲GAM元宇宙原始碼
- 量化交易系統開發技術實現方案及原始碼原始碼
- Dapp/Stepn跑鞋鏈遊系統開發詳細技術案例/成熟方案/原始碼功能APP原始碼
- 3D元宇宙鏈遊開發說明 鏈遊系統開發技術方案 3D鏈遊原始碼模式3D元宇宙原始碼模式
- 深入分析馬蹄鏈DAPP智慧合約系統開發實現技術詳細及方案APP
- ProTradex(PRT)普瑞緹/提智慧合約系統開發實現技術方案及原始碼詳情原始碼
- NFT鏈遊/NFT遊戲元宇宙開發/鏈遊系統開發設計詳情遊戲元宇宙
- 泰山眾籌4.0商城開發詳情丨泰山眾籌4.0商城系統開發實現技術案例及原始碼原始碼
- 智慧合約鏈遊開發詳情丨智慧合約鏈遊系統開發(開發方案)及原始碼分析原始碼
- DAPP鏈遊質押挖礦開發詳情丨DAPP鏈遊流動性質押挖礦分紅系統開發成熟案例及原始碼部署APP原始碼
- DAPP/Stepn跑鞋鏈遊跑步運動模式/系統開發/技術案例/方案詳細/規則及原始碼APP模式原始碼
- NFT/Stepn跑鞋鏈遊專案/系統開發/方案詳細/技術詳情/原始碼說明原始碼
- NFT遊戲鏈遊開發設計丨NFT鏈遊元宇宙系統技術開發丨DAPP丨NFT遊戲元宇宙APP
- 現貨量化跟單系統開發/秒合約開發/NFT鏈遊遊戲技術開發詳情遊戲
- 3D鏈遊開發功能,3D鏈遊系統開發技術分析及原始碼3D原始碼
- 區塊鏈多鏈錢包開發詳情版丨區塊鏈多鏈錢包系統開發實現技術方案及邏輯區塊鏈
- Stepn跑鞋跑步鏈遊系統開發/趣步系統開發/詳情案例/成熟技術/原始碼版原始碼
- NFT數藏(鏈遊)元宇宙藝術交易系統功能開發詳情元宇宙
- NFT卡牌鏈遊系統dapp開發元宇宙鏈遊APP元宇宙
- 紅酒鏈遊WineGometa系統模式開發原始碼詳情Go模式原始碼
- stepn跑鞋鏈遊系統開發技術說明及案例原始碼原始碼
- NFT鏈遊開發系統DAPP技術落地APP
- Stepn跑鞋NFT鏈遊合成遊戲系統開發技術詳情遊戲