友点企业网站管理系统模板下载,商务网站建设是什么,电子商务网站建设侧重哪几个方面,提升学历图片素材中心化交易所的安全风险
在中心化交易所中注册账户时#xff0c;是由交易所生成一个地址#xff0c;用户可以向地址充币#xff0c;充到地址之后交易所就会根据用户充币的数量显示在管理界面中。但是充币的地址是掌管在交易所之中的#xff0c;资产的控制权还是在交易所。…中心化交易所的安全风险
在中心化交易所中注册账户时是由交易所生成一个地址用户可以向地址充币充到地址之后交易所就会根据用户充币的数量显示在管理界面中。但是充币的地址是掌管在交易所之中的资产的控制权还是在交易所。
案例Mt Gox、FTX 等…
中心化交易所交易模式-订单薄模式
中心化交易所会提供一个交易对价格由市场决定。买卖分开排序。
买面板 价格按照递减排序 买入价格越高就在面板最高位置 27520.48卖面板 价格按照递减排序 卖出价格最低放在面板最低位置 27520.49买面板最高位置买入最高价和卖面板最低位置卖出最低价会组合在一起这时市场价就会在这两者之间的价格 如果市场开始波动市场上涨时希望买入买入市场用户发现自己的买入价格和最低的卖出价格只差0.1可能就会加钱将卖出价格最低的几个卖出订单买入价格会更加偏向更高的卖出订单价格市场下跌时希望卖出卖出用户可能会选择将自己的价格下调0.1从而达成卖出货币这时价格会更加倾向于买入价格。
DEX
去中心化交易所Decentralized exchange简称为DEX
Uniswap
uniswap的核心是Automated market Maker。
例如构建一个 TokenA/USDT兑换对 market maker做市商 Liquidity 流动性向两边都注入资金才能维护交易的正常运行 Liqyuidity ProviderLP注入资金的人
去中心化交易所核心要素
任何人都可以添加流动性成为LP并拿到LP tokenLP在任意时间可以移除流动性并销毁LP Token拿回自己的Token用户可以基于交易池来进行交易交易时收取一定的手续费并且分配给LP
恒定乘积自动做商 Constant Product Automated Market Maker
x*yk(xΔx) * (y-Δy) 交换 交易数量的确定 买Δx 求Δy xy(xΔx) * (Y-Δy) xy- xΔy Δx * y-ΔxΔyk xy xy- xΔy Δx * y-ΔxΔy xΔyΔxΔyΔx * y ΔyΔx * y/(xΔx) 添加流动性 xΔx yΔy 添加之后x/y(xΔx)/(yΔy) 如果手中有Δx怎么添加Δy呢 公式变形xyxΔyxyΔxy xΔyyΔx Δy(yΔx)/x 也就是Δx/Δyx/y 也就是对于xy两边从池子添加的比例要相同 怎么衡量池子中的流动性答 x y \sqrt{xy} xy 添加liquidity之后能够拿到LPtoken作为凭证称为share在添加之后所有liquidity的share是Ttotal supply之后对liquidity添加了S的流动性 L0添加之前的流动性 T L1添加之后的流动性 TS L0/L1T/TS 引起流动性变化能够拿到多少share S(L1-L0)T/L0 ( ( x Δ x ) ( y Δ y ) − x y x y \sqrt{(xΔx)(yΔy)}-\sqrt{xy}\over \sqrt{xy} xy (xΔx)(yΔy) −xy )T( ( x Δ x ) ( y Δ y ) − x y x y \sqrt{(xΔx)(yΔy)}-\sqrt{xy}\over \sqrt{xy} xy (xΔx)(yΔy) −xy )T Δ x x \frac{Δx}{x} xΔx Δ y y \frac{Δy}{y} yΔy 移除流动性例如手中有x份share在移除的时候能拿到多少x和y的币 其中需要知道 S 、T移除之前liquidity的total supply、L当前liquidity 也就是移除之前的流动性和流行性token以及手中的share放入之后能够兑换多少xy的数量 Δ x ∗ Δ y x y \sqrt{Δx*Δy}\over{\sqrt{xy}} xy Δx∗Δy S T S\over{T} TS Δxx S T S\over{T} TS Δyy S T S\over{T} TS
代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import IERC20.sol;contract CPAMM{IERC20 public immutable token0;IERC20 public immutable token1;uint public reserve0;//token0 amount in contract xuint public reserve1;//token1 amount in contract yuint public totalSupply; //lp token amount of allmapping(addressuint) public balanceOf; //每个地址对应的LP余额constructor(address _token0,address _token1){token0IERC20(_token0);token1IERC20(_token1);}// 更新余额表function _updata(uint _reserve0,uint _reserve1) private {reserve0_reserve0;reserve1_reserve1;}function _sqrt(uint y) internal pure returns(uint z){if(y3){zy;uint xy/21;while(xz){zx;x(y/xx)/2;}}else if(y!0){z1;}}function _mint(address _to,uint _amount) private {balanceOf[_to]_amount;totalSupply_amount;}function _burn(address _from,uint _amount) private {balanceOf[_from]-_amount;totalSupply-_amount;}function swap(address _tokenIn,uint _amountIn) external returns(uint amountOut){require(_amountIn0,Invalid Amount);require(_tokenInaddress(token0)||_tokenIn address(token1),Invalid token type);bool isToken0_tokenInaddress(token0);(IERC20 _tokenIn,IERC20 tokenOut) isToken0?(token0,token1):(token1,token0);//定义顺序(uint reserveIn,uint reserveOut)isToken0?(reserve0,reserve1):(reserve1,reserve0);//转币到合约_tokenIn.transferFrom(msg.sender, address(this), _amountIn);//计算输出的数量 注没有考虑手续费amountOut(_amountIn*reserveOut)/(_amountInreserveIn);//转币给用户 tokenOut.transfer(msg.sender, amountOut);//更新余额表_updata(token0.balanceOf(address(this)),token0.balanceOf(address(this)));}function _min(uint _x,uint _y) private pure returns(uint) {return _x_y?_y:_x;}//用户提供的是Δx,Δy拿到的是Sharefunction addLiquidity(uint _amount0,uint _amount1) external returns (uint shares){require(_amount00_amount10,Invaiid amount);//将token0、token1转入合约token0.transferFrom(msg.sender, address(this), _amount0);token1.transferFrom(msg.sender, address(this), _amount1);//计算并mint share给用户if(reserve00||reserve10){require(_amount0*reserve1_amount1*reserve0,dy/dx ! y/x); }if(totalSupply0){//没有添加过流动性//添加过流动性shares_sqrt(_amount0*_amount1);}else{shares_min((_amount0*totalSupply)/reserve0,(_amount1*totalSupply)/reserve1);}require(shares0,share is zero);_mint(msg.sender, shares);//更新余额表_updata(token0.balanceOf(address(this)),token0.balanceOf(address(this)));}function removeLiquidity(uint _shares) external returns(uint _amount0,uint _amount1){require(_shares0,Invalid shares);//计算Δx,Δy数量_amount0(reserve0*_shares)/totalSupply;_amount1(reserve1*_shares)/totalSupply;//销毁用户的share_burn(msg.sender, _shares);//将两个币转回给用户token0.transfer(msg.sender, _amount0);token1.transfer(msg.sender, _amount1);//更新余额表_updata(token0.balanceOf(address(this)),token0.balanceOf(address(this)));}}操作流程 在remix上先部署两个ERC20合约 地址00xd9145CCE52D386f254917e481eB44e9943F39138 地址10xd8b934580fcE35a11B58C6D73aDeE468a2833fa8 部署所编写的CPAMM合约 合约地址为0xf8e81D47203A594245E36C48e151709F0C19fBe8 添加流动性 注意要确保地址有足够的余额没有在构造函数中mint的也可以部署之后mint appreve合约地址 0approve: 1approve: addLiquidity 4.进行交换 swap tokenIn是地址0
5.移除liquidity