【Tron】使用Python玩转SunSwap

这篇具有很好参考价值的文章主要介绍了【Tron】使用Python玩转SunSwap。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在上一篇文章中,我们学习了如何使用Python调用PancakeSwap智能合约,实现代币价格监视,代币自动兑换,在本文中,我们来学习如何在Tron的SunSwap上实现一样的需求。

在BSC上,我们使用的SDK是【web3.py】

而在Tron上,我们使用的SDK是【tronpy】

总所周知,Tron其实抄袭的是以太坊,Tron上的SunSwap其实和PancakeSwap一样,都是从Uniswap克隆来的,所以他们的调用方法,函数、参数,都是一模一样的,在学会了Python调用PancakeSwap后,也能很快上手Python调用SunSwap

快捷方式

废话不多说,由于上一篇文章中已经讲解了学习过程,本文不再赘述,直接上干货。

完整的示例代码:

【python_sunswap】https://github.com/encoderlee/python_sunswap

一些参考资料:

Tron开发者文档: https://developers.tron.network/docs

Tron APIKEY: https://developers.tron.network/reference/select-network

tronpy文档: https://tronpy.readthedocs.io/en/latest/index.html

示例代码简析

import time
from decimal import Decimal
from typing import List
from datetime import datetime, timedelta
import os
from dataclasses import dataclass
from tronpy import Tron
from tronpy.keys import PrivateKey
from tronpy.providers import HTTPProvider

@dataclass
class Contract:
    symbol: str
    address: str
    decimals: int = None

