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

software.crldev.elrondspringbootstarterreactive.interactor.esdt.ErdESDTInteractorImpl 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.esdt;

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.esdt.ESDTQueryType;
import software.crldev.elrondspringbootstarterreactive.domain.esdt.ESDTTransaction;
import software.crldev.elrondspringbootstarterreactive.domain.esdt.common.ESDTSpecialRole;
import software.crldev.elrondspringbootstarterreactive.domain.esdt.common.TokenIdentifier;
import software.crldev.elrondspringbootstarterreactive.domain.smartcontract.ContractQuery;
import software.crldev.elrondspringbootstarterreactive.domain.smartcontract.FunctionArg;
import software.crldev.elrondspringbootstarterreactive.domain.smartcontract.FunctionName;
import software.crldev.elrondspringbootstarterreactive.domain.wallet.Wallet;
import software.crldev.elrondspringbootstarterreactive.interactor.WrappedResponses;
import software.crldev.elrondspringbootstarterreactive.interactor.smartcontract.ErdSmartContractInteractor;
import software.crldev.elrondspringbootstarterreactive.interactor.transaction.ErdTransactionInteractor;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static java.lang.String.format;
import static software.crldev.elrondspringbootstarterreactive.config.constants.ESDTConstants.*;

public class ErdESDTInteractorImpl implements ErdESDTInteractor {
    private final ErdProxyClient client;
    private final ErdTransactionInteractor tInteractor;
    private final ErdSmartContractInteractor scInteractor;

    @Override
    public Mono processEsdtTransaction(Wallet wallet, ESDTTransaction transaction) {
        return tInteractor.sendTransaction(wallet, transaction.toTransactionRequest(wallet));
    }

    @Override
    public Mono> getTokensForAccount(Address address) {
        return client.get(format(ApiResourceURI.ESDT_TOKENS_FOR_ADDRESS.getURI(), address.getBech32()), WrappedResponses.AccountESDTsResponse.class).map(WrappedResponses.AccountESDTsResponse::getResult).map(Map::values).map(HashSet::new);
    }

    @Override
    public Mono getTokenRolesForAccount(Address address) {
        return client.get(format(ApiResourceURI.ESDT_ROLES_FOR_ADDRESS.getURI(), address.getBech32()), AccountESDTRoles.class);
    }

    @Override
    public Mono getAllTokens(ESDTQueryType queryType) {
        String url;
        switch (queryType) {
        case ALL: 
            url = ApiResourceURI.ESDT_ALL_ISSUED_TOKENS.getURI();
            break;
        case FUNGIBLE: 
            url = ApiResourceURI.ESDT_ALL_ISSUED_FUNGIBLE_TOKENS.getURI();
            break;
        case NON_FUNGIBLE: 
            url = ApiResourceURI.ESDT_ALL_ISSUED_NONFUNGIBLE_TOKENS.getURI();
            break;
        case SEMI_FUNGIBLE: 
            url = ApiResourceURI.ESDT_ALL_ISSUED_SEMIFUNGIBLE_TOKENS.getURI();
            break;
        default: 
            throw new IllegalStateException("Unexpected value: " + queryType);
        }
        return client.get(url, TokenList.class);
    }

    @Override
    public Mono getTokenProperties(TokenIdentifier identifier) {
        return getProps(identifier, ESDT_GET_PROPERTIES_CALL);
    }

    @Override
    public Mono getTokenSpecialRoles(TokenIdentifier identifier) {
        return getProps(identifier, ESDT_GET_SPECIAL_ROLES_CALL);
    }

    @Override
    public Mono getNftDataForAccount(Address address, TokenIdentifier identifier, Nonce nonce) {
        return client.get(format(ApiResourceURI.NFT_DATA_FOR_ADDRESS.getURI(), address.getBech32(), identifier.getValue(), nonce.getValue()), WrappedResponses.NFTDataResponse.class).map(WrappedResponses.NFTDataResponse::getResult);
    }

    @Override
    public Mono getNftSftForAccount(Address address) {
        return client.get(format(ApiResourceURI.NFT_SFT_REGISTERED_FOR_ADDRESS.getURI(), address.getBech32()), TokenList.class);
    }

    @Override
    public Mono getTokensWithRole(Address address, ESDTSpecialRole role) {
        return client.get(format(ApiResourceURI.ESDT_TOKENS_WITH_ROLE.getURI(), address.getBech32(), role.getValue()), TokenList.class);
    }

    private Mono getProps(TokenIdentifier identifier, String scCall) {
        return scInteractor.query(ContractQuery.builder().smartContractAddress(Address.fromBech32(ESDT_ISSUER_BECH32_ADDRESS)).functionName(FunctionName.fromString(scCall)).args(List.of(FunctionArg.fromString(identifier.getValue()))).build());
    }

    public ErdESDTInteractorImpl(final ErdProxyClient client, final ErdTransactionInteractor tInteractor, final ErdSmartContractInteractor scInteractor) {
        this.client = client;
        this.tInteractor = tInteractor;
        this.scInteractor = scInteractor;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy