智能合约模拟调用的具体应用:在golang中查询uniswap v3智能合约上某代币的价格

这篇具有很好参考价值的文章主要介绍了智能合约模拟调用的具体应用:在golang中查询uniswap v3智能合约上某代币的价格。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、最初的实现思路

合约的方法如果是public view的,那么通过golang代码可以直接调用,步骤大致为:
1、使用合约的ABI生成.go文件接口
2、使用以太坊节点链接初始化以太坊客户端;
3、以以太坊客户端和uniswap合约地址为参数,实例化uniswap合约
4、直接调用uniswap的“查询价格”的方法,传入代币地址和数量等参数,获取价格。

二、遇到的问题

上述思路在使用uniswap v2时是奏效的,但v3的合约代码中找不到某个方法是public view的供查询价格。
而看文档的说明,可以调用quoter合约的“quoteExactInputSingle”方法查询价格。
看合约的源码,发现该方法的调用会上链,也就是需要消耗gas。这说明代币的兑换实质发生了,而我们的需求则只是查询价格而非交易。

三、智能合约的模拟调用

在找不到其他更合适方法且无法理解quoter合约的时候,同事提出了原理和解决方案。我们可以运用智能合约模拟调用的特性,来实现只查询价格,而不改变链状态。

那么,什么是合约的模拟调用?

假设合约中有状态变量number,有方法addOne,每一次调用addOne都会给number加一,也就是改变了链上的数据状态。

我们想知道下次调用addOne会使number变为几,而不真的改变number,我们就要用“模拟调用”。

假设number目前是5,具体的实现,在js代码中是这样的:

const number= await contract.addOne.call();
//输出6,但链上仍为5

关键就在于调用了addOne方法后,又加上了.call()
这就是模拟调用。
如果不加.call,则输出6,且链上也改为了6.

四、golang是如何实现的

知道了原理,那么在golang中应该如何实现呢?
回到第一部分,有个步骤是生成.go文件。
.go文件生成后,在文件中会有UniswapRaw这样的结构体。
这就是模拟调用应该使用的结构体。
步骤是:
1、使用合约的ABI生成.go文件接口
2、使用以太坊节点链接初始化以太坊客户端;
3、以以太坊客户端和uniswap_quoter合约地址为参数,实例化uniswap_quoter合约
4、以uniswap_quoter对象为参数,实例化其对应的Raw对象rawCaller
5、声明一个空的输出变量 var out []interface{}
构造一个callOpts对象
准备业务入参params
6、调用rawCaller.Call(callOpts,out,params)
7、方法调用后,结果会写入out,而链上状态没有改变。
代码大致如下:文章来源地址https://www.toymoban.com/news/detail-470409.html

client := utils.GetChainClient()
uniswap, _ := uniswap_factory.NewUniswapV3QuoterV2(common.HexToAddress(uniswapAddress), client)
	callOpt := &bind.CallOpts{
		From:    common.Address{},
		Context: context.Background(),
	}
	token1 := common.HexToAddress("0x...")
	token2 = common.HexToAddress("0x...")
	fee := big.NewInt(3000)
	amountIn := utils.FloatStringToBigInt("1.00", 18)
	sqrtPriceLimitX96 := big.NewInt(0)
	var out []interface{}
	rawCaller := &uniswap_factory.UniswapV3QuoterV2Raw{Contract: uniswap}
	err := rawCaller.Call(callOpt, &out,"quoteExactInputSingle",
	uniswap_factory.IQuoterV2QuoteExactInputSingleParams{
				TokenIn:           token1,
				TokenOut:          token2,
				AmountIn:          amountIn,
				Fee:               fee,
				SqrtPriceLimitX96: sqrtPriceLimitX96,
			})
		if err != nil {
			logger.GetLogger().Errorf("get currency last price error %s", err.Error())
		}else{
		    price := utils.ConvertDecimal(out[0].(*big.Int), consts.Erc20Decimal)
			fmt.Println("price get :", price)
		}

