去中心化交易所開發正式版丨去中心化交易所繫統開發技術詳細及原始碼分析
function _addLiquidity(
address tokenA, // 新增流動性 tokenA 的地址
address tokenB, // 新增流動性 tokenB 的地址
uint amountADesired, // 期望新增 tokenA 的數量
uint amountBDesired, // 期望新增 tokenB 的數量
uint amountAMin, // 新增 tokenA 的最小數量
uint amountBMin // 新增 tokenB 的最小數量
) internal virtual returns (
uint amountA, // 實際新增 tokenA 的數量
uint amountB // 實際新增 tokenB 的數量
) {
...
}
okenA 和 tokenB 很好理解,但是為什麼要有 amountADesired、amountADesired、amountAMin、amountBMin 呢?實際上因為使用者在區塊鏈上新增流動性並不是實時完成的,因此會因為其他使用者的操作產生資料偏差,因此需要在這裡指定一個為 tokenA 和 tokenB 新增流動性的數值範圍。在新增流動性的過程中,首先會根據 amountADesired 計算出實際要新增的 amountB,如果 amountB 大於 amountBDesired 就換成根據 amountBDesired 計算出實際要新增的 amountA。
...
{
// 如果 tokenA,tokenB 的流動池不存在,就建立流動池
if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
IUniswapV2Factory(factory).createPair(tokenA, tokenB);
}
// 獲取 tokenA,tokenB 的目前庫存數量
(uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
if (reserveA == 0 && reserveB == 0) {
// 如果庫存數量為0,也就是新建 tokenA,tokenB 的流動池,那麼實際新增的amountA, amountB 就是 amountADesired 和 amountBDesired
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
// reserveA*reserveB/amountADesired,算出實際要新增的 tokenB 數量 amountBOptimal
uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
if (amountBOptimal <= amountBDesired) {
// 如果 amountBMin <= amountBOptimal <= amountBDesired,amountA 和 amountB 就是 amountADesired 和 amountBOptimal
require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
// reserveA*reserveB/amountBDesired,算出實際要新增的 tokenA 數量 amountAOptimal
uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
// 如果 amountAMin <= amountAOptimal <= amountADesired,amountA 和 amountB 就是 amountAOptimal 和 amountBDesired
assert(amountAOptimal <= amountADesired);
require(amountAOptimal >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}
在實際上,計算出來的 mountA 和 mountB 只需要滿足這個公式:(amountAMin = mountA && amountBMin <= mountB <= amountBDesired) || (amountAMin <= mountA <= amountADesired && mountB = amountBDesired)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69956839/viewspace-2935839/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 去中心化薄餅交易所繫統開發詳細,PancakeSwap去中心化交易所繫統開發原理分析中心化
- swap交易所繫統(原始碼)丨swap交易所繫統開發(去中心化交易所開發詳細)原始碼中心化
- 去中心化交易所繫統開發邏輯丨去中心化薄餅交易所開發技術方案中心化
- swap去中心化交易所繫統開發(正式版)丨swap交易所原始碼部署中心化原始碼
- 去中心化交易所繫統開發需求中心化
- 數字貨幣交易所繫統開發技術原始碼丨區塊鏈去中心化交易所繫統開發(成熟技術)原始碼區塊鏈中心化
- Uniswap丨justswap丨pancakeswap去中心化薄餅交易所繫統開發(詳細及邏輯)中心化
- DEX去中心化交易所|去中心化交易所APP系統定製開發技術中心化APP
- 去中心化交易所繫統開發|案例詳細|專案測試|原始碼搭建中心化原始碼
- 淺談swap去中心化交易所繫統開發技術方案中心化
- DEFI去中心化交易所開發,DEFI去中心化交易APP原始碼系統中心化APP原始碼
- 區塊鏈去中心化交易所原始碼|去中心化交易系統開發區塊鏈中心化原始碼
- DAPP去中心化 swap 交易所繫統開發功能分析APP中心化
- BSEX交易所去中心化系統開發技術(邏輯分析)中心化
- Swap去中心化合約交易所繫統技術開發(功能細節)中心化
- 淺談uniswap丨justswap去中心化交易所繫統開發組成中心化
- 去中心化DAPP交易所開發中心化APP
- 關於Swap去中心化交易所繫統軟體開發(技術支援)中心化
- swap去中心化交易所繫統開發實現邏輯(原始碼示例)中心化原始碼
- OEX去中心化合約交易所繫統技術開發/原始碼程式搭建/DAPP中心化原始碼APP
- Swap去中心化交易所/系統開發技術/Swap智慧合約交易所原始碼搭建中心化原始碼
- DAPP去中心化交易所繫統開發|詳情方案|規則邏輯APP中心化
- swap交易所繫統開發(成熟技術)交易所中心繫統開發流程(原始碼搭建)原始碼
- OEX去中心化量化交易所繫統技術開發/秒合約/技術程式設計中心化程式設計
- Newdex去中心化交易所模式講解 | dex去中心化交易所定製開發部署中心化模式
- 去中心化交易所定製開發詳情案例中心化
- 數字貨幣swap去中心化博餅交易所繫統開發/(成熟原始碼)中心化原始碼
- 海南區塊鏈交易所開發。去中心化交易所開發區塊鏈中心化
- 交易所繫統丨交易所繫統開發(上線版)丨交易所開發詳細原始碼部署原始碼
- 數字貨幣去中心化交易所繫統開發|原始碼搭建|案例詳情|專案測試中心化原始碼
- 盤點10大去中心化交易所開發中心化
- PancakeSwap交易所去中心化系統開發專案模式中心化模式
- BSEX交易所開發運營版丨BSEX交易所繫統開發(開發詳細)及原始碼功能原始碼
- DAPP智慧合約中心化交易所繫統技術開發(程式碼示例)APP中心化
- Anyswap去中心化交易所介紹|去中心化做市機器人開發案例中心化機器人
- TOKTOK短影片系統DAPP開發丨去中心化短影片丨技術分析APP中心化
- 交易所開發(海外版)/交易所繫統開發(案例詳細)/交易所繫統原始碼及demo原始碼
- 去中心化交易所定製開發詳情案例具體詳情中心化