国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

3.恒定乘積自動做市商算法及代碼

這篇具有很好參考價值的文章主要介紹了3.恒定乘積自動做市商算法及代碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

中心化交易所的安全風(fēng)險

在中心化交易所中注冊賬戶時,是由交易所生成一個地址,用戶可以向地址充幣,充到地址之后交易所就會根據(jù)用戶充幣的數(shù)量顯示在管理界面中。但是充幣的地址是掌管在交易所之中的,資產(chǎn)的控制權(quán)還是在交易所。

案例:Mt Gox、FTX 等…

中心化交易所交易模式-訂單薄模式

中心化交易所會提供一個交易對,價格由市場決定。買賣分開排序。

  • 買面板 價格按照遞減排序 買入價格越高就在面板最高位置 27520.48
  • 賣面板 價格按照遞減排序 賣出價格最低放在面板最低位置 27520.49
  • 買面板最高位置(買入最高價)和賣面板最低位置(賣出最低價)會組合在一起,這時市場價就會在這兩者之間的價格
    如果市場開始波動
  • 市場上漲時(希望買入),買入市場用戶發(fā)現(xiàn)自己的買入價格和最低的賣出價格只差0.1,可能就會加錢將賣出價格最低的幾個賣出訂單買入,價格會更加偏向更高的賣出訂單價格
  • 市場下跌時(希望賣出),賣出用戶可能會選擇將自己的價格下調(diào)0.1,從而達(dá)成賣出貨幣,這時價格會更加傾向于買入價格。

DEX

去中心化交易所(Decentralized exchange)簡稱為DEX

Uniswap

uniswap的核心是Automated market Maker。

例如構(gòu)建一個 TokenA/USDT兌換對
market maker:做市商
Liquidity 流動性:向兩邊都注入資金才能維護(hù)交易的正常運(yùn)行
Liqyuidity Provider(LP):注入資金的人

去中心化交易所核心要素:

  1. 任何人都可以添加流動性,成為LP,并拿到LP token
  2. LP在任意時間可以移除流動性并銷毀LP Token,拿回自己的Token
  3. 用戶可以基于交易池來進(jìn)行交易
  4. 交易時收取一定的手續(xù)費(fèi),并且分配給LP
恒定乘積自動做商 Constant Product Automated Market Maker

x*y=k=(x+Δx) * (y-Δy)

  1. 交換 交易數(shù)量的確定
    買Δx 求Δy
    xy=(x+Δx) * (Y-Δy) = xy- xΔy +Δx * y-ΔxΔy=k
    x
    y= xy- xΔy +Δx * y-ΔxΔy
    xΔy+ΔxΔy=Δx * y
    Δy=Δx * y/(x+Δx)

  2. 添加流動性
    x+Δx ,y+Δy
    添加之后x/y=(x+Δx)/(y+Δy)

    如果手中有Δx,怎么添加Δy呢?
    公式變形:xy+xΔy=xy+Δxy => xΔy=yΔx
    Δy=(yΔx)/x
    也就是Δx/Δy=x/y 也就是對于xy兩邊從池子添加的比例要相同

    怎么衡量池子中的流動性?答: x y \sqrt{xy} xy ?

    添加liquidity之后能夠拿到LPtoken作為憑證,稱為share,在添加之后所有l(wèi)iquidity的share是T(total supply),之后對liquidity添加了S的流動性
    L0:添加之前的流動性 T
    L1:添加之后的流動性 T+S
    L0/L1=T/(T+S)
    引起流動性變化,能夠拿到多少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 T \frac{Δx}{x}T xΔx?T= Δ y y T \frac{Δy}{y}T yΔy?T

  3. 移除流動性(例如手中有x份share,在移除的時候,能拿到多少x和y的幣)
    其中需要知道 S 、T(移除之前l(fā)iquidity的total supply)、L(當(dāng)前l(fā)iquidity)
    也就是移除之前的流動性和流行性token以及手中的share,放入之后能夠兌換多少xy的數(shù)量

    Δ x ? Δ y x y \sqrt{Δx*Δy}\over{\sqrt{xy}} xy ?Δx?Δy ??= S T S\over{T} TS?
    Δx=x S T S\over{T} TS?
    Δy=y 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 == x
    uint public reserve1;//token1 amount in contract == y

    uint public totalSupply; //lp token amount of all
    mapping(address=>uint) public balanceOf; //每個地址對應(yīng)的LP余額

    constructor(address _token0,address _token1){
        token0=IERC20(_token0);
        token1=IERC20(_token1);
    }
    //  更新余額表
    function _updata(uint _reserve0,uint _reserve1) private {
        reserve0=_reserve0;
        reserve1=_reserve1;
    }

    function _sqrt(uint y) internal pure returns(uint z){
        if(y>3){
            z=y;
            uint x=y/2+1;
            while(x<z){
                z=x;
                x=(y/x+x)/2;
            }
        }else if(y!=0){
            z=1;
        }
    }

    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(_amountIn>0,"Invalid Amount");
       require(_tokenIn==address(token0)||_tokenIn ==address(token1),"Invalid token type");

       bool isToken0=_tokenIn==address(token0);
        (IERC20 _tokenIn,IERC20 tokenOut)= isToken0?(token0,token1):(token1,token0);
        //定義順序
        (uint reserveIn,uint reserveOut)=isToken0?(reserve0,reserve1):(reserve1,reserve0);
       //轉(zhuǎn)幣到合約
       _tokenIn.transferFrom(msg.sender, address(this), _amountIn);
       //計算輸出的數(shù)量  注:沒有考慮手續(xù)費(fèi)
       amountOut=(_amountIn*reserveOut)/(_amountIn+reserveIn);
       //轉(zhuǎn)幣給用戶 
       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,拿到的是Share
    function addLiquidity(uint _amount0,uint _amount1) external returns (uint shares){
        require(_amount0>0&&_amount1>0,"Invaiid amount");
        //將token0、token1轉(zhuǎn)入合約
        token0.transferFrom(msg.sender, address(this), _amount0);
        token1.transferFrom(msg.sender, address(this), _amount1);
        //計算并mint share給用戶
        if(reserve0>0||reserve1>0){
            require(_amount0*reserve1==_amount1*reserve0,"dy/dx != y/x");           
        }
        if(totalSupply==0){
            //沒有添加過流動性//添加過流動性
            shares=_sqrt(_amount0*_amount1);
        }else{
            shares=_min((_amount0*totalSupply)/reserve0,(_amount1*totalSupply)/reserve1);
        }
        require(shares>0,"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(_shares>0,"Invalid shares");
        //計算Δx,Δy數(shù)量
        _amount0=(reserve0*_shares)/totalSupply;
        _amount1=(reserve1*_shares)/totalSupply;
        //銷毀用戶的share
        _burn(msg.sender, _shares);
        //將兩個幣轉(zhuǎn)回給用戶
        token0.transfer(msg.sender, _amount0);
        token1.transfer(msg.sender, _amount1);
        //更新余額表
        _updata(token0.balanceOf(address(this)),token0.balanceOf(address(this)));
    }

}
操作流程
  1. 在remix上先部署兩個ERC20合約
    地址0:0xd9145CCE52D386f254917e481eB44e9943F39138
    地址1:0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8
    3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融

  2. 部署所編寫的CPAMM合約
    3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融
    合約地址為:0xf8e81D47203A594245E36C48e151709F0C19fBe8

  3. 添加流動性
    注意:要確保地址有足夠的余額,沒有在構(gòu)造函數(shù)中mint的也可以部署之后mint
    appreve合約地址
    0approve:3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融
    1approve:
    3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融addLiquidity:
    3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融
    3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融
    4.進(jìn)行交換 swap
    tokenIn是地址0
    3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融
    3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融
    3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融

5.移除liquidity
3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融
3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融
3.恒定乘積自動做市商算法及代碼,DeFi,區(qū)塊鏈,金融文章來源地址http://www.zghlxwxcb.cn/news/detail-847251.html

