公排矩陣佛薩奇2.0系統(tǒng)丨公排矩陣佛薩奇2.0系統(tǒng)開發(fā)(開發(fā)案例)丨公排矩陣佛薩奇源碼
去中心化應(yīng)用(DApp)程序架構(gòu)
Web3去除了管理中心,無需數(shù)據(jù)庫集中存儲(chǔ)應(yīng)用程序的狀態(tài),也不需要集中的網(wǎng)絡(luò)服務(wù)器來存放后端的邏輯,Web3的應(yīng)用程序(DApp)架構(gòu)與Web2時(shí)代的App有很大不同,Web3可以利用區(qū)塊鏈在互聯(lián)網(wǎng)上的去中心化狀態(tài)機(jī)上構(gòu)建應(yīng)用程序。
狀態(tài)機(jī)是由狀態(tài)寄存器和組合邏輯電路構(gòu)成的,能夠根據(jù)控制信號(hào)按照預(yù)先設(shè)定的狀態(tài)進(jìn)行狀態(tài)轉(zhuǎn)移,是協(xié)調(diào)相關(guān)信號(hào)動(dòng)作、完成特定操作的控制中心。區(qū)塊鏈可以理解為一種被實(shí)例化為創(chuàng)世狀態(tài)的狀態(tài)機(jī),并且有非常嚴(yán)格的規(guī)則(即共識(shí))來定義該狀態(tài)如何轉(zhuǎn)換。
//如果tokenA,tokenB的流動(dòng)池不存在,就創(chuàng)建流動(dòng)池
if(IUniswapV2Factory(factory).getPair(tokenA,tokenB)==address(0)){
IUniswapV2Factory(factory).createPair(tokenA,tokenB);
}關(guān)于區(qū)塊鏈項(xiàng)目技術(shù)開發(fā)唯:MrsFu123,代幣發(fā)行、dapp智能合約開發(fā)、鏈游開發(fā)、單雙幣質(zhì)押、多鏈錢包開發(fā)、NFT盲盒游戲、公鏈、鏈上游戲開發(fā)
Uniswap、交易所開發(fā)、量化合約開發(fā)、合約對(duì)沖、互助游戲開發(fā)、Nft數(shù)字藏品開發(fā)、眾籌互助開發(fā)、元宇宙開發(fā)、swap開發(fā)、DAO智能合約、
夾子合約、鏈上合約開發(fā)、ido開發(fā)、商城開發(fā)等,開發(fā)過各種各樣的系統(tǒng)模式,更有多種模式、制度、案例、后臺(tái)等,成熟技術(shù)團(tuán)隊(duì),歡迎實(shí)體參考。
//獲取tokenA,tokenB的目前庫存數(shù)量
(uint reserveA,uint reserveB)=UniswapV2Library.getReserves(factory,tokenA,tokenB);
if(reserveA==0&&reserveB==0){
//如果庫存數(shù)量為0,也就是新建tokenA,tokenB的流動(dòng)池,那么實(shí)際添加的amountA,amountB就是amountADesired和amountBDesired
(amountA,amountB)=(amountADesired,amountBDesired);
}else{
//reserveA*reserveB/amountADesired,算出實(shí)際要添加的tokenB數(shù)量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,算出實(shí)際要添加的tokenA數(shù)量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);
}
}
}
function _addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin
)internal virtual returns(uint amountA,uint amountB){
if(IUniswapV2Factory(factory).getPair(tokenA,tokenB)==address(0)){
IUniswapV2Factory(factory).createPair(tokenA,tokenB);
}
(uint reserveA,uint reserveB)=UniswapV2Library.getReserves(factory,tokenA,tokenB);
if(reserveA==0&&reserveB==0){
(amountA,amountB)=(amountADesired,amountBDesired);
}else{
uint amountBOptimal=UniswapV2Library.quote(amountADesired,reserveA,reserveB);
if(amountBOptimal<=amountBDesired){
require(amountBOptimal>=amountBMin,'UniswapV2Router:INSUFFICIENT_B_AMOUNT');
(amountA,amountB)=(amountADesired,amountBOptimal);
}else{
uint amountAOptimal=UniswapV2Library.quote(amountBDesired,reserveB,reserveA);
assert(amountAOptimal<=amountADesired);
require(amountAOptimal>=amountAMin,'UniswapV2Router:INSUFFICIENT_A_AMOUNT');
(amountA,amountB)=(amountAOptimal,amountBDesired);
}
}
}