Skip to content

Instantly share code, notes, and snippets.

@zjor
Created September 17, 2022 12:02
Show Gist options
  • Save zjor/30e1e6e0d7fcee8ec155df0cde3d9a4e to your computer and use it in GitHub Desktop.
Save zjor/30e1e6e0d7fcee8ec155df0cde3d9a4e to your computer and use it in GitHub Desktop.
Swaps ERC20 tokens with 0x.org. Shows how to set target allowance.
package org.example.crypto;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.core.config.Configurator;
import org.web3j.contracts.eip20.generated.ERC20;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.WalletUtils;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.RawTransactionManager;
import org.web3j.tx.TransactionManager;
import org.web3j.tx.gas.DefaultGasProvider;
import org.web3j.tx.response.PollingTransactionReceiptProcessor;
import org.web3j.tx.response.TransactionReceiptProcessor;
import java.math.BigInteger;
import java.util.Optional;
@Slf4j
public class ZeroExERC20Swap {
// for URL addresses see https://docs.0x.org/introduction/0x-cheat-sheet#0x-api-endpoints
public static final String BSC_BASE_URL = "https://bsc.api.0x.org";
public static final String POLYGON_BASE_URL = "https://polygon.api.0x.org";
public static final String MUMBAI_BASE_URL = "https://mumbai.api.0x.org";
public static final String BSC_KISS_ME = "0x3ad2ea050c3a103961475e10c2332e043e170840";
public static final String POLYGON_MATIC = "0xDef1C0ded9bec7F1a1670819833240f027b25EfF";
public static final String POLYGON_USDC = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
public static final String POLYGON_VHC = "0x51b5619f5180e333d18b6310c8d540aea43a0371";
public static final String MUMBAI_KMC = "0x87acc29a0c619cC99921A1d3DE71f389B5e93C12";
public static final String MUMBAI_TUSDC = "0x8B9b8543516f7Eef3f5B54929B133b841a50a55A";
private static final String MNEMONIC = "...";
private static Web3j buildMumbaiWeb3j() {
var url = "https://polygon-mumbai.infura.io/v3/...";
return Web3j.build(new HttpService(url));
}
private static Credentials getCredentials() {
return WalletUtils.loadBip39Credentials("", MNEMONIC);
}
private static void runInMumbai() throws Exception {
var web3j = buildMumbaiWeb3j();
var creds = getCredentials();
var walletAddress = creds.getAddress();
log.info("Wallet address: {}", walletAddress);
log.info("Balance: {}", web3j.ethGetBalance(walletAddress, DefaultBlockParameterName.LATEST).send().getBalance());
var txManager = new RawTransactionManager(web3j, creds, web3j.ethChainId().send().getChainId().longValue());
var tusdcContract = ERC20.load(MUMBAI_TUSDC, web3j, txManager, new DefaultGasProvider());
var tusdcBalance = tusdcContract.balanceOf(walletAddress).send();
log.info("TUSDC balance: {}", tusdcBalance);
var kmcContract = ERC20.load(MUMBAI_KMC, web3j, txManager, new DefaultGasProvider());
var kmcBalance = kmcContract.balanceOf(walletAddress).send();
log.info("$KMC balance: {}", kmcBalance);
var client = new ZeroExClient(MUMBAI_BASE_URL);
var sellAmount = BigInteger.valueOf(100000L);
var priceResponse = client.getPrice(GetPriceRequest.builder()
.sellToken(MUMBAI_TUSDC)
.buyToken(MUMBAI_KMC)
.sellAmount(Optional.of(sellAmount))
.build());
log.info("Price: {}; allowanceTarget: {}", priceResponse.price, priceResponse.allowanceTarget);
log.info("Setting allowance...");
var txReceipt = tusdcContract.approve(priceResponse.allowanceTarget, sellAmount).send();
TransactionReceiptProcessor receiptProcessor = new PollingTransactionReceiptProcessor(
web3j,
TransactionManager.DEFAULT_POLLING_FREQUENCY,
TransactionManager.DEFAULT_POLLING_ATTEMPTS_PER_TX_HASH);
TransactionReceipt receipt = receiptProcessor
.waitForTransactionReceipt(txReceipt.getTransactionHash());
log.info("Done. Receipt: {}; Status: {}", receipt.getTransactionHash(), receipt.getStatus());
var quote = client.getQuote(GetQuoteRequest.builder()
.sellToken(MUMBAI_TUSDC)
.buyToken(MUMBAI_KMC)
.sellAmount(Optional.of(sellAmount))
.takerAddress(Optional.of(walletAddress))
.build());
log.info("Quote: {}", quote.price);
log.info("Swapping tokens...");
var txHash = txManager
.sendTransaction(quote.gasPrice, quote.gas, quote.to, quote.data, quote.value)
.getTransactionHash();
var swapTxReceipt = receiptProcessor.waitForTransactionReceipt(txHash);
log.info("Done. Receipt: {}; Status: {}", swapTxReceipt.getTransactionHash(), swapTxReceipt.getStatus());
log.info("TUSDC balance: {}", tusdcContract.balanceOf(walletAddress).send());
log.info("$KMC balance: {}", kmcContract.balanceOf(walletAddress).send());
}
public static void main(String[] args) throws Exception {
Configurator.initialize(null, "classpath:log4j2-local.xml");
runInMumbai();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment