tokenpocketapp钱包下载地址|uniswap怎么设置中文

作者: tokenpocketapp钱包下载地址
2024-03-11 00:15:47

小白课堂 | 一文读懂Uniswap,附Uniswap使用教程 - 知乎

小白课堂 | 一文读懂Uniswap,附Uniswap使用教程 - 知乎首发于数字货币切换模式写文章登录/注册小白课堂 | 一文读懂Uniswap,附Uniswap使用教程书匠火火玄学一、加密货币交易形式 当我们要进行加密货币交易时,使用最早也是目前使用最多的形式还是中心化交易所,在中心化交易所,我们首先需要注册,然后加密货币也需要存入到交易所,由交易所进行托管,如果要提现加密货币出来,也需要经过交易所审核同意。虽然中心化交易所有诸多优势,例如交易速度较快、用户不需要管理私钥,降低了用户的使用门槛,但是它的弊端也是显而易见的,用户的加密货币由交易所托管,交易所是有跑路风险的。也确实发生过多起交易所跑路的事件,几乎每年都有发生。那么,有没有更好的加密货币交易形式呢? 随着区块链技术的不断发展,加密货币交易形式也变得越来越多样化,我们不但可以使用中心化交易所进行交易,也可以使用去中心化交易所进行交易。在去中心化交易所进行交易时,不需要注册,只需要使用数字钱包连接去中心化交易所就可以进行加密货币的交易了,交易完成后,相应的加密货币会自动转入到用户的数字钱包中,用户的资产始终在自己的钱包中,并非像中心化交易所那样托管在交易所,所以,在去中心化交易所进行交易,安全性大大提高了。 目前,去中心化交易所主要有两种形式,一种是交易所撮合买方用户和卖方用户的订单,只不过操作过程发生在链上,典型代表有 EOS 去中心化交易所 Newdex,Newdex 依旧承担了中心化交易所的订单撮合模式。在 Newdex 交易,用户无需注册、资产无需托管,撮合发生在 EOS 链上,数据公开透明。 去中心化交易所的另一种形式是基于兑换池,而非基于买方和卖方订单所构成的订单簿,它类似于人机交易,采取的是柜台模式,就像我们去银行兑换不同国家的法币。典型的代表是 Uniswap。二、Uniswap 是什么Uniswap 是基于以太坊的代币交换协议,是基于兑换池,而不是订单簿的去中心化交易协议。而所谓的兑换池,指的则是一个资金池,用户在 Uniswap 中交易的价格则由这个资金池中的代币比例和算法来决定。Uniswap 是去中心化的,不仅跟传统的加密货币交易所不同,也跟普通的去中心化代币交易所不同。Uniswap 是一组部署到以太坊网络的合约,所有的交易都在链上进行。Uniswap 的交易对手并不是其他交易用户,而是跟代币池进行交易,且有自动做市的模型来计算交易价格,代币兑换价格与代币兑换池中代币的比例有关。三、Uniswap 的功能和优势 在 Uniswap 中,使用最多的功能就是代币之间的币币兑换交易了,由于 Uniswap 是基于以太坊的,所以在 Uniswap 中只能交易以太坊上的加密货币资产。目前 Uniswap 支持的币种大概在150种左右,以太坊上的主流资产基本上都可以在上面进行交易了。当然了,用户也可以自行添加交易对,也就是做市商,这样可以赚取一定的手续费。 使用 Uniswap 这种交易形式,比订单撮合模式速度更快,因为它是基于兑换池的人机交易,节省了撮合时间。而且 Uniswap 支持的币种间可以实现两两兑换交易,交易对明显比中心化交易所更丰富。 例如: LRC 和 KNC 之间的交易,在 Uniswap 是可以一步完成交易(虽然系统可能需要转换,但在用户看来就是一步交易)的。而在中心化交易所,LRC 和 KNC 没有直接的交易对,用户最少需要两次交易,即把 LRC 兑换成 ETH ,再用 ETH 和 KNC 交易。很显然,对于用户来说,Uniswap 更便捷。四、如何使用 Uniswap 进行币币兑换交易 我们可以通过多链钱包 TokenPocket 来连接 Uniswap 进行交易。在 TP 钱包的发现界面的 DeFi 区,找到 Uniswap 并点击进入。1、兑换我们可以选择 V2 版本。在兑换界面中,输入表示的是拿来用于兑换的币种,而输出表示的是兑换后的币种。例如:拿 LRC 兑换 KNC,输入部分要选择 LRC,而输出部分要选择 KNC。在选择好输入输出币种后,输入输填写数量,即用于兑换 KNC 的 LRC 数量,可以收到的 KNC 数量就会根据 LRC/KNC 当前的汇率自动计算出来并填充。输入完成后,点击"授权 LRC"按钮,然后点击右侧的"兑换"就可以完成 LRC 和 KNC 之间的兑换了。2、发送 在 Uniswap 的发送界面中,主要有两个功能。一个是转账功能。选择要转出的币种,输入转账数量以及接收地址,然后点击"send"就可以转账了,这和一般的钱包转账也没什么区别。另外一个功能是"兑换+转账",挺有意思的一个功能。 例如我们要把 LRC 兑换为 KNC,并转账到另外一个 ETH 地址中,就可以使用该功能,还是挺方便的。首先,在发送界面中点击"添加兑换"按钮。 然后选择兑换的两个币种和用于兑换 KNC 的 LRC 数量,并输入接收地址。最后,点击"授权LRC"按钮后,点击 "Send"按钮就可以完成代币的兑换以及转账了。3、资金池 在 Uniswap 中,除了可以用于代币兑换之外,还可以加入 Uniswap 的资金池,通过为 Uniswap 提供流动性而赚取收益。首先在"资金池"界面中点击"加入一个资金池"按钮,然后选择一个流动性池,例如选择 ETH/USDT,在选择了流动性池后,输入要存入资金池的币种数量。注意,交易对是成比例存入资金池的,例如上例中,如果存入 0.091216 ETH 到资金池,那么USDT就要存入21.751个。 输入完成后,点击下面的"授权 USDT",然后点击"供应"就可以加入资金池了。总之,通过 Uniswap 进行以太坊上数字资产之间的交易,还是非常方便的,不需要注册,也不需要托管在交易所,通过钱包连接到 Uniswap 就可以进行交易了,交易完成后,相应的数字资产也会自动转入到用户的 ETH 钱包中,而且在兑换时还可以选择转到其他地址中。如果要使用 Uniswap 进行交易,可以到多链钱包 TokenPocket 中体验和使用。源自公众号:库尔班区块链发布于 2020-12-15 18:58Uniswap去中心化交易所(DEX)​赞同 83​​31 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录数字货币在这里,读懂

uniswap怎么操作 - 知乎

uniswap怎么操作 - 知乎首发于币圈那点事切换模式写文章登录/注册uniswap怎么操作绿晓​研究了一个星期,亏了2个eth,获得的uniswap的操作经验,分享一下。uniswap是众多去中心化交易所中的一个,之所以选择它来交易,是因为比较有名,用户多,上币多,同时各个钱包上都有好用的汉化版。比如I'mtoken钱包,麦子钱包,bitkeep钱包。重要:首先要明白,上币多就是有非常多的假币和空气币,一定要认真调研项目方背景,要清楚了解uniswap是一个能让人基于技术和金融开放的形式上,快速暴富和资产归零的操作平台。风险非常高!!!想要通过去中心化交易所购买有潜力的山寨币,首先要有个钱包,上面那三个都挺好用的。在钱包的eth钱包状态,找到uniswap应用。该应用操作很简单,用ETH换山寨币,或用山寨币换ETH。觉得价格合适立刻交换即可。操作中可能遇到的坑:1.如何辨别项目是否靠谱答:必须要看的:1)telegram群的人数;2)Twitter分数数;3)项目官网&白皮书(看不懂的多看几个,以及群里大牛们的建议);4)投资该token的资产方,通常厉害的项目投资机构也很牛,当然也有例外比如YAM和CRV狠狠的割了全世界韭菜一大波,这里再鄙视币安;5)看该项目的流动性资金池(在uniswap上可以看到),一般100eth以上会觉得靠谱,当然骗子的币一般资金池做的都很好,谨慎;一定要谨慎的:可以参加群讨论,别人推荐的也可能是来割你的,一定要格外小心。2.怎么在一堆同名的山寨币中,找到那个真token答:找到该项目的官网,通过官网查看这个token的合约(contact),然后将合约复制到uniswap上找到对应的币。3.用山寨币换ETH时,授权是啥意思?答:用ETH换山寨token时不需要授权,山寨token换ETH时要先授权,授权=付费。如果为了快速出货,费用不要设置太低。4.每笔交换费用设置多少合适?答:这是去中心化交易让人最最最不爽的一点了。一笔交易动辄价值100软妹币的手续费,少则50软妹币,还不能设置的太低的手续费,否则pending起来,价格波动,人会崩溃。所以不要轻易做0.5个ETH以下的交易,一买/一卖/一授权都需要费用,这个得盈利至少10%才能覆盖成本。5.交易处于pending中怎么办?答:比如你是用A钱包向B地址发送1个ETH。你想让这笔交易撤销,那么就再从A钱包向B地址发送0ETH(没错零个以太坊),同时手续费设置高一点。这样可以覆盖掉之前的交易,相当于撤销了。如果你的钱包不支持发送0ETH,那么可以将钱包导入到支持发0ETH的钱包。math和MetaMask都支持,我都用过。6.是否有必要提交到交易所交易?答:先让我流一把归零的眼泪。可以提,毕竟中心化交易所操作方便,费率低。但要注意小心一种操作。比如CRV这个币,先上了uniswap,然后币安发了公告说会上线CRV,同时其他交易所纷纷说会上线CRV,结果大家纷纷去uniswap上购买,CRV价格连番向上翻滚,等到上线交易所后纷纷使劲砸盘。CRV还被爆出“1392个地址中的前20个持有了55%的 $CRV。前100个地址持有大概 80% 的 $CRV 。甚至比28原则还要夸张”,就是大佬们联合起来狠割韭菜。可不可怕。。。uniswap价格止步于40美金,上了中心化交易所后一度砸到5美金左右。而币安更加鸡贼,它比其他交易所晚上线1天,等着各个交易所砸完,币安的K线会好看一些,没有断头70%的样子。然而提前把CRV充到币安的韭菜就惨了,充了提不出,只能眼睁睁看着CRV从40美金被砸到5美金,却做不了任何操作。强烈建议看看最后一句:无论如何暴富都是极少数的,可以了解去中心技术和开发金融的形态,别在交易市场赌太大!发布于 2020-08-16 18:47去中心化交易所(DEX)币圈去中心化应用(DApp)​赞同 126​​34 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录币圈那点事数字货币交易

微信讨论:guxian

DeFi工具—UNISWAP使用教程 - 知乎

DeFi工具—UNISWAP使用教程 - 知乎首发于DeFi挖矿教程大全切换模式写文章登录/注册DeFi工具—UNISWAP使用教程派派什么是Uniswap?Uniswap是 2018 年 11 月发布在以太坊主网上的去中心化交易所协议,它的创建者是 Hayden Adams。当前Uniswap在DeFi Pluses上拍名第11位,较之前有下降。不同于其它挂单式去中心化交易所,Uniswap采用了全新的AMM自动做市商算法来执行交易的设计。相比于其他交易所,Uniswap 交易所的智能合约设计能够大幅减少 gas 的用量。如何理解Uniswap的自动做市机制?传统的交易所一般是提供一个挂单平台,通过程序(撮合引擎)撮合买卖双方达成交易。它是一个自由买卖的市场,具有买卖意愿的人们自行挂出“买单”和“卖单”,通过交易所“中介”实现双方订单的成交。传统交易所有以下特点:市场上必须要有用户进行挂单,要有一定量的订单(市场深度)。订单必须重叠才能成交,即买价高于或等于卖价。需要将资产存储在交易所。而Uniswap的模型却完全不同。简单来讲,Uniswap的撮合机制基于一个最基本的公式:K=X*Y。其中,X代表一种资产,Y代表与X等值的另一种资产, 而K则是它俩相乘后的一个函数。当K值不变的情况下,X与Y的值就成反比,即X增加,Y就会减小(反之亦然)。而因为资产Y的较少会导致相对市场的溢价,则会吸引用户来进行搬砖套利,从而抹平价差,使系统重归平衡。下面我们就以ETH与MakerDAO的算法稳定币DAI为例,来为大家解释下这个模型(不考虑手续费)。假设当前ETH价格为150USD,DAI的价格与美金挂钩,等于1USD。现在往系统里注入100ETH与15,000 DAI,则K=100*15,000=1,500,000。当用户将2个ETH兑换成DAI后,ETH总量减少为98,则此时DAI的总量=1,500,000/98=15,306。而因此增加的306个DAI就等于2个ETH的价格,即1ETH=153USD。此时,ETH就会相对市场有溢价,会吸引用户来进行搬砖套利。用户将自己的ETH卖给系统,补充资金池里的ETH,使系统再次回到最初的稳定状态。Uniswap有什么不足之处?在挂单机制下,如果价格达不到挂单者的设置价格,系统是不会成交的。但是在Uniswap的模式下,用户要注意当前资金池的流动性,以免滑点太多,造成资产损失。这里给大家进行了一个简单计算,从表中我们可以看出,随着系统内ETH数量的增加,用户购买单个DAI相对于ETH的成本就会增高。当数量为10ETH时,点差可以达到9.89%。而前段时间UMA上线Uniswap,价格从0.26一路走高到1.2美金的事情也印证了这一点。针对这一点,Balancer做了进一步的修改。但是总体来看,这类AMM机制的DEXes难免会因为流动性问题而出现滑点。不过,对于初创企业来说,此类的DEXes是它们为Token定价并进行销售的福音,Uniswap为他们省去了一大笔要支付给交易所跟做市商的钱。如何在比特派里使用Uniswap?第一步,打开比特派并找到Uniswap安卓版本可以在发现页下的推荐/热门DApp里找到Uniswap。iOS版请更新到bitpie PRO 版本,在发现页的搜索框里输入:https://uniswap.bitpie.com/* Uniswap因为使用的是新加坡域名,所以经常会遇到加载缓慢或者访问出错的情况,而比特派则对此做了优化,当前使用比特派访问Uniswap的体验十分顺畅。第二步,进入DApp主页面,选择要使用的功能图为改版后的Uniswap页面,个人感觉比之前更简洁了。第三步,选择兑换,输入兑换金额及币种,选择浮点后进行兑换这里以ETH兑换DAI为例,并选择接受增加最多0.5%的偏差。设定完毕后,点击“兑换”。待订单确认后,你的钱包地址里就会收到DAI了。从主页面我们可以看到,除了兑换还有“发送”与“资金池”功能。这两个功能都属于V2版本,因为使用时系统会自动切换到V2下。其中,发送与兑换功能大同小异,只是增加了一个收款地址,让你在兑换完成后可以将币发到自己/他人的指定地址,或者ENS域名。而资金池功能,是允许用户通过为系统注入ETH增加系统流动性而获取收益的。下图则展示了如何使用资金池功能为系统注入流动性。以上就是对Uniswap的简介及使用体验了。DeFi市场最近因为Compound的借贷挖矿又火了一把,引来的市场的广泛关注,这对DeFi市场来说是一件好事。同时,DeFi产品因其自身具有去中心化、抗审查、公开透明等特性也正逐渐受到市场的青睐。比特派也会持续关注DeFi生态,为大家带来更多的DeFi产品介绍及体验。本文仅为第三个工具在钱包端的操作教程,不构成任何投资建议。投资有风险,请您谨慎评估。安全、强大钱包就用比特派发布于 2020-09-02 17:08交易所智能合约​赞同 24​​3 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录DeFi挖矿教程大全持续更新各类 DeFi 工具使用,微博@比特

小白课堂 | 一文读懂Uniswap,附Uniswap使用教程 - 知乎

小白课堂 | 一文读懂Uniswap,附Uniswap使用教程 - 知乎首发于数字货币切换模式写文章登录/注册小白课堂 | 一文读懂Uniswap,附Uniswap使用教程书匠火火玄学一、加密货币交易形式 当我们要进行加密货币交易时,使用最早也是目前使用最多的形式还是中心化交易所,在中心化交易所,我们首先需要注册,然后加密货币也需要存入到交易所,由交易所进行托管,如果要提现加密货币出来,也需要经过交易所审核同意。虽然中心化交易所有诸多优势,例如交易速度较快、用户不需要管理私钥,降低了用户的使用门槛,但是它的弊端也是显而易见的,用户的加密货币由交易所托管,交易所是有跑路风险的。也确实发生过多起交易所跑路的事件,几乎每年都有发生。那么,有没有更好的加密货币交易形式呢? 随着区块链技术的不断发展,加密货币交易形式也变得越来越多样化,我们不但可以使用中心化交易所进行交易,也可以使用去中心化交易所进行交易。在去中心化交易所进行交易时,不需要注册,只需要使用数字钱包连接去中心化交易所就可以进行加密货币的交易了,交易完成后,相应的加密货币会自动转入到用户的数字钱包中,用户的资产始终在自己的钱包中,并非像中心化交易所那样托管在交易所,所以,在去中心化交易所进行交易,安全性大大提高了。 目前,去中心化交易所主要有两种形式,一种是交易所撮合买方用户和卖方用户的订单,只不过操作过程发生在链上,典型代表有 EOS 去中心化交易所 Newdex,Newdex 依旧承担了中心化交易所的订单撮合模式。在 Newdex 交易,用户无需注册、资产无需托管,撮合发生在 EOS 链上,数据公开透明。 去中心化交易所的另一种形式是基于兑换池,而非基于买方和卖方订单所构成的订单簿,它类似于人机交易,采取的是柜台模式,就像我们去银行兑换不同国家的法币。典型的代表是 Uniswap。二、Uniswap 是什么Uniswap 是基于以太坊的代币交换协议,是基于兑换池,而不是订单簿的去中心化交易协议。而所谓的兑换池,指的则是一个资金池,用户在 Uniswap 中交易的价格则由这个资金池中的代币比例和算法来决定。Uniswap 是去中心化的,不仅跟传统的加密货币交易所不同,也跟普通的去中心化代币交易所不同。Uniswap 是一组部署到以太坊网络的合约,所有的交易都在链上进行。Uniswap 的交易对手并不是其他交易用户,而是跟代币池进行交易,且有自动做市的模型来计算交易价格,代币兑换价格与代币兑换池中代币的比例有关。三、Uniswap 的功能和优势 在 Uniswap 中,使用最多的功能就是代币之间的币币兑换交易了,由于 Uniswap 是基于以太坊的,所以在 Uniswap 中只能交易以太坊上的加密货币资产。目前 Uniswap 支持的币种大概在150种左右,以太坊上的主流资产基本上都可以在上面进行交易了。当然了,用户也可以自行添加交易对,也就是做市商,这样可以赚取一定的手续费。 使用 Uniswap 这种交易形式,比订单撮合模式速度更快,因为它是基于兑换池的人机交易,节省了撮合时间。而且 Uniswap 支持的币种间可以实现两两兑换交易,交易对明显比中心化交易所更丰富。 例如: LRC 和 KNC 之间的交易,在 Uniswap 是可以一步完成交易(虽然系统可能需要转换,但在用户看来就是一步交易)的。而在中心化交易所,LRC 和 KNC 没有直接的交易对,用户最少需要两次交易,即把 LRC 兑换成 ETH ,再用 ETH 和 KNC 交易。很显然,对于用户来说,Uniswap 更便捷。四、如何使用 Uniswap 进行币币兑换交易 我们可以通过多链钱包 TokenPocket 来连接 Uniswap 进行交易。在 TP 钱包的发现界面的 DeFi 区,找到 Uniswap 并点击进入。1、兑换我们可以选择 V2 版本。在兑换界面中,输入表示的是拿来用于兑换的币种,而输出表示的是兑换后的币种。例如:拿 LRC 兑换 KNC,输入部分要选择 LRC,而输出部分要选择 KNC。在选择好输入输出币种后,输入输填写数量,即用于兑换 KNC 的 LRC 数量,可以收到的 KNC 数量就会根据 LRC/KNC 当前的汇率自动计算出来并填充。输入完成后,点击"授权 LRC"按钮,然后点击右侧的"兑换"就可以完成 LRC 和 KNC 之间的兑换了。2、发送 在 Uniswap 的发送界面中,主要有两个功能。一个是转账功能。选择要转出的币种,输入转账数量以及接收地址,然后点击"send"就可以转账了,这和一般的钱包转账也没什么区别。另外一个功能是"兑换+转账",挺有意思的一个功能。 例如我们要把 LRC 兑换为 KNC,并转账到另外一个 ETH 地址中,就可以使用该功能,还是挺方便的。首先,在发送界面中点击"添加兑换"按钮。 然后选择兑换的两个币种和用于兑换 KNC 的 LRC 数量,并输入接收地址。最后,点击"授权LRC"按钮后,点击 "Send"按钮就可以完成代币的兑换以及转账了。3、资金池 在 Uniswap 中,除了可以用于代币兑换之外,还可以加入 Uniswap 的资金池,通过为 Uniswap 提供流动性而赚取收益。首先在"资金池"界面中点击"加入一个资金池"按钮,然后选择一个流动性池,例如选择 ETH/USDT,在选择了流动性池后,输入要存入资金池的币种数量。注意,交易对是成比例存入资金池的,例如上例中,如果存入 0.091216 ETH 到资金池,那么USDT就要存入21.751个。 输入完成后,点击下面的"授权 USDT",然后点击"供应"就可以加入资金池了。总之,通过 Uniswap 进行以太坊上数字资产之间的交易,还是非常方便的,不需要注册,也不需要托管在交易所,通过钱包连接到 Uniswap 就可以进行交易了,交易完成后,相应的数字资产也会自动转入到用户的 ETH 钱包中,而且在兑换时还可以选择转到其他地址中。如果要使用 Uniswap 进行交易,可以到多链钱包 TokenPocket 中体验和使用。源自公众号:库尔班区块链发布于 2020-12-15 18:58Uniswap去中心化交易所(DEX)​赞同 83​​31 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录数字货币在这里,读懂

DeFi工具—UNISWAP使用教程 - 知乎

DeFi工具—UNISWAP使用教程 - 知乎首发于DeFi挖矿教程大全切换模式写文章登录/注册DeFi工具—UNISWAP使用教程派派什么是Uniswap?Uniswap是 2018 年 11 月发布在以太坊主网上的去中心化交易所协议,它的创建者是 Hayden Adams。当前Uniswap在DeFi Pluses上拍名第11位,较之前有下降。不同于其它挂单式去中心化交易所,Uniswap采用了全新的AMM自动做市商算法来执行交易的设计。相比于其他交易所,Uniswap 交易所的智能合约设计能够大幅减少 gas 的用量。如何理解Uniswap的自动做市机制?传统的交易所一般是提供一个挂单平台,通过程序(撮合引擎)撮合买卖双方达成交易。它是一个自由买卖的市场,具有买卖意愿的人们自行挂出“买单”和“卖单”,通过交易所“中介”实现双方订单的成交。传统交易所有以下特点:市场上必须要有用户进行挂单,要有一定量的订单(市场深度)。订单必须重叠才能成交,即买价高于或等于卖价。需要将资产存储在交易所。而Uniswap的模型却完全不同。简单来讲,Uniswap的撮合机制基于一个最基本的公式:K=X*Y。其中,X代表一种资产,Y代表与X等值的另一种资产, 而K则是它俩相乘后的一个函数。当K值不变的情况下,X与Y的值就成反比,即X增加,Y就会减小(反之亦然)。而因为资产Y的较少会导致相对市场的溢价,则会吸引用户来进行搬砖套利,从而抹平价差,使系统重归平衡。下面我们就以ETH与MakerDAO的算法稳定币DAI为例,来为大家解释下这个模型(不考虑手续费)。假设当前ETH价格为150USD,DAI的价格与美金挂钩,等于1USD。现在往系统里注入100ETH与15,000 DAI,则K=100*15,000=1,500,000。当用户将2个ETH兑换成DAI后,ETH总量减少为98,则此时DAI的总量=1,500,000/98=15,306。而因此增加的306个DAI就等于2个ETH的价格,即1ETH=153USD。此时,ETH就会相对市场有溢价,会吸引用户来进行搬砖套利。用户将自己的ETH卖给系统,补充资金池里的ETH,使系统再次回到最初的稳定状态。Uniswap有什么不足之处?在挂单机制下,如果价格达不到挂单者的设置价格,系统是不会成交的。但是在Uniswap的模式下,用户要注意当前资金池的流动性,以免滑点太多,造成资产损失。这里给大家进行了一个简单计算,从表中我们可以看出,随着系统内ETH数量的增加,用户购买单个DAI相对于ETH的成本就会增高。当数量为10ETH时,点差可以达到9.89%。而前段时间UMA上线Uniswap,价格从0.26一路走高到1.2美金的事情也印证了这一点。针对这一点,Balancer做了进一步的修改。但是总体来看,这类AMM机制的DEXes难免会因为流动性问题而出现滑点。不过,对于初创企业来说,此类的DEXes是它们为Token定价并进行销售的福音,Uniswap为他们省去了一大笔要支付给交易所跟做市商的钱。如何在比特派里使用Uniswap?第一步,打开比特派并找到Uniswap安卓版本可以在发现页下的推荐/热门DApp里找到Uniswap。iOS版请更新到bitpie PRO 版本,在发现页的搜索框里输入:https://uniswap.bitpie.com/* Uniswap因为使用的是新加坡域名,所以经常会遇到加载缓慢或者访问出错的情况,而比特派则对此做了优化,当前使用比特派访问Uniswap的体验十分顺畅。第二步,进入DApp主页面,选择要使用的功能图为改版后的Uniswap页面,个人感觉比之前更简洁了。第三步,选择兑换,输入兑换金额及币种,选择浮点后进行兑换这里以ETH兑换DAI为例,并选择接受增加最多0.5%的偏差。设定完毕后,点击“兑换”。待订单确认后,你的钱包地址里就会收到DAI了。从主页面我们可以看到,除了兑换还有“发送”与“资金池”功能。这两个功能都属于V2版本,因为使用时系统会自动切换到V2下。其中,发送与兑换功能大同小异,只是增加了一个收款地址,让你在兑换完成后可以将币发到自己/他人的指定地址,或者ENS域名。而资金池功能,是允许用户通过为系统注入ETH增加系统流动性而获取收益的。下图则展示了如何使用资金池功能为系统注入流动性。以上就是对Uniswap的简介及使用体验了。DeFi市场最近因为Compound的借贷挖矿又火了一把,引来的市场的广泛关注,这对DeFi市场来说是一件好事。同时,DeFi产品因其自身具有去中心化、抗审查、公开透明等特性也正逐渐受到市场的青睐。比特派也会持续关注DeFi生态,为大家带来更多的DeFi产品介绍及体验。本文仅为第三个工具在钱包端的操作教程,不构成任何投资建议。投资有风险,请您谨慎评估。安全、强大钱包就用比特派发布于 2020-09-02 17:08交易所智能合约​赞同 24​​3 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录DeFi挖矿教程大全持续更新各类 DeFi 工具使用,微博@比特

DeFi工具—UNISWAP使用教程 - 知乎

DeFi工具—UNISWAP使用教程 - 知乎首发于DeFi挖矿教程大全切换模式写文章登录/注册DeFi工具—UNISWAP使用教程派派什么是Uniswap?Uniswap是 2018 年 11 月发布在以太坊主网上的去中心化交易所协议,它的创建者是 Hayden Adams。当前Uniswap在DeFi Pluses上拍名第11位,较之前有下降。不同于其它挂单式去中心化交易所,Uniswap采用了全新的AMM自动做市商算法来执行交易的设计。相比于其他交易所,Uniswap 交易所的智能合约设计能够大幅减少 gas 的用量。如何理解Uniswap的自动做市机制?传统的交易所一般是提供一个挂单平台,通过程序(撮合引擎)撮合买卖双方达成交易。它是一个自由买卖的市场,具有买卖意愿的人们自行挂出“买单”和“卖单”,通过交易所“中介”实现双方订单的成交。传统交易所有以下特点:市场上必须要有用户进行挂单,要有一定量的订单(市场深度)。订单必须重叠才能成交,即买价高于或等于卖价。需要将资产存储在交易所。而Uniswap的模型却完全不同。简单来讲,Uniswap的撮合机制基于一个最基本的公式:K=X*Y。其中,X代表一种资产,Y代表与X等值的另一种资产, 而K则是它俩相乘后的一个函数。当K值不变的情况下,X与Y的值就成反比,即X增加,Y就会减小(反之亦然)。而因为资产Y的较少会导致相对市场的溢价,则会吸引用户来进行搬砖套利,从而抹平价差,使系统重归平衡。下面我们就以ETH与MakerDAO的算法稳定币DAI为例,来为大家解释下这个模型(不考虑手续费)。假设当前ETH价格为150USD,DAI的价格与美金挂钩,等于1USD。现在往系统里注入100ETH与15,000 DAI,则K=100*15,000=1,500,000。当用户将2个ETH兑换成DAI后,ETH总量减少为98,则此时DAI的总量=1,500,000/98=15,306。而因此增加的306个DAI就等于2个ETH的价格,即1ETH=153USD。此时,ETH就会相对市场有溢价,会吸引用户来进行搬砖套利。用户将自己的ETH卖给系统,补充资金池里的ETH,使系统再次回到最初的稳定状态。Uniswap有什么不足之处?在挂单机制下,如果价格达不到挂单者的设置价格,系统是不会成交的。但是在Uniswap的模式下,用户要注意当前资金池的流动性,以免滑点太多,造成资产损失。这里给大家进行了一个简单计算,从表中我们可以看出,随着系统内ETH数量的增加,用户购买单个DAI相对于ETH的成本就会增高。当数量为10ETH时,点差可以达到9.89%。而前段时间UMA上线Uniswap,价格从0.26一路走高到1.2美金的事情也印证了这一点。针对这一点,Balancer做了进一步的修改。但是总体来看,这类AMM机制的DEXes难免会因为流动性问题而出现滑点。不过,对于初创企业来说,此类的DEXes是它们为Token定价并进行销售的福音,Uniswap为他们省去了一大笔要支付给交易所跟做市商的钱。如何在比特派里使用Uniswap?第一步,打开比特派并找到Uniswap安卓版本可以在发现页下的推荐/热门DApp里找到Uniswap。iOS版请更新到bitpie PRO 版本,在发现页的搜索框里输入:https://uniswap.bitpie.com/* Uniswap因为使用的是新加坡域名,所以经常会遇到加载缓慢或者访问出错的情况,而比特派则对此做了优化,当前使用比特派访问Uniswap的体验十分顺畅。第二步,进入DApp主页面,选择要使用的功能图为改版后的Uniswap页面,个人感觉比之前更简洁了。第三步,选择兑换,输入兑换金额及币种,选择浮点后进行兑换这里以ETH兑换DAI为例,并选择接受增加最多0.5%的偏差。设定完毕后,点击“兑换”。待订单确认后,你的钱包地址里就会收到DAI了。从主页面我们可以看到,除了兑换还有“发送”与“资金池”功能。这两个功能都属于V2版本,因为使用时系统会自动切换到V2下。其中,发送与兑换功能大同小异,只是增加了一个收款地址,让你在兑换完成后可以将币发到自己/他人的指定地址,或者ENS域名。而资金池功能,是允许用户通过为系统注入ETH增加系统流动性而获取收益的。下图则展示了如何使用资金池功能为系统注入流动性。以上就是对Uniswap的简介及使用体验了。DeFi市场最近因为Compound的借贷挖矿又火了一把,引来的市场的广泛关注,这对DeFi市场来说是一件好事。同时,DeFi产品因其自身具有去中心化、抗审查、公开透明等特性也正逐渐受到市场的青睐。比特派也会持续关注DeFi生态,为大家带来更多的DeFi产品介绍及体验。本文仅为第三个工具在钱包端的操作教程,不构成任何投资建议。投资有风险,请您谨慎评估。安全、强大钱包就用比特派发布于 2020-09-02 17:08交易所智能合约​赞同 24​​3 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录DeFi挖矿教程大全持续更新各类 DeFi 工具使用,微博@比特

小白课堂 | 一文读懂Uniswap,附Uniswap使用教程 - 知乎

小白课堂 | 一文读懂Uniswap,附Uniswap使用教程 - 知乎首发于数字货币切换模式写文章登录/注册小白课堂 | 一文读懂Uniswap,附Uniswap使用教程书匠火火玄学一、加密货币交易形式 当我们要进行加密货币交易时,使用最早也是目前使用最多的形式还是中心化交易所,在中心化交易所,我们首先需要注册,然后加密货币也需要存入到交易所,由交易所进行托管,如果要提现加密货币出来,也需要经过交易所审核同意。虽然中心化交易所有诸多优势,例如交易速度较快、用户不需要管理私钥,降低了用户的使用门槛,但是它的弊端也是显而易见的,用户的加密货币由交易所托管,交易所是有跑路风险的。也确实发生过多起交易所跑路的事件,几乎每年都有发生。那么,有没有更好的加密货币交易形式呢? 随着区块链技术的不断发展,加密货币交易形式也变得越来越多样化,我们不但可以使用中心化交易所进行交易,也可以使用去中心化交易所进行交易。在去中心化交易所进行交易时,不需要注册,只需要使用数字钱包连接去中心化交易所就可以进行加密货币的交易了,交易完成后,相应的加密货币会自动转入到用户的数字钱包中,用户的资产始终在自己的钱包中,并非像中心化交易所那样托管在交易所,所以,在去中心化交易所进行交易,安全性大大提高了。 目前,去中心化交易所主要有两种形式,一种是交易所撮合买方用户和卖方用户的订单,只不过操作过程发生在链上,典型代表有 EOS 去中心化交易所 Newdex,Newdex 依旧承担了中心化交易所的订单撮合模式。在 Newdex 交易,用户无需注册、资产无需托管,撮合发生在 EOS 链上,数据公开透明。 去中心化交易所的另一种形式是基于兑换池,而非基于买方和卖方订单所构成的订单簿,它类似于人机交易,采取的是柜台模式,就像我们去银行兑换不同国家的法币。典型的代表是 Uniswap。二、Uniswap 是什么Uniswap 是基于以太坊的代币交换协议,是基于兑换池,而不是订单簿的去中心化交易协议。而所谓的兑换池,指的则是一个资金池,用户在 Uniswap 中交易的价格则由这个资金池中的代币比例和算法来决定。Uniswap 是去中心化的,不仅跟传统的加密货币交易所不同,也跟普通的去中心化代币交易所不同。Uniswap 是一组部署到以太坊网络的合约,所有的交易都在链上进行。Uniswap 的交易对手并不是其他交易用户,而是跟代币池进行交易,且有自动做市的模型来计算交易价格,代币兑换价格与代币兑换池中代币的比例有关。三、Uniswap 的功能和优势 在 Uniswap 中,使用最多的功能就是代币之间的币币兑换交易了,由于 Uniswap 是基于以太坊的,所以在 Uniswap 中只能交易以太坊上的加密货币资产。目前 Uniswap 支持的币种大概在150种左右,以太坊上的主流资产基本上都可以在上面进行交易了。当然了,用户也可以自行添加交易对,也就是做市商,这样可以赚取一定的手续费。 使用 Uniswap 这种交易形式,比订单撮合模式速度更快,因为它是基于兑换池的人机交易,节省了撮合时间。而且 Uniswap 支持的币种间可以实现两两兑换交易,交易对明显比中心化交易所更丰富。 例如: LRC 和 KNC 之间的交易,在 Uniswap 是可以一步完成交易(虽然系统可能需要转换,但在用户看来就是一步交易)的。而在中心化交易所,LRC 和 KNC 没有直接的交易对,用户最少需要两次交易,即把 LRC 兑换成 ETH ,再用 ETH 和 KNC 交易。很显然,对于用户来说,Uniswap 更便捷。四、如何使用 Uniswap 进行币币兑换交易 我们可以通过多链钱包 TokenPocket 来连接 Uniswap 进行交易。在 TP 钱包的发现界面的 DeFi 区,找到 Uniswap 并点击进入。1、兑换我们可以选择 V2 版本。在兑换界面中,输入表示的是拿来用于兑换的币种,而输出表示的是兑换后的币种。例如:拿 LRC 兑换 KNC,输入部分要选择 LRC,而输出部分要选择 KNC。在选择好输入输出币种后,输入输填写数量,即用于兑换 KNC 的 LRC 数量,可以收到的 KNC 数量就会根据 LRC/KNC 当前的汇率自动计算出来并填充。输入完成后,点击"授权 LRC"按钮,然后点击右侧的"兑换"就可以完成 LRC 和 KNC 之间的兑换了。2、发送 在 Uniswap 的发送界面中,主要有两个功能。一个是转账功能。选择要转出的币种,输入转账数量以及接收地址,然后点击"send"就可以转账了,这和一般的钱包转账也没什么区别。另外一个功能是"兑换+转账",挺有意思的一个功能。 例如我们要把 LRC 兑换为 KNC,并转账到另外一个 ETH 地址中,就可以使用该功能,还是挺方便的。首先,在发送界面中点击"添加兑换"按钮。 然后选择兑换的两个币种和用于兑换 KNC 的 LRC 数量,并输入接收地址。最后,点击"授权LRC"按钮后,点击 "Send"按钮就可以完成代币的兑换以及转账了。3、资金池 在 Uniswap 中,除了可以用于代币兑换之外,还可以加入 Uniswap 的资金池,通过为 Uniswap 提供流动性而赚取收益。首先在"资金池"界面中点击"加入一个资金池"按钮,然后选择一个流动性池,例如选择 ETH/USDT,在选择了流动性池后,输入要存入资金池的币种数量。注意,交易对是成比例存入资金池的,例如上例中,如果存入 0.091216 ETH 到资金池,那么USDT就要存入21.751个。 输入完成后,点击下面的"授权 USDT",然后点击"供应"就可以加入资金池了。总之,通过 Uniswap 进行以太坊上数字资产之间的交易,还是非常方便的,不需要注册,也不需要托管在交易所,通过钱包连接到 Uniswap 就可以进行交易了,交易完成后,相应的数字资产也会自动转入到用户的 ETH 钱包中,而且在兑换时还可以选择转到其他地址中。如果要使用 Uniswap 进行交易,可以到多链钱包 TokenPocket 中体验和使用。源自公众号:库尔班区块链发布于 2020-12-15 18:58Uniswap去中心化交易所(DEX)​赞同 83​​31 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录数字货币在这里,读懂

Uniswap (UNI) | 欧易

wap (UNI) | 欧易交易所Web3 钱包买币快捷买币流程简单,快速成交C2C 买币灵活选择,0 手续费第三方支付Banxa, Simplex等发现市场查看最新行情和交易大数据机会发掘最热、最新币种,及时捕捉市场机会交易交易类型闪兑币币兑换,零费率,无滑点币币轻松买卖数字货币合约交易永续和交割合约,灵活使用杠杆杠杆借币交易,实现收益最大化期权利用市场波动,赚取收益,降低交易风险交易工具策略交易多种智能策略,助您轻松交易策略广场创建策略流动性市场为交割价差、自定义多腿策略和大宗交易带来深度流动性价差速递询价单金融赚币持币生币, 赚取收益简单赚币链上赚币结构化产品借贷质押数字资产,满足投资&消费需求Jumpstart抢先发现全球优质新项目公链X1探索 X1进入 Web3 的世界X1点燃创意、引领创新测试网浏览器测试网链上数据X1 生态探索 X1 DApp开发者无限扩容开发者文档查看技术文档测试网水龙头获取测试网 OKB预言机获取价格数据GitHub探索 X1 仓库官方应用基础建设产品跨链桥在以太坊与 X1 间进行资产跨链OKTC探索 OKTCEVM 和 IBC 兼容公链OKTC去中心化的 L1 区块链网络OKTC 浏览器主网链上数据测试网浏览器测试网链上数据官方应用基础建设产品IBC 转账在 Cosmos 网络之间进行转账兑换在 OKTC 上交易代币流动性质押质押 OKT 获得 stOKTMultisig safe多签数字资产钱包开发者构建未来预言机获取价格数据开发者分红返还 Gas 费用,获得 OKTSubgraph索引和查询链上数据GitHub探索 OKTC 仓库测试网水龙头获取测试网 OKT开发者文档查看技术文档用户社区信任过程,共享成长Galxe 活动领先的 Web3 数据网络QuestN 频道Web3 用户一站式社群机构客户机构首页为机构客户提供最强劲、最完整的数字货币交易解决方案流动性市场支持场外交易,为专业交易员和机构用户提供流动性API超低延迟的 API 无缝连接您的数据和操作尊享借币提高资金利用率,降低风险经纪商项目享受世界一流的市场深度,获得高额的佣金回赠资管子账户统一管理子账户,让交易变得更轻松、更安全、更实惠历史行情数据K线图、交易汇总、订单表数据等信息尽在掌握新手学院更多产品OKB资金安全Status储备金证明其他奖励中心邀请好友节点计划OKX Ventures使用 TradingView 交易登录注册用户支持帮助中心我的客服工单加入欧易社群Discord

