DAPP/LP/DEFI/IDO代幣合約燃燒通縮流動性質(zhì)押NFT挖礦分紅系統(tǒng)開發(fā)案例源碼/項(xiàng)目方案
區(qū)塊鏈?zhǔn)且环N將數(shù)據(jù)區(qū)塊按照時(shí)間順序組合成的鏈?zhǔn)浇Y(jié)構(gòu),是去中心化系統(tǒng)中各節(jié)點(diǎn)共享且共同維護(hù)的分布式數(shù)據(jù)賬本,具體的:各節(jié)點(diǎn)由P2P組網(wǎng)方式相互連通和交互,受激勵機(jī)制激勵貢獻(xiàn)自身算力,
根據(jù)數(shù)據(jù)驗(yàn)證機(jī)制及傳播協(xié)議,執(zhí)行、驗(yàn)證并傳播一段時(shí)間內(nèi)生成的有效交易數(shù)據(jù),同時(shí)利用Merkle樹、哈希算法、時(shí)間戳等技術(shù)加密、生成數(shù)據(jù)區(qū)塊,依據(jù)共識算法爭奪記賬權(quán),最終獲得記賬權(quán)的節(jié)點(diǎn)(礦工),將其生成的數(shù)據(jù)區(qū)塊鏈接到區(qū)塊鏈主鏈上并獲得相應(yīng)獎勵,其余節(jié)點(diǎn)更新區(qū)塊鏈賬本.
智能合約一般具有值和狀態(tài)兩個(gè)屬性,代碼中用If-Then和What-If語句預(yù)置了合約條款的相應(yīng)觸發(fā)場景和響應(yīng)規(guī)則,智能合約經(jīng)多方共同協(xié)定、各自簽署后隨用戶發(fā)起的交易(Transaction,Txn)提交,經(jīng)P2P網(wǎng)絡(luò)傳播、礦工驗(yàn)證后存儲在區(qū)塊鏈特定區(qū)塊中,用戶得到返回的合約地址及合約接口等信息后即可通過發(fā)起交易來調(diào)用合約.
contract UniswapV2Pair is IUniswapV2Pair,UniswapV2ERC20{
using SafeMath for uint;
using UQ112x112 for uint224;
//最低流動性
uint public constant MINIMUM_LIQUIDITY=10**3;
//獲取transfer方法的bytecode前四個(gè)字節(jié)
bytes4 private constant SELECTOR=bytes4(keccak256(bytes('transfer(address,uint256)')));
address public factory;
address public token0;
address public token1;
uint112 private reserve0;//uses single storage slot,accessible via getReserves==使用單個(gè)存儲槽,可通過getReserves訪問
uint112 private reserve1;//uses single storage slot,accessible via getReserves
uint32 private blockTimestampLast;//uses single storage slot,accessible via getReserves
uint public price0CumulativeLast;//最后價(jià)格累計(jì)的0價(jià)格?
uint public price1CumulativeLast;
//緊接最近一次流動性事件之后
uint public kLast;//reserve0*reserve1,as of immediately after the most recent liquidity event
uint private unlocked=1;
//防止遞歸迭代出現(xiàn)問題,所以要上鎖
//一個(gè)鎖,使用該modifier的函數(shù)在unlocked==1時(shí)才可以進(jìn)入,
//第一個(gè)調(diào)用者進(jìn)入后,會將unlocked置為0,此使第二個(gè)調(diào)用者無法再進(jìn)入
//執(zhí)行完_部分的代碼后,才會再將unlocked置1,重新將鎖打開
modifier lock(){
require(unlocked==1,'UniswapV2:LOCKED');
unlocked=0;
_;
unlocked=1;
}
//獲取儲備:返回:_reserve0,_reserve1,_blockTimestampLast
//用于獲取兩個(gè)token在池子中的數(shù)量和最后更新的時(shí)間
function getReserves()public view returns(uint112 _reserve0,uint112 _reserve1,uint32 _blockTimestampLast){
_reserve0=reserve0;
_reserve1=reserve1;
//時(shí)間戳
_blockTimestampLast=blockTimestampLast;
}
//轉(zhuǎn)賬,安全校驗(yàn)
function _safeTransfer(address token,address to,uint value)private{
//調(diào)用transfer方法,把地址token中的value個(gè)coin轉(zhuǎn)賬給to
(bool success,bytes memory data)=token.call(abi.encodeWithSelector(SELECTOR,to,value));
//檢查返回值,必須成功否則報(bào)錯(cuò)
require(success&&(data.length==0||abi.decode(data,(bool))),'UniswapV2:TRANSFER_FAILED');
}
event Mint(address indexed sender,uint amount0,uint amount1);
event Burn(address indexed sender,uint amount0,uint amount1,address indexed to);
event Swap(address indexed sender,uint amount0In,uint amount1In,uint amount0Out,uint amount1Out,address indexed to);
event Sync(uint112 reserve0,uint112 reserve1);
//部署此合約時(shí)將msg.sender設(shè)置為factory,后續(xù)初始化時(shí)會用到這個(gè)值
constructor()public{
factory=msg.sender;
}
//called once by the factory at time of deployment
//在UniswapV2Factory.sol的createPair中調(diào)用過
function initialize(address _token0,address _token1)external{
require(msg.sender==factory,'UniswapV2:FORBIDDEN');//sufficient check
token0=_token0;
token1=_token1;
}
//update reserves and,on the first call per block,price accumulators
//更新儲備,并在每個(gè)區(qū)塊的第一次調(diào)用時(shí)更新價(jià)格累加器
/**
更新變量:
blockTimestampLast
reserve0
reserve1
price0CumulativeLast
price1CumulativeLast