ERC20接入Uniswap教程【DeFi】

Stella981
• 阅读 1671

Uniswap是基于以太坊的去中心化数字加密货币交易协议,它为代币持有者提供了简洁的接口来将一种ERC20代币兑换为另一种,并且交易所需的gas成本很低。区块链开发者可以自己的ERC20代币接入Uniswap以增强其流动性。在这个教程中,我们将学习如何将一个ERC20代币接入Uniswap协议,并且在教程的最后提供完整的实现源代码。

用自己熟悉的语言学习 以太坊DApp开发Java |Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart

1、Uniswap架构概述

首先我们需要先了解下Uniswap协议的架构,它主要包含两种类型的组件 —— 工厂合约和代币交换合约:

ERC20接入Uniswap教程【DeFi】

工厂合约/Factory Contract 用于管理代币交换合约,它负责创建新的代币交换合约并维护一个从代币地址到代币交换合约实例的映射表每一种ERC20代币都有自己的 代币交换合约/Exchange Contract,该合约负责完成两种代币的交换。

从开发者角度来看,将一个ERC20代币接入Uniswap协议的流程如下:

  1. 将ERC20代币协议部署到以太坊网络
  2. 利用Uniswap的工厂合约为前面部署的ERC20代币创建一个交换合约
  3. 使用交换合约实现自己的ERC20代币与其他代币的交换

每个代币交换合约智能用来将对应的ERC20代币与以太币交换。为了完成两种不同的ERC20代币的的交换,Uniswap使用以太币作为中间的桥梁,例如,先把Token A换成以太币,再将以太币换成Token B。

ERC20接入Uniswap教程【DeFi】

值得指出的是,Uniswap协议目前仅支持以太坊,并且只能在同一个以太坊网络上实现ERC20代币的交换。

出于演示目的,在这个教程中我们使用Rinkeby测试网来学习接入流程,在主网上该流程同样适用。教程中的演示代码使用如下的软件栈完成:Truffle v5.0.3Node.js v8.11.1Web3.js-1.0

2、ERC20代币合约开发与部署

首先让我们编写一个简单的ERC20代币合约用于测试:

ERC20接入Uniswap教程【DeFi】

保存后使用truffle compile命令编译上述合约:

$ truffle compile

然后修改truffle-config.js以便连接Rinkeby网络:

rinkeby: {
     provider: function() {
     return new HDWalletProvider(process.env.NMEMORIC, "https://rinkeby.infura.io/")
     },
     network_id: '4',
     websockets: true,
     gas: 6000000,
     gasPrice: 10000000000
 },

最后使用truffle deploy命令将合约部署到Rinkeby测试网:

$ truffle deploy --network rinkeby 
...
2_token.js
=================   Replacing 'Token'
   ----------------------
   > transaction hash:    0xd17a0dc69f54f78aa9a158682dc5bd24c281de959e3a7545ecb7d3c60cdadeab
   > Blocks: 0            Seconds: 12
   > contract address:    0xCC4d8eCFa6a5c1a84853EC5c0c08Cc54Cb177a6A
   > account:             0x0E364EB0Ad6EB5a4fC30FC3D2C2aE8EBe75F245c
   > balance:             2.57090605
   > gas used:            1214459
   > gas price:           10 gwei
   > value sent:          0 ETH
   > total cost:          0.01214459 ETH   > Saving artifacts
   -------------------------------------
   > Total cost:          0.01214459 ETH

可以看到我们的ERC20代币部署到了Rinkeby测试网的以下地址,当然你的结果应该和这个不一样:

0xCC4d8eCFa6a5c1a84853EC5c0c08Cc54Cb177a6A

3、在Uniswap中创建代币交换合约

Uniswap的工厂合约已经由官方部署到Rinkeby测试网的如下地址:

0xf5d915570bc477f9b8d6c0e980aa81757a3aac36

工厂合约/Factory Contract 的ABI和源代码可以在Etherscan上查看:

ERC20接入Uniswap教程【DeFi】

为了创建我们的ERC20代币对应的Uniswap代币交换合约,需要调用Uniswap部署的工厂合约的createExchange()方法。例如,在下面的代码中我们使用Infura来发送一个对该方法调用的签名交易:

ERC20接入Uniswap教程【DeFi】

用node.js运行上述代码即可:

$ node 1.create.exchange.js

运行结果类似如下内容:

ERC20接入Uniswap教程【DeFi】

注意,如果运行时提示错误如下错误信息:

Node error:{"code":-32601, "message": "The method eth_sendTransaction does not exist/is not available"},

表示Infura不支持eth_sendTransaction方法,也就是说你只能向Infura提交签名交易,而无法要求Infura帮你签名。

现在我们的ERC20代币的交换合约已经在Uniswap内部创建完成了。现在我们可以使用如下命令来查询这个合约的部署地址:

script/2.get.exchange.address.js

输出结果如下:

ERC20接入Uniswap教程【DeFi】

同样使用node.js运行:

$ node script/2.get.exchange.address.js
the exchange address for ERC20 token is: 0x416F1Ac032D1eEE743b18296aB958743B1E61E81

这表明我们已经为自己的ERC20代币合约成功创建了Uniswap交换协议。

4、为Uniswap代币交换协议添加流动性

现在我们可以访问代币交换协议了。下面是我们要用到的重要的合约地址:

  • 我们的ERC20代币合约地址: 0xCC4d8eCFa6a5c1a84853EC5c0c08Cc54Cb177a6A
  • Uniswap交换合约地址:0x416F1Ac032D1eEE743b18296aB958743B1E61E81

Uniswap代币交换合约需要预存一些代币以便提供初始的流动性。为此,我们首先需要授权代币交换合约可以操作我们钱包中的ERC20代币,然后再调用代币交换合约的addLiquidity()方法同时存入ERC20代币和以太币:

  1. token.approve(exchange_address, TOKEN_RESERVE)
  2. exchange.addLiquidity(0, TOKEN_RESERVE, DEADLINE, transact={'value': ETH_RESERVE})

首先,我们运行命令$node cript/3.approve.exchange.js来授权代币交换合约存取 我们的钱包地址上的ERC20代币:

ERC20接入Uniswap教程【DeFi】

接下来,我们运行命令 $node script/4.add.liquidity.js向代币交换合约存入15个ERC20代币和0.1个以太币以便提供初始的流动性:

ERC20接入Uniswap教程【DeFi】 可以用etherscan来检查验证合约的账户余额:

ERC20接入Uniswap教程【DeFi】

5、用Uniswap实现去中心化交易

现在我们可以用Uniswap来实现以太币/ERC20代币或者两种ERC20代币之间的交换了。

在第一个测试中,我们将以太币发送给Uniswap代币交换合约,这会自动转换为ERC20代币,你可以执行命令$node script/5.eth2erc20.swap.js进行测试,代码如下: ERC20接入Uniswap教程【DeFi】

在Etherscan上可以看到已经存入Uniswap代币交换合约0.05个以太币,并且转化为5个ERC20代币发送回买家的钱包:

ERC20接入Uniswap教程【DeFi】

在第二个测试中,我们尝试交换两种不同的ERC20代币,例如将LINK代币转化为我们部署的ERC20代币:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rEbU0yMO-1593388918029)(uniswap-developer-guide/erc20-swap-code.jpeg)]

在上面的代码中,我们存入10个LINK代币并得到0.0015个自己部署的代币:

ERC20接入Uniswap教程【DeFi】

6、结论

在这个教程中,我们学习了如何创建一个ERC20代币并将其接入Uniswap去中心化交换协议以便增减这个代币的流动性。你可以在这里下载完整的实验代码:https://github.com/oceanprotocol/Nautilus/tree/master/3-uniswap


原文链接:Uniswap接入开发指南 — 汇智网

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Defi数据引擎The Graph调用方法【含源码】
当你尝试访问以太坊智能合约以及DApp产生的区块链数据时,可能会发现很难将数据转换为一种可读的格式。TheGraph提供了一种用于查询以太坊和IPFS网络数据的索引协议,任何人都可以基于其提供的开放API创建并发布索引数据,即subgraph,这使得区块链数据更容易访问。在这个教程中,我们将学习如何使用TheGraph来查询Aave协议数据,使用的技术
Wesley13 Wesley13
3年前
Uniswap协议对接PHP开发包【Uniswap.php】
Uniswap.php开发包适用于为PHP应用快速增加对Uniswap协议的支持能力。即支持使用自有部署以太坊区块链节点的应用场景,也支持使用第三方节点的轻量级部署场景。官方下载地址:Uniswap.php对接开发包(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fsc.hubw
Stella981 Stella981
3年前
EIP712实现无Gas以太坊交易【含源码】
每个人都在讨论无gas以太坊交易,因为没有人喜欢支付gas费用。但是以太坊网络能够精准地运转恰恰是因为交易需要手续费。那么如何实现无gas交易呢?让我们一起学习无gas以太坊交易的魔法!在这篇文章中,我们将学习如何实现无gas交易模式。你会发现虽然在以太坊上没有免费的午餐,但可以用有趣的方式来转移gas成本。利用本文中学到的知识,你的DApp用户就可以省
Wesley13 Wesley13
3年前
ERC20 代币 API 调用
说在前面:请先阅读此文章:ERC20代币API调用前期准备(一)(https://my.oschina.net/u/3050295/blog/2050343)一、查看合约对象可调用的api接口在JS交互窗口中输入:cfcContract得到以下输出: 
Stella981 Stella981
3年前
Fabtoken
HyperledgerFabric2.0(alpha)中有一个新特性:Fabtoken,可以原生支持数字加密货币的发行与管理。我们都知道以太坊的ERC20标准可以用来在以太坊区块链上创建数字加密代币,现在有了Fabtoken,开发者使用HyperledgerFabric也可以轻松实现数字加密货币的发行、转账等功能了!HyperledgerF
Stella981 Stella981
3年前
DeFi研究资源大全,超过100个!
本文为DeFiPulse提供的去中心化金融DeFi协议及应用大全的中文翻译版,内容涵盖借贷产品、DeFi交易、去中心化支付、DeFi钱包、用户接口、DeFi基础设施、数据分析等11个分类,是区块链开发人员及金融从业者研究去中心化金融的必备资源。用自己熟悉的语言学习以太坊DApp开发:Java(https://www.oschina.
Wesley13 Wesley13
3年前
N合一代币合约ERC1151开发教程
ERC1155是ERC20和ERC721的升级规范,它允许在一个交易中发送多种不同的代币,就像同时转账人民币和美元。ERC1155以在区块链游戏中的广泛使用而闻名,但它其实也适合有很多其他的应用场景。在这个教程中我们将学习ERC1155规范约定的主要接口,并利用openzepplin实现一个用于航空业的ERC1155多重代币。!在这里插入图
Stella981 Stella981
3年前
DeFi Compound开发REST API
在这个教程中,我们将学习如何为DeFi协议Compound的智能合约创建一个可以通过HTTP访问的API开发接口,并学习如何使用Infura作为以太坊网络和应用之间的桥梁。Compound是一个基于以太坊的数字资产借贷利率协议。Infura(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%