Java 获取Uniswap的交易对地址

Java 获取Uniswap的交易对地址

Tx

https://etherscan.io/address/0x25942771b17f3790bf32cae7af7d539ce42cdc79#code

Code

package com.hlf.eth;

import org.spongycastle.util.encoders.Hex;
import org.web3j.abi.datatypes.Address;
import org.web3j.abi.datatypes.DynamicArray;
import org.web3j.abi.datatypes.generated.Bytes1;
import org.web3j.abi.datatypes.generated.Bytes32;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.crypto.Hash;
import org.web3j.utils.Numeric;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: CalculatPairAddress
 * @Author: huanglefei
 * @CreateDate: 2023/8/18 22:04
 * @Description:
 * @Version: 1.0
 * // calculates the CREATE2 address for a pair without making any external calls
 * function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
 * (address token0, address token1) = sortTokens(tokenA, tokenB);
 * pair = address(
 * uint(
 * keccak256(
 * abi.encodePacked(
 * hex'ff',
 * factory,
 * keccak256(abi.encodePacked(token0, token1)),
 * hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
 * )
 * )
 * )
 * );
 * }
 **/
public class CalculatPairAddress {
    public static void main(String[] args) {
        // UniswapV2
        String initCodeHash = "96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f";
        String factory = "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f";
        String tokenB = "0x8C130499D33097D4D000D3332E1672f75b431543";
        String tokenA = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";
        String pair = getPairAddress(initCodeHash, factory, tokenA, tokenB);
        System.out.println("交易对地址:" + pair);

    }

    public static String getPairAddress(String initCodeHash, String factory, String tokenA, String tokenB) {
        List<String> strings = sortTokens(tokenA, tokenB);
        tokenA = strings.get(0);
        tokenB = strings.get(1);
        Bytes1 parff = new Bytes1(Numeric.hexStringToByteArray("ff"));
        Bytes32 parInitCodeHash = new Bytes32(Numeric.hexStringToByteArray(initCodeHash));

        StringBuilder tokenAddress = new StringBuilder();
        tokenAddress.append(tokenA.substring(2, tokenA.length()));
        tokenAddress.append(tokenB.substring(2, tokenB.length()));
        String tokenHash = Hash.sha3("0x" + tokenAddress.toString());
        
        StringBuilder msg = new StringBuilder();
        msg.append(Hex.toHexString(parff.getValue()));
        msg.append(factory.substring(2, factory.length()));
        msg.append(Numeric.cleanHexPrefix(tokenHash));
        msg.append(Hex.toHexString(parInitCodeHash.getValue()));
        String hash1 = Hash.sha3("0x" + msg.toString());
        BigInteger uintAddress = Numeric.toBigInt(hash1);
        DynamicArray<Uint256> array = new DynamicArray<>(Uint256.class, new Uint256(uintAddress));
        BigInteger uint256 = array.getValue().get(0).getValue();
        String s3 = Numeric.toHexString(uint256.toByteArray());
        String pairAddress = s3.substring(s3.length() - 40);
        return "0x" + pairAddress;
    }

    public static List<String> sortTokens(String tokenA, String tokenB) {
        Address address1 = new Address(tokenA);
        Address address2 = new Address(tokenB);
        BigInteger value1 = address1.toUint().getValue();
        BigInteger value2 = address2.toUint().getValue();
        List<String> result = new ArrayList<>();
        if (value1.compareTo(value2) < 0) {
            result.add(tokenA);
            result.add(tokenB);
        } else {
            result.add(tokenB);
            result.add(tokenA);
        }
        return result;
    }
}

console

交易对地址:0x25942771b17f3790bf32cae7af7d539ce42cdc79

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值