eth和erc20代码接入
Posted 小牤牤她爸_老乡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了eth和erc20代码接入相关的知识,希望对你有一定的参考价值。
基于web3j
创建地址
public static EthAddress createAddress() {
try {
String seed = UUID.randomUUID().toString();
ECKeyPair ecKeyPair = Keys.createEcKeyPair();
BigInteger privateKeyInDec = ecKeyPair.getPrivateKey();
String sPrivatekeyInHex = privateKeyInDec.toString(16);
WalletFile aWallet = Wallet.createLight(seed, ecKeyPair);
String sAddress = aWallet.getAddress();
EthAddress address = new EthAddress();
address.setAddress("0x" + sAddress);
address.setPrivateKey(sPrivatekeyInHex);
return address;
} catch (Throwable t) {
logger.error("创建地址失败", t);
}
return null;
}
查询erc20余额
public static BigInteger balanceOfErc20(Web3j web3j, String contract, String address) {
try {
final String DATA_PREFIX = "0x70a08231000000000000000000000000";
String value = web3j.ethCall(org.web3j.protocol.core.methods.request.Transaction.createEthCallTransaction(address,
contract, DATA_PREFIX + address.substring(2)), DefaultBlockParameterName.PENDING).send().getValue();
if (StringUtils.isEmpty(value)) {
return BigInteger.ZERO;
}
return new BigInteger(value.substring(2), 16);
} catch (Throwable t) {
logger.error(String.format("查询ERC20失败 contract:%s address:%s", contract, address), t);
}
return BigInteger.ZERO;
}
发送erc20
public static String sendErc20(Web3j web3j, String contractAddress, String privateKey,
String to, BigInteger value) {
String from = getAddressByPrivateKey(privateKey);
logger.info(String.format("Start:SendErc20 from:%s to:%s amount:%s erc20:%s", from, to, value.toString(), contractAddress));
try {
//加载转账所需的凭证,用私钥
Credentials credentials = Credentials.create(privateKey);
//获取nonce,交易笔数
BigInteger nonce = getNonce(web3j, from);
if (nonce == null) {
logger.error(String.format("END:GetNonceError from:%s to:%s amount:%s erc20:%s", from, to, value.toString(), contractAddress));
return null;
}
//gasPrice和gasLimit 都可以手动设置
BigInteger gasPrice = getGasPrice(web3j);
if (gasPrice == null) {
logger.error(String.format("END:GetGasPriceError from:%s to:%s amount:%s erc20:%s", from, to, value.toString(), contractAddress));
return null;
}
//BigInteger.valueOf(4300000L) 如果交易失败 很可能是手续费的设置问题
BigInteger gasLimit = BigInteger.valueOf(60000L);
//ERC20代币合约方法
Function function = new Function(
"transfer",
Arrays.asList(new Address(to), new Uint256(value)),
Collections.singletonList(new TypeReference<Type>() {
}));
//创建RawTransaction交易对象
String encodedFunction = FunctionEncoder.encode(function);
RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, gasPrice, gasLimit,
contractAddress, encodedFunction);
//签名Transaction
byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
String hexValue = Numeric.toHexString(signMessage);
//发送交易
EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
String hash = ethSendTransaction.getTransactionHash();
if (hash != null) {
return hash;
}
logger.error(String.format("END:HashIsNull from:%s to:%s amount:%s erc20:%s", from, to, value.toString(), contractAddress));
} catch (Throwable t) {
System.out.println(t);
logger.error(String.format("发送ERC20失败 from=%s to=%s erc20=%s amount=%s",
from, to, contractAddress, value.toString()), t);
}
return null;
}
其他方法暂不贴了,有时间再弄
需要帮助的联系:laoxiang829
以上是关于eth和erc20代码接入的主要内容,如果未能解决你的问题,请参考以下文章