学院区块链词典文章区块链概念Uniswap (UNI)欧易发布于 2021年6月18日更新于 2023年11月08日Uniswap是一种基于以太坊的协议,旨在促进ETH和ERC20 代币数字资产之间的自动兑换交易,在以太坊上自动提供流动性。Uniswap完全部署在链上,任何个人用户,只要安装了去中心化钱包软件都可以使用这个协议。Uniswap试图利用去中心化协议来让数字资产交易过程中彻底实现去中介化。

去购买UNI

相关推荐查看更多ERC-20介绍ERC-20和ERC-721之前,先介绍下ERC是什么。 一、ERC-20为开发者提供了,在以太坊一键发行通证的功能: ERC是Ethereum Request for Comment的缩写,即开发者对于以太坊通证和生态提出的建议,更专业的解释就是关于通证设计具体标准的代2023年11月8日Web3Web3该概念由Polkadot 创始人 Gavin 博士提出,Gavin 认为,Web3 是一组包容性协议,为应用程序制造商提供构建块。这些构建块取代了传统的 Web 技术,如 HTTP,AJAX,MySQL,提供了一种创建应用程序的全新方式。这些技术为用户提供了强大且可验证的保证,从2023年9月26日行业热词EIP-1559EIP-1559提议变更了以太坊的费用模式,该提案通过烧掉ETH支付的费用而不是分配给矿工来减少交易费用的波动性。 EIP-1559改变了以第一价拍卖为基础的Gas fee计算逻辑。第一拍卖即价高者得,用户为了让矿工及时打包自己的交易,需要加价支付矿工费,出价越高,被优先打2023年11月8日区块链概念比特币ETF简介什么是比特币ETF? 比特币ETF,即比特币交易所交易基金,可以使交易者通过传统股票市场获得比特币风险敞口,而无需直接持有比特币。按照具体交易产品的不同,可以分为比特币现货ETF、比特币期货ETF。 比特币ETF有什么优势? 相比目前市场上以GBTC为代表的主流数字资产信托2023年11月17日行业热词策略交易模式策略交易是一种帮助用户进行自动交易的工具。相比手动交易,策略交易有降低交易风险、减少操作成本、掌控交易时机等优势,成为深受投资者喜爱的一种交易模式。 目前欧易平台为用户提供了网格、DCA、冰山策略等多种不同的策略交易模式,是市面上最为成熟的提供多套策略的平台之一。此外,欧易提供策2023年11月18日交易概念统一交易账户介绍统一交易账户(Unified Account)是欧易面向广大用户推出的新一代交易系统,支持在一个账户中使用多币种资产同时交易现货和各类衍生品,这将会为用户的交易提供极大的便利,不再需要在多个账户之间进行资金划转;且不同业务线的盈亏可以互相抵消、有效提升了用户的资金利用率。统一交易2023年7月4日交易概念

©2017 - 2024 OKX.COM简体中文English繁體中文Français (Afrique)РусскийTiếng ViệtBahasa IndonesiaTürkçeDeutschItalianoPolskiPortuguês (Brasil)Português (Portugal)Español (España)Español (Latinoamérica)ČeštinaRomânăУкраїнськаالعربيةNederlands关于欧易关于我们职业机会联系我们服务条款隐私保护免责声明廉正举报执法请求欧易 App产品快捷买币C2C 交易闪兑交易赚币OKTCWeb3 钱包Web3 市场数字货币计算器策略交易浏览所有数字货币新手学院TradingView服务节点计划V5 API历史行情数据费率标准上币申请C2C 认证商家申请用户支持帮助中心官方验证公告加入欧易社群买币购买 USDC购买泰达币 (USDT)购买比特币 (Bitcoin)购买以太币 (Ethereum)购买 ADA购买 Solana购买 MATIC购买 Litecoin购买 XRP数字货币计算器BTC 兑换 CNYETH 兑换 CNYUSDT 兑换 CNYSOL 兑换 CNYXRP 兑换 CNY交易BTC USDCETH USDCBTC USDTETH USDTMATIC USDTLTC USDTSOL USDTXRP USDT比特币 (BTC) 价格以太坊 (ETH) 价格Cardano 价格Solana 价格XRP 价格欧易,随时随地交易注册扫码下载欧易

用户界面 | Uniswap V3 Book 中文版

| Uniswap V3 Book 中文版

Uniswap V3 Book 中文版Milestone 0. 简介交易市场简介恒定函数做市商(CFMM)Uniswap V3开发环境Milestone 1. 第一笔交易简介计算流动性提供流动性第一笔交易管理合约部署合约用户界面Milestone 2. 第二笔交易简介输出金额计算Solidity中的数学运算Tick Bitmap Index通用mint通用swap报价合约用户界面Milestone 3. 跨tick交易简介不同价格区间跨tick交易滑点保护流动性计算关于定点数的拓展闪电贷用户界面Milestone 4. 多池子交易简介工厂合约交易路径多池子交易用户界面Tick 舍入Milestone 5. 费率和价格预言机简介交易费率闪电贷费率协议费率价格预言机用户界面Milestone 6: NFT positions简介ERC721 概述NFT 管理员合约NFT 渲染器补充资料中英名词对照

用户界面

用户界面相关工具一览什么是 MetaMask?常用库工作流连接到本地节点链接到 MetaMask提供流动性交易 Token订阅更新

\[ \]用户界面

#现在,我们可以进行这个 milestone 的最后一步了——搭建一个 UI!由于搭建前端 app 并不是本书的主要目的,本书将不会讲解如何从头搭建一个这样的前端,而是展示如何使用 MetaMask 与智能合约进行交互。如果你希望自己尝试这个 app,在本地运行它,你可以在代码仓库中的 ui文件夹找到对应代码。这就是一个简单的React 应用,本地运行只需要在 App.js 中设置合约地址,然后运行 yarn start。相关工具一览

#什么是 MetaMask?

#MetaMask 是一个浏览器插件的以太坊钱包。它能够创建和存储私钥、展示账户余额、允许链接到不同网络、发送和接受以太或其他 token——钱包能做的所有事情几乎都可以在其中实现。除此之外,MetaMask 还能够作为 signer 和 provider 来运行。作为 provider,它链接到一个以太坊节点,并且提供一个接口来使用对应节点的 JSON-RPC API。作为一个 signer,它提供了一个能够进行安全交易签名的接口,因此能够使用钱包中的私钥来签名任意交易。常用库

#事实上,MetaMask 也并没有提供那么多的功能:它仅仅是能够管理账户和发送交易。我们需要其他一些库来使得与合约的交互更加容易,并且能更轻松地解析 EVM 相关的数据。这样的库有很多,其中最流行的两个是 web3.js 和 ethers.js。选择哪一个取决于你的个人喜好。对本书作者来说,选择 Ethers.js 因为其与合约交互的接口更加清晰工作流

#现在,让我们看一下如何使用 MetaMask + Ethers.js 来实现交互。连接到本地节点

#为了能够发送交易和获取区块链数据,MetaMask链接到一个以太坊节点。为了与我们的合约交互,我们需要钱包链接到本地的 Anvil 节点。打开 MetaMask,点击网络列表——添加网络,增加一个网络,RPC URL为http://localhost:8545。钱包将会自动检测对应的 chain ID(在 Anvil 中为 31331).链接到本地节点之后,我们需要导入一个私钥。在 MetaMask 中,点击地址列表——导入账户,把之前选择的地址对应的私钥粘贴在这里。然后进入资产列表,导入两种 token 的地址。现在你可以在 MetaMask 上看到两种 token 的余额了。MetaMask 实际上有一些 bug。一个我经常遇到的 bug 是,当它连接到本地节点时,它通常会缓存链状态。因此每次重启节点的时候,你有可能会看到旧的余额和状态。解决方法是:打开高级设置,点击“重置账户”。每次重启节点后你可能都需要进行这个步骤。链接到 MetaMask

#并不是每一个网站都能够访问到你在 MetaMask 中的地址。一个网站首先需要链接到 MetaMask。当一个新的网站想要连接 MetaMask 时,你会看到一个弹窗来请求许可。前端连接 MetaMask 的方式如下:// ui/src/contexts/MetaMask.js

const connect = () => {

if (typeof (window.ethereum) === 'undefined') {

return setStatus('not_installed');

}

Promise.all([

window.ethereum.request({ method: 'eth_requestAccounts' }),

window.ethereum.request({ method: 'eth_chainId' }),

]).then(function ([accounts, chainId]) {

setAccount(accounts[0]);

setChain(chainId);

setStatus('connected');

})

.catch(function (error) {

console.error(error)

});

}

window.ethereum 是 MetaMask 提供的一个对象,是与 MetaMask 进行交互的接口。如果它是 undefined,说明没有安装 MetaMask。如果它是有定义的,我们向 MetaMask 发送两个请求:eth_requestAccounts 和 eth_chainId。事实上,eth_requestAccounts 把一个网站连接到 MetaMask。它向 MetaMask 请求一个地址,之后 MetaMask 向用户请求许可。用户能够选择它可以连接的钱包地址。eth_chainId 会请求 MetaMask 连接到的节点的 chain ID。在获取地址和 chain ID 之后,通常可以把它展示在前端页面:提供流动性

#为了向池子中提供流动性,我们需要搭建一个表单,要求用户填入希望质押的 token 数量。在点击 “Submit” 之后,前端会构建一个交易调用管理合约的 mint 函数并且把用户填入的数量作为参数传递。我们来看一下这个功能如何实现。Ether.js 提供了 Contract 接口来与合约交互。它让这个过程变得十分简单,因为它替我们完成了编码函数参数、创建一个合法交易、把数据交给 MetaMask 这几个步骤。对于我们来说,调用合约就像调用一个 JS 对象的异步方法一样。让我们来看看如何建立一个 Contract 的实例:token0 = new ethers.Contract(

props.config.token0Address,

props.config.ABIs.ERC20,

new ethers.providers.Web3Provider(window.ethereum).getSigner()

);

一个 Contract 实例是一个地址和部署在这个地址上的合约的 ABI。我们需要 ABI 来与合约进行交互。第三个参数是由 MetaMask 提供的 signer 接口——用来让 JS 合约调用 MetaMask 签名交易。现在,我们添加一个函数,来为池子增加流动性:const addLiquidity = (account, { token0, token1, manager }, { managerAddress, poolAddress }) => {

const amount0 = ethers.utils.parseEther("0.998976618347425280");

const amount1 = ethers.utils.parseEther("5000"); // 5000 USDC

const lowerTick = 84222;

const upperTick = 86129;

const liquidity = ethers.BigNumber.from("1517882343751509868544");

const extra = ethers.utils.defaultAbiCoder.encode(

["address", "address", "address"],

[token0.address, token1.address, account]

);

...

第一项就是要准备参数。我们还是使用之前手动计算出来的值。接下来,我们需要允许允许管理合约操作我们的 token。首先检查一下现在的许可情况:Promise.all(

[

token0.allowance(account, managerAddress),

token1.allowance(account, managerAddress)

]

)

然后我们会检查现在的许可是否足够完成这笔交易。如果不够,我们需要发送一个 approve 交易,让用户同意管理合约花费他的一定数量的 token。在确保用户 approve 足够的数量之后,我们调用 manager.mint 来添加流动性:.then(([allowance0, allowance1]) => {

return Promise.resolve()

.then(() => {

if (allowance0.lt(amount0)) {

return token0.approve(managerAddress, amount0).then(tx => tx.wait())

}

})

.then(() => {

if (allowance1.lt(amount1)) {

return token1.approve(managerAddress, amount1).then(tx => tx.wait())

}

})

.then(() => {

return manager.mint(poolAddress, lowerTick, upperTick, liquidity, extra)

.then(tx => tx.wait())

})

.then(() => {

alert('Liquidity added!');

});

})

lt 是 BigNumber 的一个方法。Ethers.js 使用 BigNumber 来代表 uint256 类型,因为 JavaScript 本身精度不足。这也是我们希望有一个相关库的原因。除了 token 许可的部分以外,这跟测试合约基本一致。上述代码中的 token0, token1, 和 manager 都是 Contract 的实例。approve 和 mint 都是合约函数,是从我们初始化合约时提供的 ABI 中动态生成的。当调用这些方法时, Ethers.js 会:编码函数参数;构建一个交易;将交易传递给 MetaMask 并请求签名;用户看到 MetaMask 弹窗并点击“确认”;将交易发送给 MetaMask 连接的节点;返回包含这笔交易完整信息的一个对象。交易对象包含一个 wait 函数,我们调用它来等待一个交易上链——这能够让我们等待这一笔交易成功再执行下一笔交易。以太坊对于交易顺序有严格要求。还记得 nonce 嘛?它是账户级别对于交易的 index。每一笔新的交易都会增加这个 index,并且以太坊只有在上一笔交易(nonce 更小的交易)执行完成后才会执行下一笔交易。交易 Token

#在交易 token 时,我们使用相同的模式:从用户输入获取参数,检查许可,调用管理合约的 swap。const swap = (amountIn, account, { tokenIn, manager, token0, token1 }, { managerAddress, poolAddress }) => {

const amountInWei = ethers.utils.parseEther(amountIn);

const extra = ethers.utils.defaultAbiCoder.encode(

["address", "address", "address"],

[token0.address, token1.address, account]

);

tokenIn.allowance(account, managerAddress)

.then((allowance) => {

if (allowance.lt(amountInWei)) {

return tokenIn.approve(managerAddress, amountInWei).then(tx => tx.wait())

}

})

.then(() => {

return manager.swap(poolAddress, extra).then(tx => tx.wait())

})

.then(() => {

alert('Swap succeeded!');

}).catch((err) => {

console.error(err);

alert('Failed!');

});

}

唯一新出现的函数就只有 ethers.utils.parseEther(),用来把 ether 单位的数值转换成 wei 单位,以太坊中的最小单位(译者注:也即合约中使用的单位)。订阅更新

#对于一个去中心化的应用,反应当前的区块链状态时很重要的。例如,在一个去中心化的交易市场中,正确地计算现在的价格是很重要的;过时的数据可能会导致滑点(slippage)并使得交易失败。当开发池子合约的时候,我们学习过 event,它能够作为区块链数据的索引:无论何时智能合约的状态发生改变都发出一个 event 是种好习惯,因为 event 能够作为索引帮助快速搜索需要的信息。我们现在需要做的,就是订阅合约的 event 来保证前端 app 的实时更新。让我们来实现这部分吧!如果你在之前看过了上一章 forge 生成的 ABI,你会发现其中也包含 event 的描述:名字和参数。很棒的是:[Ethers.js会处理它们]并且为我们提供一个接口来订阅新的 event。我们来看一下它是怎么工作的。订阅事件需要使用 on(EVENT_NAME, handler) 函数。callback 会接受 event 的所有值和 event 本身来作为参数:const subscribeToEvents = (pool, callback) => {

pool.on("Mint", (sender, owner, tickLower, tickUpper, amount, amount0, amount1, event) => callback(event));

pool.on("Swap", (sender, recipient, amount0, amount1, sqrtPriceX96, liquidity, tick, event) => callback(event));

}

如果想要筛选和拿到之前的 event,我们可以使用 queryFilter:Promise.all([

pool.queryFilter("Mint", "earliest", "latest"),

pool.queryFilter("Swap", "earliest", "latest"),

]).then(([mints, swaps]) => {

...

});

你可能注意到,event中的一些参数被标注为 indexed——这样的域能够被以太坊节点作为索引,允许通过某些域的值来搜索事件。例如,Swap 事件有 sender 和 recipient 两个域被标注为indexed,因此我们可以通过交易的发送者和接收者来搜索对应交易。Ethers.js 当然也提供了这个功能:const swapFilter = pool.filters.Swap(sender, recipient);

const swaps = await pool.queryFilter(swapFilter, fromBlock, toBlock);

OK!现在我们彻底完成了 milestone 1!用户界面相关工具一览什么是 MetaMask?常用库工作流连接到本地节点链接到 MetaMask提供流动性交易 Token订

Just a moment...

a moment...Enable JavaScript and cookies to conti

Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance

Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance

Error 403 Forbidden - This request is blocked.

For security reasons you can't connect to the server for this app or website at this time.

It maybe that you have too many requests or the illegal request payload is identified as an attack.

Please try again later.

Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance

Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance

Error 403 Forbidden - This request is blocked.

For security reasons you can't connect to the server for this app or website at this time.

It maybe that you have too many requests or the illegal request payload is identified as an attack.

Please try again later.

Home | Uniswap Protocol

