All Downloads are FREE. Search and download functionalities are using the official Maven repository.

software.crldev.elrondspringbootstarterreactive.interactor.transaction.ErdTransactionInteractorImpl Maven / Gradle / Ivy

Go to download

A SpringBoot Starter solution designed to ensure easy and efficient integration with the Elrond Network using a Reactive API layer.

The newest version!
package software.crldev.elrondspringbootstarterreactive.interactor.transaction;

import reactor.core.publisher.Mono;
import software.crldev.elrondspringbootstarterreactive.api.ApiResourceURI;
import software.crldev.elrondspringbootstarterreactive.api.model.*;
import software.crldev.elrondspringbootstarterreactive.client.ErdProxyClient;
import software.crldev.elrondspringbootstarterreactive.domain.account.Address;
import software.crldev.elrondspringbootstarterreactive.domain.common.Nonce;
import software.crldev.elrondspringbootstarterreactive.domain.transaction.Transaction;
import software.crldev.elrondspringbootstarterreactive.domain.wallet.Wallet;
import software.crldev.elrondspringbootstarterreactive.error.exception.InvalidSentTransactionsException;
import software.crldev.elrondspringbootstarterreactive.error.exception.MissingTransactionRequestException;
import software.crldev.elrondspringbootstarterreactive.error.exception.ProxyRequestException;
import software.crldev.elrondspringbootstarterreactive.interactor.WrappedResponses;
import software.crldev.elrondspringbootstarterreactive.interactor.account.ErdAccountInteractor;
import java.util.ArrayList;
import java.util.List;
import static java.lang.String.format;

public class ErdTransactionInteractorImpl implements ErdTransactionInteractor {
    private final ErdProxyClient client;
    private final ErdAccountInteractor accountInteractor;

    @Override
    public Mono sendTransaction(Transaction.Sendable payload) {
        return client.post(ApiResourceURI.SEND_TRANSACTION.getURI(), payload, TransactionHash.class);
    }

    @Override
    public Mono sendTransaction(Wallet wallet, TransactionRequest request) {
        return assignNonce(wallet).map(nonce -> buildSendableFromRequest(wallet, request, nonce, false)).flatMap(this::sendTransaction);
    }

    @Override
    public Mono sendMultipleTransactions(List payloads) {
        return client.post(ApiResourceURI.SEND_MULTIPLE_TRANSACTIONS.getURI(), payloads.toArray(), TransactionsSentResult.class).map(this::processSendTransactions);
    }

    @Override
    public Mono sendMultipleTransactions(Wallet wallet, List request) {
        request.stream().findFirst().orElseThrow(MissingTransactionRequestException::new);
        return assignNonce(wallet).map(n -> {
            var listOfSendables = new ArrayList();
            for (long i = 0, nonce = n; i < request.size() && nonce <= nonce + request.size(); i++, nonce++) listOfSendables.add(buildSendableFromRequest(wallet, request.get((int) i), nonce, false));
            return listOfSendables;
        }).flatMap(this::sendMultipleTransactions);
    }

    @Override
    public Mono simulateTransaction(Transaction.Sendable payload) {
        return client.post(ApiResourceURI.SIMULATE_TRANSACTION.getURI(), payload, WrappedResponses.SimulateTransactionResponse.class).map(WrappedResponses.SimulateTransactionResponse::getResult);
    }

    @Override
    public Mono simulateTransaction(Wallet wallet, TransactionRequest request) {
        return assignNonce(wallet).map(nonce -> buildSendableFromRequest(wallet, request, nonce, false)).flatMap(this::simulateTransaction);
    }

    @Override
    public Mono estimateTransactionCost(Transaction.Sendable payload) {
        return client.post(ApiResourceURI.ESTIMATE_TRANSACTION_COST.getURI(), payload, TransactionCostEstimation.class).map(this::processCostEstimation);
    }

    @Override
    public Mono estimateTransactionCost(Wallet wallet, TransactionRequest request) {
        return assignNonce(wallet).map(nonce -> buildSendableFromRequest(wallet, request, nonce, true)).flatMap(this::estimateTransactionCost);
    }

    @Override
    public Mono queryTransactionInfo(String transactionHash, boolean withResults) {
        return client.get(format(ApiResourceURI.TRANSACTION_ON_NETWORK.getURI(), transactionHash, withResults), WrappedResponses.QueryTransactionResponse.class).map(WrappedResponses.QueryTransactionResponse::getTransaction);
    }

    @Override
    public Mono queryTransactionStatus(String transactionHash) {
        return client.get(format(ApiResourceURI.TRANSACTION_STATUS.getURI(), transactionHash), TransactionStatus.class);
    }

    private TransactionCostEstimation processCostEstimation(TransactionCostEstimation estimation) {
        if (estimation.getTransactionGasUnits().equals("0")) throw new ProxyRequestException(estimation.getReturnMessage());
        return estimation;
    }

    private TransactionsSentResult processSendTransactions(TransactionsSentResult result) {
        if (result.getNumberOfSentTransactions() == 0) throw new InvalidSentTransactionsException();
        return result;
    }

    private Transaction.Sendable buildSendableFromRequest(Wallet wallet, TransactionRequest request, Long nonceValue, boolean isEstimationRequest) {
        var transaction = new Transaction();
        transaction.setValue(request.getValue());
        transaction.setNonce(Nonce.fromLong(nonceValue));
        transaction.setReceiver(request.getReceiverAddress());
        transaction.setSender(Address.fromHex(wallet.getPublicKeyHex()));
        transaction.setPayloadData(request.getData());
        transaction.setIsEstimation(isEstimationRequest);
        if (!request.getGasLimit().isZero()) transaction.setGasLimit(request.getGasLimit());
        wallet.sign(transaction);
        return transaction.toSendable();
    }

    private Mono assignNonce(Wallet wallet) {
        return accountInteractor.getNonce(Address.fromHex(wallet.getPublicKeyHex())).map(AccountNonce::getNonce);
    }

    public ErdTransactionInteractorImpl(final ErdProxyClient client, final ErdAccountInteractor accountInteractor) {
        this.client = client;
        this.accountInteractor = accountInteractor;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy