Uniswap 是以太坊 DeFi 生态的头部去中心化交易所(DEX),本月初FxAjax曾报道 Uniswap 新版升级,可交易 Uniswap.exchange 默认列表中未显示的代币。本文教你如何在 Uniswap 交易甚至上架 ERC20 代币。
作者:开放金融基金会(DeFi.org),专注于去中心化金融生态的非营利组织
几句话介绍 uniswapuniswap 是基于一个叫做 数量乘积为常数 的点子设计出来的交易所你可以通过 uniswap 进行交易(也就是,用一种加密货币,换另一种加密货币,只能是 ETH 和 ERC20 Token )你还可以通过 uniswap 的 send 功能,进行跨币种转账你还可以通过 pool 入股 uniswap,从交易中的手续费中分一杯羹最酷的是,你还可以把你的 ERC20 上架到 uniswap我们将演示用 Dai 购买 ETH使用 ETH 向他人转账 Dai入股 uniswap (pool,或者叫做提供流动性)发行一款 ERC20 Token上架一种我们自己的 ERC20 Token在 uniswap 上用 Dai 购买 ETH我们先来在 uniswap 上用 Dai 买一点 ETH 吧。我们打开 uniswap.exchange,你会看到这样的界面:

当然,你也有可能看到是白色的配色,你可以点击右下角的按钮,修改配色:

首次进入的时候(如果你的 MetaMask 开启了隐私模式),你可能需要点击右上角的 Connect 按钮连接到你的钱包,点击之后,MetaMask 会跳出来让你确认连接到钱包。如果右上角显示的是你的钱包地址,那么说明已经连接,就可以跳过这一步。 连接成功后,右上角的 Connect 按钮会变成你的钱包地址:

然后,这里我们注意到 uniswap 提供了 3 大类不同的业务:

Swap: 交换加密货币,其实就是 交易 了,我们想要用 Dai 来换一点 ETH 就属于这种业务Send: 跨币种转账业务,比如说你的钱包里面只有 ETH,但是你想转 Dai 到另一个账户,你可以首先通过 ETH 换来 Dai,然后再转账; 或者,你可以使用 Uniswap Send,将这这里说到的两件(对应两笔交易)合并成一件事情来做(一笔交易)Pool: 提供流动性,获取交易手续费分红。当我们用 ETH 换取 Dai 的时候,你有没有想过, Uniswap 里面的 Dai 是哪里来的呢? 其实是用户通过这个 Pool 操作存进来的。但是,这和 Compound 那种借贷平台不同,用户并不是只是存 Dai 进来, Pool 操作是同时按照当时的价格,同时存入等价值的 Dai 和 ETH 。然后,你就可以开始从交易手续费里面分红了。最后,我们需说明一下,虽然我们一直在说 Dai 和 ETH,在 uniswap 上,只要是 ERC20 Token 都可以交易;我们最后还将演示,把我们随便创造的一种 ERC20 上架到 uniswap 上。
好吧,我们先来用 ETH 换点 Dai 吧。 首先我们注意到,uniswap 的 swap 页面默认的就是用 ETH 来换其他 ERC20 Token(Dai 也是一种 ERC20 token ),如果你是想用 ERC20 Token 来换 ETH,那么你可以点击中间这个箭头,就行了,当然,我们这里并不需要,这里只是给你提一下这件事情:

我们点击 Select a token:

在弹出的对话框中选择 Dai:

然后,我们可以填写我们想要花多少 ETH 去买 Dai,会自动计算出我们能买到多少 Dai; 也可以填写我们想要买多少 Dai,会自动计算出我们需要花多少 ETH。我这里填写我想要购买 5 Dai,自动算出了我需要花掉 0.03 ETH:

如果你很好奇这笔交易的细节,你还可以点击下面的 Advanced Details,了解这笔交易的细节:

比如,我们在细节里面看到,我们买这 5 个 Dai,最多会花 0.0303 ETH:

那么你可能会很好奇,如果这个时候市场波动很大,ETH 跌了,也就是说,我们用 0.0303 ETH 都买不到 5 Dai 的时候,会发生什么呢? 答案是,我们的这笔交易会失败,避免很大的滑点带来损失,我们只会损失一些 Gas 费用。
当然,你应该也注意到了,下面是可以让你选择滑点的,你可以允许更大的滑点,让你的交易成功的概率变大(如果你真的要这么做,确保你自己完全明白这意味着什么,避免带来损失):