| Uniswap ProtocolEcosystemCommunityGovernanceDevelopersBlogFAQJobsLaunch AppMenuUNISWAP PROTOCOLSwap, earn, and build on the leading decentralized crypto trading protocol.Launch App$489B+Trade Volume71M+All Time Trades300+Integrations4,400+Community DelegatesUNISWAP ECOSYSTEM →A growing network of DeFi Apps.Developers, traders, and liquidity providers participate together in a financial marketplace that is open and accessible to all.300+IntegrationsExplore all ↗DEVELOPERS →Superpowers for DeFi developers.Build Defi apps and tools on the largest crypto project on Ethereum. Get started with quick start guides, protocol documentation, a Javascript SDK, and fully open source code.Documentation ↗V3 WhitepaperGithubApply for funding from the Uniswap Grants ProgramGet paid to build the future of finance. Uniswap Governance offers grant funding for people building apps, tools, and activities on the Uniswap Protocol.Learn more ↗PROTOCOL GOVERNANCE ->Governed by the community.The Uniswap Protocol is managed by a global community of UNI token holders and delegates.Read more ↗Governance Forum Participate by proposing upgrades and discussing the future of the protocol with the Uniswap community.Sybil Vote on offchain proposals with the Snapshot interface. Votes are weighted by the number of UNI delegates.Governance Portal Vote on official Uniswap governance proposals and view past proposals. EcosystemCommunityGovernanceDevelopersBlogFAQPrivacy PolicyTrademark PolicySecurityMedia inquires for Uniswap Labs - Contact [email protect

UniswapV2代码中文注释 | 登链社区 | 区块链技术社区

UniswapV2代码中文注释 | 登链社区 | 区块链技术社区

文章

问答

讲堂

专栏

集市

更多

提问

发表文章

活动

文档

招聘

发现

Toggle navigation

首页 (current)

文章

问答

讲堂

专栏

活动

招聘

文档

集市

搜索

登录/注册

UniswapV2代码中文注释

Att

更新于 2023-05-25 20:30

阅读 1184

Uniswap V2是一种基于以太坊的去中心化交易协议,旨在提供快速、安全、无信任的代币交换服务。它是Uniswap协议的第二个版本,是对第一个版本的改进和升级。

更详细的注释在github:https://github.com/kpyaoqi/UniswapV2_Chinese

# UniswapV2Factory

在构造函数中传入一个设置feeTo的权限者地址,主要用于创建两种token的交易对,并为其部署一个UniswapV2Pair合约用于管理这个交易对,UniswapV2Factory还包含一些手续费的一些设置.

## 合约当中具有的方法:

- function feeTo() external view returns (address):返回收取手续费地址

- function feeToSetter() external view returns (address):设置手续费收取地址的权限地址

- function getPair(address tokenA, address tokenB) external view returns (address pair):获取两个token的交易对地址

- function allPairs(uint) external view returns (address pair):返回指定位置的交易对地址

- function allPairsLength() external view returns (uint):返回所有交易对的长度

- function createPair(address tokenA, address tokenB) external returns (address pair):创建两个token的交易对地址

- function setFeeTo(address) external:更改收取手续费地址

- function setFeeToSetter(address) external:更改设置手续费收取地址的权限地址

在 Uniswap 协议中,`feeTo` 是一个变量,用于指定手续费收取地址。当用户在 Uniswap 上进行交易时,一定比例的交易手续费会被收取,并根据协议的设定进行分配。这个手续费分配的过程包括将一部分手续费发送给流动性提供者,同时还有一部分手续费发送到 `feeTo` 地址。

#### createPair:(address tokenA, address tokenB) returns (address pair)

```solidity

bytes32 salt = keccak256(abi.encodePacked(token0, token1));

bytes memory bytecode = type(UniswapV2Pair).creationCode;

assembly {

//add(bytecode, 32):opcode操作码的add方法,将bytecode偏移后32位字节处,因为前32位字节存的是bytecode长度

//mload(bytecode):opcode操作码的方法,获得bytecode长度

pair := create2(0, add(bytecode, 32), mload(bytecode), salt)

}

```

pair地址是通过**内联汇编assembly做create2**方法创建的,其中**salt**盐值是通过两个两个代币的地址计算

> 内联汇编:在 Solidity 源程序中嵌入汇编代码,对 EVM 有更细粒度的控制

# UniswapV2Pair

在构造函数中factory地址为msg.sender,因为该合约是由UniswapV2Factory进行部署,该合约继承了UniswapV2ERC20,主要用于管理以及操作交易对,托管两种token

## 合约当中比较重要的方法有(lptoken即UniswapV2ERC20):

function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external:判断签名的有效性

function mint(address to) external returns (uint liquidity):铸造lptoken

function burn(address to) external returns (uint amount0, uint amount1):销毁lptoken退出流动性

function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external:根据tokenA的数量在交易池中进行兑换tokenB

function skim(address to) external:使两个token的余额与储备相等

function sync() external:使两个token的储备与余额相匹配

function initialize(address, address) external:设置pair地址交易对的两种token

#### permit:(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s)

```solidity

// ecrecover 函数可以返回与签名者对应的公钥地址

address recoveredAddress = ecrecover(digest, v, r, s);

// 判断签名者对应的公钥地址与授权地址是否一致

require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');

_approve(owner, spender, value);

```

用户现在签名一笔交易,用该方法可有判断该签名的有效性,如果通过判断,则进行授权

#### mint:(address to) lock returns (uint liquidity)

```solidity

// 1.获取进行添加流动性的两个token的数量

(uint112 _reserve0, uint112 _reserve1, ) = getReserves();

uint balance0 = IERC20(token0).balanceOf(address(this));

uint balance1 = IERC20(token1).balanceOf(address(this));

uint amount0 = balance0.sub(_reserve0);

uint amount1 = balance1.sub(_reserve1);

// 2.调用_mintFee方法

// 3.添加流动性所获得的lptoken数量(进行添加流动性的两种token的数量*目前lptoken的数量/当前token的储备量-->取较小值)

liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);

// 4.铸造lptoken函数和更新储备函数

_mint(to, liquidity);

_update(balance0, balance1, _reserve0, _reserve1);

```

主要是根据两个token在交易对的增量计算出应该铸造lptoken的数量,然后将lptoken铸造给to地址,具有防重入锁lock

#### burn:(address to) lock returns (uint amount0, uint amount1)

```solidity

// 1.为什么用addres(this)?-->因为获取退出lptoken数量时,是在Route合约中先将lptoken转到当前合约,然后直接获得当前合约lptoken的数量

uint liquidity = balanceOf[address(this)];

// 2.调用_mintFee方法

// 3.使用余额确保按比例分配-->(持有lptoken/总lptoken)*合约中持有token的数量

amount0 = liquidity.mul(balance0) / _totalSupply;

amount1 = liquidity.mul(balance1) / _totalSupply;

// 4.转账两种token并更新储备量

_safeTransfer(_token0, to, amount0);

_safeTransfer(_token1, to, amount1);

balance0 = IERC20(_token0).balanceOf(address(this));

balance1 = IERC20(_token1).balanceOf(address(this));

_update(balance0, balance1, _reserve0, _reserve1);

```

根据lptokne的比例计算出两种token的各自的数量,然后销毁lptoken并将转账两种token给to地址

#### swap:(uint amount0Out, uint amount1Out, address to, bytes calldata data)

```solidity

// 1.转移代币

if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out);

if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out);

// 2.用于回调合约来实现一些特定的业务逻辑或其他自定义功能(例如:闪电贷....)

if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);

// 3.确保在交易完成后,资金池的储备量满足 Uniswap V2 中的 K 恒定公式,即 K = _reserve0 * _reserve1

// 4.更新储备

```

1.在Route合约用户已经将需要兑换的tokenA转入pair合约中,在Route合约中传入需要输出的tokenB的数量和一个data,转移tokenB后判断data长度是否大于零去进行回调合约

2.直接调用swap方法进行回调合约获得套利,只要套利后满足后续条件即可

## 合约内部调用的方法:

#### _update:(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private

```solidity

// 1.更新priceCumulativeLast,永远不会溢出,+ overflow是理想的

price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;

price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;

// 2.更新储备量

reserve0 = uint112(balance0);

reserve1 = uint112(balance1);

```

更新储备方法:四个参数前两个为更新后两个token的储备量,后两个为更新前两个token的储备量

#### _mintFee:(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn)

```solidity

// 1.获取收取手续费的地址如果不是零地址并且kLast!=0则继续下面部分

// 2.获取上一次交易后和目前交易对中的K值

uint rootK = Math.sqrt(uint(_reserve0).mul(_reserve1));

uint rootKLast = Math.sqrt(_kLast);

// 3.如果rootK>rootKLast

uint numerator = totalSupply.mul(rootK.sub(rootKLast));

uint denominator = rootK.mul(5).add(rootKLast);

uint liquidity = numerator / denominator;

// 4.如果liquidity大于零为收取手续费地址铸造lptoken

if (liquidity > 0) _mint(feeTo, liquidity);

```

收取手续费方法,参数为当前两个token的储备量

# UniswapV2Router02

在构造函数中传入factory合约和WETH合约地址,WETH的作用是将以太币包装成ERC-20代币,Route合约是与pair交易对进行交互的合约,常用于添加流动性、移除流动性、兑换、获取交易对信息......

**其中amountMin用于控制滑点,若amount_min = amount_desired - (amount_desired * 0.01) 表示 1%滑点容忍度**

## 合约当中比较重要的方法有:

#### addLiquidity:(address tokenA, address tokenB,uint amountADesired,uint amountBDesired,uint amountAMin,uint amountBMin,address to,uint deadline) ensure(deadline) returns (uint amountA, uint amountB, uint liquidity)

```solidity

// 1.调用 _addLiquidity方法,返回amountA,amountB

// 2.获取两个token的pair合约地址,并转账两个token

address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);

TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);

TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);

// 3.向to地址铸造lptoken

liquidity = IUniswapV2Pair(pair).mint(to);

```

添加流动性方法:通过_addLiquidity方法传入期望添加token的数量和愿意接受的最低token数量返回实际添加到资金池中token的数量,想pair合约转账token并铸造lptoken

#### removeLiquidity:(address tokenA, address tokenB,uint liquidity,uint amountAMin,uint amountBMin,address to,uint deadline) ensure(deadline) returns (uint amountA, uint amountB)

```solidity

// 1.获取两个token的pair合约地址并将lptoken发送到pair合约

address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);

IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity);

// 2.销毁lptoken,返回销毁lptoken获得两种token的数量

(uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);

```

移除流动性方法:通过pair合约销毁lptoken移除流动性,获得的两个token需要大于愿意接受的最低token数量

#### swapExactTokensForTokens:(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline ) ensure(deadline) returns (uint[] memory amounts)

```solidity

// 根据传入的tokenA的数量和path获得amounts

amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);

// 判断最终获得的tokenB的数量是否大于amountOutMin

require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');

// 将tokenA传入第一对交易对中

TransferHelper.safeTransferFrom(path[0],msg.sender,UniswapV2Library.pairFor(factory, path[0], path[1]),amounts[0]);

// 兑换

_swap(amounts, path, to);

```

兑换:根据确切的tokenA的数量兑换tokenB

## 合约内部调用的方法:

#### _addLiquidity:(address tokenA, address tokenB,uint amountADesired,uint amountBDesired,uint amountAMin,uint amountBMin) returns (uint amountA, uint amountB uint liquidity)

```solidity

// 1.获取两个token的pair地址,若不存则创建新的交易对

// 2.获取储备量并且不等于零

// 根据两种token的储备量和期望tokenA的数额获取tokenB最佳的数额

uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);

// 3.根据期望值和愿意接受的最低token数量通过判断返回amountA,amountB

```

#### _swap:(uint[] memory amounts, address[] memory path, address _to)

```solidity

// 1.循环path路径

// 2.计算每对交易对的兑换量

// 3.如果中间还有其他的路径,to地址为其中交易对的pair地址

address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;

// 进行兑换

IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(amount0Out,amount1Out,to,new bytes(0));

```

到此结束啦 0.0

第一次写文章,感谢支持

更详细的注释在github:https://github.com/kpyaoqi/UniswapV2_Chinese

UniswapV2Factory

在构造函数中传入一个设置feeTo的权限者地址,主要用于创建两种token的交易对,并为其部署一个UniswapV2Pair合约用于管理这个交易对,UniswapV2Factory还包含一些手续费的一些设置.

合约当中具有的方法:

function feeTo() external view returns (address):返回收取手续费地址

function feeToSetter() external view returns (address):设置手续费收取地址的权限地址

function getPair(address tokenA, address tokenB) external view returns (address pair):获取两个token的交易对地址

function allPairs(uint) external view returns (address pair):返回指定位置的交易对地址

function allPairsLength() external view returns (uint):返回所有交易对的长度

function createPair(address tokenA, address tokenB) external returns (address pair):创建两个token的交易对地址

function setFeeTo(address) external:更改收取手续费地址

function setFeeToSetter(address) external:更改设置手续费收取地址的权限地址

在 Uniswap 协议中,feeTo 是一个变量,用于指定手续费收取地址。当用户在 Uniswap 上进行交易时,一定比例的交易手续费会被收取,并根据协议的设定进行分配。这个手续费分配的过程包括将一部分手续费发送给流动性提供者,同时还有一部分手续费发送到 feeTo 地址。

createPair:(address tokenA, address tokenB) returns (address pair)

bytes32 salt = keccak256(abi.encodePacked(token0, token1));

bytes memory bytecode = type(UniswapV2Pair).creationCode;

assembly {

//add(bytecode, 32):opcode操作码的add方法,将bytecode偏移后32位字节处,因为前32位字节存的是bytecode长度

//mload(bytecode):opcode操作码的方法,获得bytecode长度

pair := create2(0, add(bytecode, 32), mload(bytecode), salt)

}

pair地址是通过内联汇编assembly做create2方法创建的,其中salt盐值是通过两个两个代币的地址计算

内联汇编:在 Solidity 源程序中嵌入汇编代码,对 EVM 有更细粒度的控制

UniswapV2Pair

在构造函数中factory地址为msg.sender,因为该合约是由UniswapV2Factory进行部署,该合约继承了UniswapV2ERC20,主要用于管理以及操作交易对,托管两种token

合约当中比较重要的方法有(lptoken即UniswapV2ERC20):

function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external:判断签名的有效性

function mint(address to) external returns (uint liquidity):铸造lptoken

function burn(address to) external returns (uint amount0, uint amount1):销毁lptoken退出流动性

function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external:根据tokenA的数量在交易池中进行兑换tokenB

function skim(address to) external:使两个token的余额与储备相等

function sync() external:使两个token的储备与余额相匹配

function initialize(address, address) external:设置pair地址交易对的两种token

permit:(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s)

// ecrecover 函数可以返回与签名者对应的公钥地址

address recoveredAddress = ecrecover(digest, v, r, s);

// 判断签名者对应的公钥地址与授权地址是否一致

require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');

_approve(owner, spender, value);

用户现在签名一笔交易,用该方法可有判断该签名的有效性,如果通过判断,则进行授权

mint:(address to) lock returns (uint liquidity)

// 1.获取进行添加流动性的两个token的数量

(uint112 _reserve0, uint112 _reserve1, ) = getReserves();

uint balance0 = IERC20(token0).balanceOf(address(this));

uint balance1 = IERC20(token1).balanceOf(address(this));

uint amount0 = balance0.sub(_reserve0);

uint amount1 = balance1.sub(_reserve1);

// 2.调用_mintFee方法

// 3.添加流动性所获得的lptoken数量(进行添加流动性的两种token的数量*目前lptoken的数量/当前token的储备量-->取较小值)

liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);