到了这里,关于智能合约模拟调用的具体应用:在golang中查询uniswap v3智能合约上某代币的价格的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java智能合约工具包|Java调用智能合约|Java调用ERC20、ERC721、ERC1155合约

    Magician-ContractsTools是一个用于调用智能合约的工具包,你可以非常容易地在Java程序中调用智能合约进行查询和写入操作。 有三个内置的标准合约模板,分别是ERC20、ERC721和ERC1155,如果你需要调用这三个合约中的标准函数,可以帮助你非常快速地完成工作。除了内置的合同模板

    2024年02月11日
    浏览(55)
  • 如何在智能合约中调用另一个合约的函数

    智能合约是在区块链中被执行的一段程序,因为它们在区块链上执行,所以不依赖于任何的中心化服务器。目前最主流的智能合约编程语言是 Solidity。 在以太坊区块链中,智能合约可以和其他已经部署的智能合约进行交互。除了以太坊,其他 EVM 兼容的区块链(使用以太坊虚

    2024年01月22日
    浏览(54)
  • 智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

    Safful发现了一个有趣的错误,有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。 这篇文章对 ERC777 进行了全面的解释,涵盖了所有必要的细节。深入研究 ERC777 代币的具体细节的资源

    2024年02月04日
    浏览(39)
  • 四:调用部署在ganache的智能合约

    如果朋友有代码,工具,使用流程等不太清楚的,可用去专栏看看,专栏中有文章中所提及的具体使用方式。不太明白的朋友可以自己去看看~~ 瞬移专栏 实验目的 实验原理 ether.js中提供了我们对智能合约进行调用的方法,使用ether.js能很方便我们和智能合约进行交互。 js代码

    2023年04月09日
    浏览(35)
  • MetaMask与Web3中智能合约调用(2)

    智能合约交易区别于点对点交易,智能合约交易只需付费给矿工费用,也就是gas fee,是支付给矿工的手续费,当我们在以太坊区块链上进行转账时,矿工要把我们的交易打包并放上区块链,才能使交易完成,在这过程中会消耗区块链的运算资源,所以要支付费用 这个过程为

    2024年01月16日
    浏览(47)
  • 什么是智能合约?智能合约的应用

    智能合约(Smart Contract)是一种基于区块链技术的自动化合约,能够自动执行合约条件,而无需人工干预。智能合约的出现为许多传统领域带来了革命性的变化,它在金融、房地产、物流、政务等领域具有广泛的应用前景。 智能合约是一种通过计算机程序实现自动执行合约的

    2024年02月16日
    浏览(38)
  • Go调用智能合约(附最新的SEPOLIA FAUCET整理)

    Geth的安装很容易,下载安装即可(需要勾选 develop tools),我安装的是 1.13.10 版本,看其他博客和教程大部分都是版本 7 和 10 ,有些操作没办法照搬 问题:没办法挖矿【 miner.start() 后返回 null , eth_mining 返回 ture ,但实际上并没有挖矿】== 没法去部署合约 解决方法: 设置 –-

    2024年02月20日
    浏览(37)
  • 有了这个工具包,用Java调用智能合约更加简便

    Magician-ContractsTools是一个用于调用智能合约的工具包,你可以非常容易地在Java程序中调用智能合约进行查询和写入操作。 有三个内置的标准合约模板,分别是ERC20、ERC721和ERC1155,如果你需要调用这三个合约中的标准函数,可以帮助你非常快速地完成工作。除了内置的合同模板

    2024年02月11日
    浏览(50)
  • 调用智能合约报错分析小技巧 Error: execution reverted

    前端在调试调用合约的时候经常会遇到合约revert的情况,大部分区块浏览器只会显示 execution reverted,并不会把具体原因告诉我们。这个时候一般会去找合约大哥帮忙分析错误,但是合约大哥是怎么分析报错的呢? 这篇文章给你一个解题方法。 测试: main(\\\'0x5ac9e43a32a651e92cff8

    2024年02月11日
    浏览(51)
  • ERC20和BSC链调用智能合约转移拥有者权限

    自从回答了 bsc合约拥有者权限怎么打入0x000000000000000000地址 这个问题后, 好多人私信我要教程, 在这写一下 实现 先需要满足两个条件 你是合约的拥有者, 你的账户有足够的矿工费调用合约 ERC20链和BSC链都是一样的, 包括调用其他合约的方法(看不懂代码的别自己调用…浪费矿工

    2024年02月11日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包