好吧,让我们来执行这笔交易,点击最下面的 Swap 按钮:

MetaMask 会弹出让我们确认交易,我们点击 Confirm 确认交易:

我们点击右上角我们的地址:

会弹出一个对话框,在对话框中,我们能够看到刚刚的我们确认的这笔交易:

我们点击这个链接,会跳转到 etherscan 查看具体的交易细节:

0.030345639115341726 ETH 到 uniswap 的合约我们收到了 5 Daiuniwap 最后退还了 0.000287422181744212 ETH 给我们在 uniswap 上用 ETH 来捐 Dai在继续接下来的教学之前,我们先来聊聊公益。UNICEF France ,也就是 联合国儿童基金会法国分部 之前开通了 Dai 捐款 的通道:

我们接下来,就来给 联合国儿童基金会法国分部 捐 1 Dai。
先来看下我的这个钱包里面有多少 Dai:

注意到我的钱包里面有 0.2021 ETH 和 5.997 Dai。虽然我要给 联合国儿童基金会法国分部 捐 1 Dai,但我要通过 uniswap 的 send 功能去捐赠,我不会动用我钱包里面的 Dai。
我们回到 uniswap 的页面,点击 Swap 旁边的 Send,会看到下面的界面:

我们同样点击 select token ,选择 Dai:

在 Dai 的数额处,输入 1,然后会自动计算出需要支付 0.006 ETH:

然后,我们在 Recipient Address 处,填入收款人的地址,这里当然就是 联合国儿童基金会法国分部 的地址啦:

然后,同样的,我们点击 Send, 在 MetaMask 中确认这笔交易:

等待交易在网络上被确认之后,我们点击交易的链接,去 etherscan 上详细看下这笔交易:

我们可以看到交易的一些细节:

0.00607384501450303 ETH 到 uniswap0x0e3293BFcc55365CF0C67B2e1808be33D2905e3C(也就是 联合国儿童基金会法国分部 的地址 ) 收到了 1 Daiuniswap 退回了我们 0.000060137079351515 ETH这个时候,我们再回过来看看我的钱包:

Dai 的数量没有减少哦当然, ETH 的数量减少了「入股」 uniswap这里说的 入股 就是 pool 功能。我们通过提供流动性,来获取交易手续费的提成。
在说 pool 功能之前,我们先来回顾下上面的 swap 功能。上面我们说到 uniswap 的 swap 功能的时候,我们是用 ETH 换了 Dai。 其实在 uniswap 上我们可以用任意一种商家的 ERC20 来换另一种 ERC20。我们可以在 swap 页面上,我们点击 ETH 处:

在弹出的对话框里面,我们可以选择其他 ERC20 token,这样我们就可以实现 token 和 token 的交易的。
但是需要注意的是,因为 uniswap 是以 ETH 为核心设计的。虽然我们可以在一笔交易中完成 token 到 token 的交易,但在 uniswap 内部,实际上是经历了 token 到 ETH, ETH 再到 token 两个过程。
好吧,我们为什么要提到这一点呢? 因为当我们打开 pool 对应的页面的时候,你会发现这里上面的 ETH 是点不动的:

也就是说,我们在 pool 的时候,不能 pool 放入两种 token,而是一定要放入 ETH 和 另一种 token。
我打算 pool 5 个 Dai 和 价值 5 Dai 的 ETH。首先,我们点击 pool 页面,我们选择想要 pool 的 token,点击这里的 Select a token 按钮:

在弹出的页面里面,我们选择 Dai:

然后我们输入 5Dai,会自动计算出需要多少 ETH (你可能会注意到,这个时候的 ETH 比上面的价格贵,因为这个部分和上面的部分不是同一天写的,ETH 又涨起来了) :

注意,这里有一个 Advanced Details,能够看到更多的细节,点击之后,我们看到:

这里的 liquidity token 就是用来表示你的 股份 的。
下一步,就是点击最下方的 Add Liquidity 按钮了,但你可能发现它是灰色的,无法点击:

原来,我们漏掉了 approve Dai( 如果你很好奇 approve 是什么,参考 ERC20 APPROVE),我们点击 Dai 旁边的 Unlock 按钮, 在弹出的 MetaMask 窗口里面,确认这笔 Approve 交易 :

等交易在网络上被确认之后,Add Liquidity 按钮就可以点击了:

我们点击这个按钮,在 MetaMask 里面确认 Add Liquidity 这笔交易:

等待交易确认之后,我们回到 pool 页面,这个时候,我们点击 Add Liquidity:

