# 用 Python 监控 Uniswap 加密货币价格

By [quantbang](https://paragraph.com/@quantbang) · 2022-03-24

---

![](https://storage.googleapis.com/papyrus_images/649c1c629f9088f720812ee249dfc5adc3ac72c54e7506b81ed48c593359e658.jpg)

Uniswap是一个基于以太坊的交易所协议，允许任何人交换ERC20代币。普遍上讲，交易代币要求买卖双方创造委托订单，而Uniswap则是自动创建一个交易市场。Uniswap旨在帮助解决去中心化交易所的流动性问题，是一种去中心化的交易所。

在过去的几个月里，我在 Uniswap 上新上市的币上观察到了一个非常有趣的规律，尤其是那些被炒作的币种。在新币上市后的前 10-15 分钟内，价格上涨非常高，不过在接下来的几个小时内大幅下跌，然后在接下来的 24 小时内上涨超过 50%。不要以为你可以在价格低的时候买进，然后10分钟后高价卖出。因为以太坊网络拥堵的原因，这段时间的gas费用非常高（数百美元）。

![](https://storage.googleapis.com/papyrus_images/03d6e5897af3a749f92082e8e492344a0ea43edf09cb7fffd412e8fbbec97ff6.png)

Superfarm 是之前比较受欢迎的一个新项目，在 Telegram 上拥有超过 86,000 名成员，在 Twitter 上拥有超过 88,000 名关注者。所以我决定来测试一下这个规律，或者说我决定进行推测。在最初的几分钟里，价格飙升至 2 美元左右，然后跌至 1 美元左右，因此我决定投资 0.98 eth（按当前价格计算约 1.5K 美元）。

第二天，如果价格要上涨，我必须观察价格才能退出我在 Superfarm 代币上的头寸。每分钟检查价格真的是在浪费时间，所以我决定制作一个脚本来监控价格，如果价格达到某个目标，它会通知我。

为了查看 Uniswap 的价格，我使用了 uniswap-python 库。

    !pip install uniswap-python
    

如果你想知道我为什么使用它，pip 前面的感叹号是因为我已经在 Jupyter Notebook 中进行了编码，并且我已经从 Notebook 单元安装了所有必要的 python 库。

    eth = "0x0000000000000000000000000000000000000000"
    dai = "0x6B175474E89094C44Da98b954EedeAC495271d0F"
    sup = "0xe53EC727dbDEB9E2d5456c3be40cFF031AB40A55"
    
    address = "0x0000000000000000000000000000000000000000"  #  if you're not making transactions
    private_key = None  # if you're not going to make transactions
    
    provider = <the url of your provider> # if you use Infura 
     will be 
     like 'https://mainnet.infura.io/v3/########'
    uniswap_wrapper = Uniswap(address, private_key, version=2, provider=provider)  # use Uniswap v2
    

第一个变量包含我们想要在 Uniswap 上获得加密货币的以太坊地址校验和。

要获取加密货币的以太坊地址校验和，您可以使用 Coingecko 首先获取合约地址：

![](https://storage.googleapis.com/papyrus_images/b0d231f5ae6fac5dfed76853b624c51691e7e4f0bb02f8bd8498102af1363ec4.png)

然后你就可以使用下面网站轻松从合约地址中获取以太坊地址校验和。

`https://ethsum.netlify.app/`

如果您不太熟悉什么是以太坊地址校验和，您可以将其视为一个标识符，基于这个加密货币标识符 Uniswap 将能够为您提供价格。

`provider`（`web3 provider`）是一个运行 geth 或 parity 节点的网站，它与以太坊网络交互。要获得`provider`，您可以使用 Infura。如果您使用 Infura，必须注册然后创建一个新项目，在设置选项卡上您可以看到提供商 URL：

![](https://storage.googleapis.com/papyrus_images/3cb2066d80751c0016dc194a2c8de473da9151d00109195a24eee13516cf17b5.png)

要获得以 eth 表示的 Superfarm 币价格：

    sup_price = uniswap_wrapper.get_token_eth_input_price(sup, 10 ** 18)
    
    print(sup_price / 10**18)
    # 0.000901625376604887
    

`10 ** 18`代表Superfarm 币的数量，它必须是一个整数值，如果我们选择小数量值将是0（由于近似），所以我们需要一个大数量。我们将获得 `10 ** 18`个 Superfarm 币的 eth 价格。

如果我们想以美元计算 1 个 Superfarm 币的价格，我们可以使用 Dai 稳定币（1 Dai ~= 1 美元）。我们可以请求相同数量的 Superfarm 和 Dai 币，然后分割它们。

    def get_sup_price_in_dollars():
        sup_price = uniswap_wrapper.get_token_eth_input_price(sup, 10 ** 18)
        dai_price = uniswap_wrapper.get_token_eth_input_price(dai, 10 ** 18)
        return round(sup_price / dai_price, 4)
    
    print(get_sup_price_in_dollars())
    # 1.357 --> the price in dollars for 1 Superfarm coin
    

为了在我的桌面上推送通知，我使用了`plyer`库：

    !pip install plyer
    

这是监控 Superfarm 价格和自前一个值以来的变化的函数：

    from plyer import notification
    
    def notify(price: int, new_price: int):
        notification.notify(
        title = 'Superfarm price whatcher',
        message = f"Total value of SUPER = {new_price}, change: {round(new_price - price, 3)}",
        timeout = 10,
        app_icon = '/home/kederrac/Pictures/uniswap.ICO',
        )
    

如您所见，我还添加了一个应用程序图标，为了能够使用应用程序图标，我还必须将 .png 图片转换为 .ico 格式，安装 dbus-python 库（如果您使用的是 Windows，则不需要）。

    !pip install  dbus-python
    

现在让我们把它们放在一起：

    import time
    
    price = get_sup_price_in_dollars()
    notify(price, price)
    
    while True:
        new_price = get_sup_price_in_dollars()
        
        if abs(price - new_price) > 0.05:
            notify(price, new_price)
            
        price = new_price
        time.sleep(10)
    

在这里，我每 10 秒调用一次 `get_sup_price_in_dollars()` 函数来检查价格是否发生变化，如果变化大于 0.05 美元，将推送通知，您可以更改变化的最小值以获得通知，或者您 可以设置要通知的最低价格目标。

结果如下：

![](https://storage.googleapis.com/papyrus_images/6075df56e7c44dc647c220444665640529430f0b158bf239639f1e692488cd89.png)

（在 ubuntu 20.04 上）

![](https://storage.googleapis.com/papyrus_images/28304b60c2a8f49d299bbc82318ffbd80902ecbe38e97498962490aef8608a3c.png)

（在 windows 10 上）

这对于实时价格通知非常有帮助，这种方法的另一优点是速度，与必须使用 Coingecko 相比，您将获得数分钟的时间，如果您使用 Uniswap 网络界面，时间将更快。

在这里你可以看到我一开始所说的规律：

![](https://storage.googleapis.com/papyrus_images/50a6f721adf53b874f7414bee5706ead31425bd583b27c4bfcddbbb9f76d9c1b.png)

---

*Originally published on [quantbang](https://paragraph.com/@quantbang/python-uniswap)*
