Created
September 17, 2022 12:02
-
-
Save zjor/30e1e6e0d7fcee8ec155df0cde3d9a4e to your computer and use it in GitHub Desktop.
Swaps ERC20 tokens with 0x.org. Shows how to set target allowance.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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