// 4.铸造lptoken函数和更新储备函数

_mint(to, liquidity);

_update(balance0, balance1, _reserve0, _reserve1);

主要是根据两个token在交易对的增量计算出应该铸造lptoken的数量,然后将lptoken铸造给to地址,具有防重入锁lock

burn:(address to) lock returns (uint amount0, uint amount1)

// 1.为什么用addres(this)?-->因为获取退出lptoken数量时,是在Route合约中先将lptoken转到当前合约,然后直接获得当前合约lptoken的数量

uint liquidity = balanceOf[address(this)];

// 2.调用_mintFee方法

// 3.使用余额确保按比例分配-->(持有lptoken/总lptoken)*合约中持有token的数量

amount0 = liquidity.mul(balance0) / _totalSupply;

amount1 = liquidity.mul(balance1) / _totalSupply;

// 4.转账两种token并更新储备量

_safeTransfer(_token0, to, amount0);

_safeTransfer(_token1, to, amount1);

balance0 = IERC20(_token0).balanceOf(address(this));

balance1 = IERC20(_token1).balanceOf(address(this));

_update(balance0, balance1, _reserve0, _reserve1);

根据lptokne的比例计算出两种token的各自的数量,然后销毁lptoken并将转账两种token给to地址

swap:(uint amount0Out, uint amount1Out, address to, bytes calldata data)

// 1.转移代币

if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out);

if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out);

// 2.用于回调合约来实现一些特定的业务逻辑或其他自定义功能(例如:闪电贷....)

if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);

// 3.确保在交易完成后,资金池的储备量满足 Uniswap V2 中的 K 恒定公式,即 K = _reserve0 * _reserve1

// 4.更新储备

1.在Route合约用户已经将需要兑换的tokenA转入pair合约中,在Route合约中传入需要输出的tokenB的数量和一个data,转移tokenB后判断data长度是否大于零去进行回调合约

2.直接调用swap方法进行回调合约获得套利,只要套利后满足后续条件即可

合约内部调用的方法:

_update:(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private

// 1.更新priceCumulativeLast,永远不会溢出,+ overflow是理想的

price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;

price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;

// 2.更新储备量

reserve0 = uint112(balance0);

reserve1 = uint112(balance1);

更新储备方法:四个参数前两个为更新后两个token的储备量,后两个为更新前两个token的储备量

_mintFee:(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn)

// 1.获取收取手续费的地址如果不是零地址并且kLast!=0则继续下面部分

// 2.获取上一次交易后和目前交易对中的K值

uint rootK = Math.sqrt(uint(_reserve0).mul(_reserve1));

uint rootKLast = Math.sqrt(_kLast);

// 3.如果rootK>rootKLast

uint numerator = totalSupply.mul(rootK.sub(rootKLast));

uint denominator = rootK.mul(5).add(rootKLast);

uint liquidity = numerator / denominator;

// 4.如果liquidity大于零为收取手续费地址铸造lptoken

if (liquidity > 0) _mint(feeTo, liquidity);

收取手续费方法,参数为当前两个token的储备量

UniswapV2Router02

在构造函数中传入factory合约和WETH合约地址,WETH的作用是将以太币包装成ERC-20代币,Route合约是与pair交易对进行交互的合约,常用于添加流动性、移除流动性、兑换、获取交易对信息......

*其中amountMin用于控制滑点,若amount_min = amount_desired - (amount_desired 0.01) 表示 1%滑点容忍度**

合约当中比较重要的方法有:

addLiquidity:(address tokenA, address tokenB,uint amountADesired,uint amountBDesired,uint amountAMin,uint amountBMin,address to,uint deadline) ensure(deadline) returns (uint amountA, uint amountB, uint liquidity)

// 1.调用 _addLiquidity方法,返回amountA,amountB

// 2.获取两个token的pair合约地址,并转账两个token

address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);

TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);

TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);

// 3.向to地址铸造lptoken

liquidity = IUniswapV2Pair(pair).mint(to);

添加流动性方法:通过_addLiquidity方法传入期望添加token的数量和愿意接受的最低token数量返回实际添加到资金池中token的数量,想pair合约转账token并铸造lptoken

removeLiquidity:(address tokenA, address tokenB,uint liquidity,uint amountAMin,uint amountBMin,address to,uint deadline) ensure(deadline) returns (uint amountA, uint amountB)

// 1.获取两个token的pair合约地址并将lptoken发送到pair合约

address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);

IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity);

// 2.销毁lptoken,返回销毁lptoken获得两种token的数量

(uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);

移除流动性方法:通过pair合约销毁lptoken移除流动性,获得的两个token需要大于愿意接受的最低token数量

swapExactTokensForTokens:(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline ) ensure(deadline) returns (uint[] memory amounts)

// 根据传入的tokenA的数量和path获得amounts

amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);

// 判断最终获得的tokenB的数量是否大于amountOutMin

require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');

// 将tokenA传入第一对交易对中

TransferHelper.safeTransferFrom(path[0],msg.sender,UniswapV2Library.pairFor(factory, path[0], path[1]),amounts[0]);

// 兑换

_swap(amounts, path, to);

兑换:根据确切的tokenA的数量兑换tokenB

合约内部调用的方法:

_addLiquidity:(address tokenA, address tokenB,uint amountADesired,uint amountBDesired,uint amountAMin,uint amountBMin) returns (uint amountA, uint amountB uint liquidity)

// 1.获取两个token的pair地址,若不存则创建新的交易对

// 2.获取储备量并且不等于零

// 根据两种token的储备量和期望tokenA的数额获取tokenB最佳的数额

uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);

// 3.根据期望值和愿意接受的最低token数量通过判断返回amountA,amountB

_swap:(uint[] memory amounts, address[] memory path, address _to)

// 1.循环path路径

// 2.计算每对交易对的兑换量

// 3.如果中间还有其他的路径,to地址为其中交易对的pair地址

address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;

// 进行兑换

IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(amount0Out,amount1Out,to,new bytes(0));

到此结束啦 0.0

第一次写文章,感谢支持

更详细的注释在github:https://github.com/kpyaoqi/UniswapV2_Chinese

原创

学分: 18

分类: Uniswap

标签:

Uniswap V2 

本文已由作者铸造成 NFT

网络:

Polygon

合约地址:

0x6f772e254Ef50e9b462915b66404009c73766350

IPFS hash:

QmNN2pFGtLDa7VUpqfUwRWwKiCkYeCLo7u4ZqVTxFQwd9K

查看TA的链上存证

点赞 3

收藏 1

分享

Twitter分享

微信扫码分享

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

你可能感兴趣的文章

uniswapV2交易流程简介

425 浏览

uniswap v2

291 浏览

去中心化金融笔记(二)—— Uniswap V2 详解

1148 浏览

【Web3 探索】如何获取Uniswap V2池数据

1152 浏览

登链学习日记001-uniswapV2-01

1883 浏览

相关问题

一笔uniswap的交易有多个个swap log,这笔交易的买入卖出数量应该看哪个swap log?怎么比较出来?

1 回答

Uniswap V2 removeLiquidity移除流动性的时候报错,已授权的情况下,但是不知道是否是授权错误,具体情况如下图,麻烦大佬看下具体什么原因

2 回答

Uniswap V2合约代码开发时Factory合约中的getPair函数和Router02合约中的算法定位出来的Pair池子地址不一致,导致无法获取储备量

1 回答

uniswap怎么计算买税和卖税

3 回答

在java代码中调用uniswap的addLiquidityETH是在哪里设置的ETH数量呢?

1 回答

熊哥你好,调用uniswap路由合约addLiquidityETH方法

1 回答

0 条评论

请先 登录 后评论

Att

0x0B5B...fb31

关注

贡献值: 65

学分: 46

努力坚持就会有希望.

文章目录

关于

关于我们

社区公约

学分规则

Github

伙伴们

ChainTool

为区块链开发者准备的开源工具箱

合作

广告投放

发布课程

联系我们

友情链接

关注社区

Discord

Twitter

Youtube

B 站

公众号

关注不错过动态

微信群

加入技术圈子

©2024 登链社区 版权所有 |

Powered By Tipask3.5|

粤公网安备 44049102496617号

粤ICP备17140514号

粤B2-20230927

增值电信业务经营许可证

×

发送私信

请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!

发给:

内容:

取消

发送

×

举报此文章

垃圾广告信息:

广告、推广、测试等内容

违规内容:

色情、暴力、血腥、敏感信息等内容

不友善内容:

人身攻击、挑衅辱骂、恶意行为

其他原因:

请补充说明

举报原因:

取消

举报

×

如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!