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