在弹出的菜单中,我们切换到 Remove Liquidity 功能页面:

在 select a token 这里,我们选择 Dai:

注意到,这里显示了一个 balance,但这并不是 ETH 或者 Dai 的余额,而是我拥有的 股份,我们点击这个 balance,你会看到我们这点 股份 的价值:

如果我们这个时候点击 Remove Liquidity,我们的 股份 将会被销毁,同时我们可以拿回 0.028ETH + 4.9987Dai。
因为我们要演示怎样在 uniswap 上架我们自己的 ERC20 Token,所以,首先呢,我们来随便发行一种 ERC20 Token,我们这里使用 ERC20-Generator 这个在线工具,这样的话,我们只需要 MetaMask 钱包,就能完成 ERC20 Token 的发行。
打开网页之后,我们会看到下面的界面,我们需要填写一些基本信息:

TokenName 是这个 ERC20 Token 的名字Token Symbol 是这个 ERC20 的符号Token Decimal 是小数点的个数。通过这个参数,可以确定我们这个 Token 的最小单位。你可能经常看到 18, 这是因为 ETH 的 最小单位 wei 和 常用单位 Ether(当我们说 我们有一个以太的时候,我们实际上说的是我们拥有 1Ether 个以太 ) 之间的关系是: 1000000000000000000 wei = 1ETHToken Cap 是总的发行量,我们这里写的是 1000000,注意这里的单位是 EtherToken Initial Balance: 这个是我的账户里面的 Token 的数量,好吧,所以全都在我的钱包里面了填写好了这些参数之后,我们点击 Create Token,MetaMask 会弹出窗口,让我们确认这笔 部署智能合约(我们发行一个 ERC20 Token,其实就是部署了一个智能合约) 的交易:

这里要提醒的是,如果网络比较拥挤,而你的 gas price 设置得很低(比如如上图),那么,这笔交易将会很久才能确认,所以你可能需要 加速你的交易,或者在一开始就设置合适的 Gas Price
接着,我们需要耐心地等待交易确认,在这个过程中,我们可以点击 Transaction id 的链接,跳转到 etherscan 上看一下:

当交易确认之后,在 etherscan 上面,(比如我们这笔交易的 etherscan 地址 )我们就可以看到我们的 ERC20 Token 的合约地址了:

可以看到,我们的 ERC20 Token 对应的智能合约地址为 0x1Ba4dd5306528A92906193b070980cCB2322A2E4,按照之前我们说的,我的钱包里面应该有了一些这个 Token 了,我们在浏览器上点击 MetaMask 图标,在弹出的窗口中,我们点击右上角,然后点击 Expand View:

然后,我们就会看到打一点的 MetaMask 窗口,在下方我们看到一个叫做 Add Token 的文字,点击它:

在弹出的界面里面,我们选择 Custom token,并在下面的 Address 处填入我们的 Token Address,也就是上面的 0x1Ba4dd5306528A92906193b070980cCB2322A2E4:

点击 Next 之后,我们会看到下面的页面:

我们再点击 Add Tokens,然后你就会在左边看到我们多了一种 Token,也就是我们的 DEFI Token,我很富有地拥有 1000000 个。

现在让我们回到 uniswap 里面,我们选择 pool 功能,在 Add Liquidiy 这里,我们点击一下:

在弹出的菜单里面,你会看到 Create Exchange,这个功能就是上架我们的 ERC20 Token 了:

我们填入我们的合约地址:

然后点击 Create Exchange 按钮,在弹出的 MetaMask 窗口中确认交易:

这里要提醒的是,如果网络比较拥挤,而你的 gas price 设置得很低(比如如上图),那么,这笔交易将会很久才能确认,所以你可能需要 加速你的交易,或者在一开始就设置合适的 Gas Price
我们等待交易确认,交易确认之后,好像什么都没有发生一样:

但是,我们现在回到 Add Liquidity(可能需要等待一小会),点击这里的 Select Token:

我们输入我们的合约地址,然后选择 DEFI-ORG-TUTORIAL ,也就是我们创建的这种 Token 的名字:

接着,你会看到一句提示,哈哈哈,我们现在要通过 pool 来定价了:

那么我们来定价吧, 10 个 Token 卖 0.01 Ether 吧:

接下来的操作就和上面的 pool 相同:
unlock DEFI token然后点击 Add Liquidity做完这些之后,我们回到 swap,你会发现我们的 Token 就可以购买了:








