栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot使用web3进行代币交换(uniswap)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot使用web3进行代币交换(uniswap)

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Address;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.StaticArray;
import org.web3j.abi.datatypes.Type;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.RawTransaction;
import org.web3j.crypto.TransactionEncoder;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.methods.response.EthGasPrice;
import org.web3j.protocol.core.methods.response.EthGetTransactionCount;
import org.web3j.protocol.core.methods.response.EthGetTransactionReceipt;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
import org.web3j.protocol.http.HttpService;
import org.web3j.utils.Convert;
import org.web3j.utils.Numeric;

import io.renren.common.utils.R;
import net.sf.json.JSONObject;

@Service
public class Uniswap {
	private static final Logger log = LoggerFactory.getLogger(Uniswap.class);

	@Autowired
	private EthGas ethGas;

	@Autowired
	private EthAccount ethAccount;
	
	
	public R sendContract(BigInteger gasLimit,BigInteger gasPrice,String host, String privateKey, BigDecimal v, String contractAddress, BigInteger amountOutMin,
			String sendTokenContractAddress,String approveAddress) {
		
		Web3j web3j = Web3j.build(new HttpService(host));
		try {
			Credentials credentials = Credentials.create(privateKey);
			String fromAddress = credentials.getAddress();
			//获取交易次数
			EthGetTransactionCount ethGetTransactionCount = ethAccount.getTradeCount(web3j, privateKey);
			//错误返回
			if (ethGetTransactionCount.hasError()) {
				return R.error(ethGetTransactionCount.getError().getMessage());
			}
			BigInteger nonce = ethGetTransactionCount.getTransactionCount();
			//合约函数参数
			List addList = new ArrayList();
			addList.add(new Address(sendTokenContractAddress));
			addList.add(new Address(approveAddress));
			StaticArray address = new StaticArray(Address.class, addList) {
			};
			// BigInteger amountOutMin = Numeric.toBigInt("0x8d5ff4d17003f1000");
			if(gasPrice.compareTo(BigInteger.valueOf(0)) != 1) { //没有输入gas时查询当前链路的gas
				EthGasPrice ethGasPrice = ethGas.getGasPrice(web3j);
				if (ethGasPrice.hasError()) {
					return R.error(ethGasPrice.getError().getMessage());
				}
				gasPrice = ethGasPrice.getGasPrice();
			}
			//创建inputdata
			String data = createSwapMethod(amountOutMin, address, addList.size(), new Address(fromAddress),
					new Uint256(System.currentTimeMillis() / 1000 + 300));
//			EthEstimateGas ethEstimateGas = ethGas.getEthEstimateGas(web3j, fromAddress, contractAddress, data);
//			if (ethEstimateGas.hasError()) {
//				return R.error(ethEstimateGas.getError().getMessage());
//			}
//			BigInteger gasLimit = BigInteger.valueOf(910000);
			
			BigInteger value = Convert.toWei(String.valueOf(v.toString()), Convert.Unit.ETHER).toBigInteger();
			RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, gasPrice, gasLimit, contractAddress,
					value, data);
			byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
			String hexValue = Numeric.toHexString(signedMessage);
			log.info("hexValue:{}", hexValue);
			//发送交易
			EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
			if (ethSendTransaction.hasError()) {
				return R.error(ethSendTransaction.getError().getMessage());
			}
			log.info("transactionHash:{}", JSONObject.fromObject(ethSendTransaction));
			String transactionHash = ethSendTransaction.getTransactionHash();
			log.info("transactionHash:{}", transactionHash);
			EthGetTransactionReceipt ethGetTransactionReceipt = web3j.ethGetTransactionReceipt(transactionHash)
					.sendAsync().get();
			log.info("EthGetTransactionReceipt:{}", JSONObject.fromObject(ethGetTransactionReceipt));
			if (ethGetTransactionReceipt.hasError()) {
				return R.error(ethGetTransactionReceipt.getError().getMessage());
			}
			return R.ok(transactionHash);
		} catch (Exception e) {
			// TODO: handle exception
			web3j.shutdown();
			return R.error(e.getMessage());
		}finally {
			web3j.shutdown();
		}

	}

	@SuppressWarnings("rawtypes")
	public static String createSwapMethod(BigInteger amountOutMin, StaticArray addressArray, int size,
			Address to, Uint256 deadline) {

		List parametersList = new ArrayList();
		parametersList.add(new Uint256(amountOutMin));
		parametersList.add(new Uint256(128));
		parametersList.add(to);
		parametersList.add(deadline);
		parametersList.add(new Uint256(BigInteger.valueOf(size)));
		parametersList.add(addressArray);
		List> outList = new ArrayList<>();
		Function function = new Function("swapExactETHForTokens", parametersList, outList);
		String encodedFunction = FunctionEncoder.encode(function);
		System.out.println(encodedFunction);
		//函数编码不正确,先替换
		return encodedFunction.replace("0x8fd067c2", "0x7ff36ab5");
	}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/592555.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号