到了這里,關(guān)于3.恒定乘積自動做市商算法及代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 算法---除自身以外數(shù)組的乘積

    給你一個整數(shù)數(shù)組 nums,返回 數(shù)組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數(shù)據(jù) 保證 數(shù)組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數(shù)范圍內(nèi)。 請不要使用除法,且在 O(n) 時間復(fù)雜度內(nèi)完成此題。 示例 1: 輸入: nums = [1,2,3,4]

    2024年02月16日
    瀏覽(19)
  • C++前綴和算法:構(gòu)造乘積矩陣

    C++前綴和算法:構(gòu)造乘積矩陣

    C++算法:前綴和基礎(chǔ) 給你一個下標(biāo)從 0 開始、大小為 n * m 的二維整數(shù)矩陣 grid ,定義一個下標(biāo)從 0 開始、大小為 n * m 的的二維矩陣 p。如果滿足以下條件,則稱 p 為 grid 的 乘積矩陣 : 對于每個元素 p[i][j] ,它的值等于除了 grid[i][j] 外所有元素的乘積。乘積對 12345 取余數(shù)。

    2024年02月08日
    瀏覽(21)
  • Uniswap V2 — 從代碼解釋 DeFi 協(xié)議

    為了理解我們在分析代碼時將要經(jīng)歷的不同組件,首先了解哪些是主要概念 以及 它們 的作用 是很重要的。所以,和我一起裸露吧,因為這是值得的。 我在 5 個段落中總結(jié)了您需要了解的主要重要概念,您將在本文結(jié)束時理解這些概念。 Uniswap 是一種 去中心化交易 協(xié)議 。

    2023年04月22日
    瀏覽(17)
  • dp算法 力扣152乘積最大子數(shù)組

    dp算法 力扣152乘積最大子數(shù)組

    本文是Java代碼??! 152. 乘積最大子數(shù)組 - 力扣(LeetCode) 給你一個整數(shù)數(shù)組 nums?,請你找出數(shù)組中乘積最大的非空連續(xù)子數(shù)組(該子數(shù)組中至少包含一個數(shù)字),并返回該子數(shù)組所對應(yīng)的乘積。 測試用例的答案是一個?32-位 整數(shù)。 子數(shù)組 是數(shù)組的連續(xù)子序列。 示例 1: 輸入

    2024年02月13日
    瀏覽(27)
  • 羅勇軍 →《算法競賽·快沖300題》每日一題:“乘積” ← 動態(tài)規(guī)劃

    【題目來源】 http://oj.ecustacm.cn/problem.php?id=1781 http://oj.ecustacm.cn/viewnews.php?id=1023 【題目描述】 給你一個長度為 n 的序列,序列中的元素只包括 1 和 -1。 請問有多少個連續(xù)的子序列乘積為正數(shù)。 【輸入格式】 輸入第一行為正整數(shù) n。(n不超過10^6) 第二行包含 n 個整數(shù)。 【輸

    2024年02月11日
    瀏覽(19)
  • 【算法|動態(tài)規(guī)劃No.12】leetcode152. 乘積最大子數(shù)組

    【算法|動態(tài)規(guī)劃No.12】leetcode152. 乘積最大子數(shù)組

    個人主頁:兜里有顆棉花糖 歡迎 點贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時,記錄一下自己的學(xué)習(xí)過程,希望對大家有所幫助 ??希望我們一起努力、成長,共同進(jìn)步。

    2024年02月08日
    瀏覽(19)
  • 【數(shù)理知識】矩陣普通乘積,哈達(dá)瑪積,克羅內(nèi)克積,點乘,點積,叉乘,matlab代碼實現(xiàn)

    序號 內(nèi)容 1 【數(shù)理知識】向量數(shù)乘,內(nèi)積,外積,matlab代碼實現(xiàn) 2 【數(shù)理知識】矩陣普通乘積,哈達(dá)瑪積,克羅內(nèi)克積,點乘,點積,叉乘,matlab代碼實現(xiàn) 首先介紹矩陣 在數(shù)學(xué)中,矩陣是一個按照長方陣列排列的復(fù)數(shù)或?qū)崝?shù)集合。由 m × n m times n m × n 個數(shù) a i j a_{ij} a ij ?

    2024年02月04日
    瀏覽(26)
  • 自動駕駛算法(一):Dijkstra算法講解與代碼實現(xiàn)

    自動駕駛算法(一):Dijkstra算法講解與代碼實現(xiàn)

    目錄 0 本節(jié):柵格地圖、算法、路徑規(guī)劃 1 Dijkstra算法詳解 2 Dijkstra代碼詳解 ??????? 用于圖中尋找最短路徑。節(jié)點是地點,邊是權(quán)重。 ??????? 從起點開始逐步擴(kuò)展,每一步為一個節(jié)點找到最短路徑: ????????While True: ????????????????1.從未訪問的節(jié)

    2024年02月06日
    瀏覽(21)
  • 相控陣天線(一):直線陣列天線特性和陣列因子(方向圖乘積定理、波束掃描、含python代碼)

    相控陣天線(一):直線陣列天線特性和陣列因子(方向圖乘積定理、波束掃描、含python代碼)

    任意形式單元天線構(gòu)成的直線陣如下圖所示: 陣中第n個單元的遠(yuǎn)區(qū)輻射場可表示為如下形式: 其中An和an分別表示單元天線的激勵幅度和相位,f(θ,φ)為單元天線的方向圖函數(shù)。 由上可得,陣列的遠(yuǎn)區(qū)總場為: 化簡可得陣列的方向圖函數(shù)為: 陣列天線的陣因子如下所示:

    2023年04月10日
    瀏覽(23)
  • 自動駕駛算法(三):RRT算法講解與代碼實現(xiàn)(基于采樣的路徑規(guī)劃)

    自動駕駛算法(三):RRT算法講解與代碼實現(xiàn)(基于采樣的路徑規(guī)劃)

    目錄 1 RRT算法原理 2 RRT算法代碼解析 3 RRT完整代碼 ??????? RRT算法的全稱是快速擴(kuò)展隨機(jī)樹算法(Rapidly Exploring Random Tree),它的想法就是從根結(jié)點長出一棵樹當(dāng)樹枝長到終點的時候這樣就能找到從終點到根節(jié)點的唯一路徑。 ??????? 算法流程: ??????? 首先進(jìn)行初始化

    2024年02月06日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包