class Known:
    usdt = Contract("USDT", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", 6)
    sun = Contract("SUN", "TSSMHYeV2uE9qYH95DqyoCuNCzEL1NvU3S", 18)
    sunswap = Contract("SunswapV2Router02", "TKzxdSv2FZKQrEqkKVgp5DcwEXBEKMg2Ax")

class SunSwap:
    def __init__(self, address_wallet: str, private_key: str = None):
        self.wallet: str = address_wallet
        provider = HTTPProvider(timeout=30, api_key="b0ed0858-e287-45be-beec-57c6cb509c46")
        provider.sess.trust_env = False
        self.tron = Tron(provider)
        self.private_key = PrivateKey(bytes.fromhex(private_key))

    # get ERC20 token balance of the account
    def erc20_balance(self, erc20: Contract) -> Decimal:
        contract = self.tron.get_contract(erc20.address)
        # get the token decimals if not
        decimals = erc20.decimals
        if not decimals:
            decimals = contract.functions.decimals()
        #  get the balance of tokens and convert it
        balance = contract.functions.balanceOf(self.wallet)
        balance = Decimal(balance) / (10 ** decimals)
        return balance

    # approve the pancakeswap contract to use erc20 tokens
    def approve_erc20_to_sunswap(self, erc20: Contract):
        contract = self.tron.get_contract(erc20.address)
        approve_amount = 2 ** 256 - 1
        amount = contract.functions.allowance(self.wallet, Known.sunswap.address)
        if amount >= approve_amount / 2:
            print("already approved")
            return None
        txn = (
            contract.functions.approve(Known.sunswap.address, approve_amount)
            .with_owner(self.wallet)
            .fee_limit(100 * 1000000)
            .build()
            .sign(self.private_key)
        )
        result = txn.broadcast().wait()
        if result["receipt"]["result"] == "SUCCESS":
            print("transaction ok: {0}".format(result))
        else:
            print("transaction error: {0}".format(result))
        return result

    # query the price of token pair
    def query_price(self, token_path: List[Contract]) -> Decimal:
        contract = self.tron.get_contract(Known.sunswap.address)
        path = [item.address for item in token_path]
        amount = contract.functions.getAmountsOut(1 * 10 ** token_path[0].decimals, path)
        amount_in = Decimal(amount[0]) / (10 ** token_path[0].decimals)
        amount_out = Decimal(amount[1]) / (10 ** token_path[-1].decimals)
        return amount_in / amount_out

    # swap token
    def swap_token(self, amount_in: Decimal, token_path: List[Contract]):
        # approve token to pancakeswap if not
        self.approve_erc20_to_sunswap(token_path[0])

        contract = self.tron.get_contract(Known.sunswap.address)
        path = [item.address for item in token_path]

        amount_in = int(amount_in * 10 ** token_path[0].decimals)
        amount = contract.functions.getAmountsOut(amount_in, path)
        # slippage 0.5% fee 0.3% ,minimum received 99.2 %
        minimum_out = int(amount[1] * (1 - Decimal("0.005") - Decimal("0.003")))
        deadline = datetime.now() + timedelta(minutes=5)
        txn = (contract.functions.swapExactTokensForTokens(amount_in, minimum_out, path, self.wallet,
                                                           int(deadline.timestamp()))
               .with_owner(self.wallet)
               .fee_limit(100 * 1000000)
               .build()
               .sign(self.private_key)
               )
        result = txn.broadcast().wait()
        if result["receipt"]["result"] == "SUCCESS":
            print("transaction ok: {0}".format(result))
        else:
            print("transaction error: {0}".format(result))
        return result


def main():
    # change it to your wallet address
    address_wallet = "TGrDfWjBrefFdsT6VNB4ZpN9qBpmfM6Smo"
    # set your private key to the environment variable 'key'
    private_key = os.getenv("key")
    sunswap = SunSwap(address_wallet, private_key)

    balance = sunswap.erc20_balance(Known.usdt)
    print("usdt balance: {0}".format(balance))

    limit_price = Decimal("0.0054")
    amount_buy = Decimal(1)
    print("if the price of SUN is lower than {0} USDT/SUN, buy {1} USDT of SUN".format(limit_price, amount_buy))

    token_path = [Known.usdt, Known.sun]

    while True:
        price = sunswap.query_price(token_path)
        print("sun price: {0} USDT/SUN".format(price))
        if price <= limit_price:
            print("price ok, buy {0} USDT of SUN".format(amount_buy))
            sunswap.swap_token(amount_buy, token_path)
            break
        time.sleep(2)


if __name__ == '__main__':
    main()

可以看到 tronpy 的代码写起来更简单,tronpy 的 get_contract 方法,可以从网络上获取合约ABI,从而让我们在调用合约方法的时候,无需关心ABI这回事,如同调用本地方法一样去调用智能合约。而在web3.py中,这个自动获取ABI的功能我们需要自行实现。同时Tron的开发者文档也有全中文版本,对新手更加友好。文章来源地址https://www.toymoban.com/news/detail-422816.html

到了这里,关于【Tron】使用Python玩转SunSwap的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通过一篇文章带你玩转git和GitHub

    在现代软件开发中,版本控制系统是不可或缺的工具。Git和Github是其中最受欢迎的组合。Git是一个开源的分布式版本控制系统,用于追踪代码的改动,而Github则是一个基于Git的代码托管平台,提供了代码托管、协作开发等功能。 Git的基本用法 安装与配置 :首先,你需要在你

    2024年03月10日
    浏览(36)
  • 一篇关于计算机网络原理的文章

    计算机网络原理是指计算机网络的基本概念、协议以及通信技术等方面的知识。 了解计算机网络原理对于我们使用互联网、编程开发以及网络安全等方面都极为重要。 在本文中,将介绍计算机网络原理的基本内容。 一、计算机网络的基本概念 计算机网络是指将分布在不同地

    2023年04月23日
    浏览(77)
  • 【BSC】使用Python玩转PancakeSwap(入门篇)

    最近我们需要在BSC上实现代币的自动化兑换,比如自动把BNB兑换成USDT,自动把USDT兑换成CAKE等其它代币,同时也要监视价格,在价格合适的时候再兑换代币。而PancakeSwap正是BSC上最大的去中心化平台,我们已经学会了手动在PancakeSwap上进行代币兑换,那么如何使用Python对这个操

    2024年02月03日
    浏览(26)
  • AI辅写疑似度怎么查看:一篇自媒体文章

    大家好,今天来聊聊AI辅写疑似度怎么查看:一篇自媒体文章,希望能给大家提供一点参考。 以下是针对论文AI辅写率高的情况,提供一些修改建议和技巧,可以借助此类工具: 还有: AI辅写疑似度怎么查看:一篇自媒体文章 随着人工智能技术的不断发展,AI辅写已经成为写

    2024年02月20日
    浏览(39)
  • 【科普向】LaTeX简介(一篇极简的 LaTeX 介绍文章)

    我们平时在word里新建一个doc(x)文件后,输入内容,调整页边距、字体大小、行间距等待,然后交给打印机打印就可以了。 如果你写了一篇关于新疆棉花的文章,2000字,在word里调整很快就可以得到你想要的效果。 但如果你想把自己记下的关于矩阵乘法的笔记打印下来,因为

    2024年02月04日
    浏览(29)
  • 玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!

    分组,顾名思义,分成小组。简而言之就是就是把相同的数据分到一个组。 如下表(表名gb),里面有16条数据,前8条是狗狗,后8条是猫猫. 现在对name这个列进行分组查询 得到结果如下: 我们发现他把原始表分为了两个小组,狗狗小组和猫猫小组。从这可以看出分组查询就

    2023年04月18日
    浏览(30)
  • 记录第一篇被”华为开发者联盟鸿蒙专区 “收录的文章

    记录第一篇被”华为开发者联盟鸿蒙专区 “社区收录的文章。 坚持写作的动力是什么? 是记录、分享,以及更好的思考 。  

    2024年02月14日
    浏览(28)
  • R语言复现一篇6分的孟德尔随机化文章

    上一期我们对孟德尔随机化做了一个简单的介绍,今天我们来复现一篇6分左右的使用了孟德尔随机化方法的文章,文章的题目是:Mendelian randomization analysis does not reveal a causal influence of mental diseases on osteoporosis(孟德尔随机分析没有揭示精神疾病对骨质疏松症的因果影响) 这

    2024年02月13日
    浏览(29)
  • 带你玩转数据结构-单链表(适合初学者的文章,讲解的很仔细哦)

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::讲解数据结构中链表的知识,;链表的分类,c语言实现单链表常见接口等. 金句分享: ✨山不向我走来,我便向山走去.✨ 顺序表 缺点: 中间/头部的插入删除,时间复杂

    2024年02月03日
    浏览(27)
  • [玩转AIGC]LLaMA2训练中文文章撰写神器(数据准备,数据处理,模型训练,模型推理)

    好久没更新这个专栏的文章了,今天抽空写了一篇。————2023.12.28 摘要:文体包括新闻,法律文书,公告,广告等,每种文体的书写风格不一样,如果拥有自己的数据集,想针对特定文体来训练一个内容生成的工具,来帮助自己写点文章,如果没接触过AIGC,可能一开始会

    2024年01月17日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包