AdaHandleMapper.java

package org.cardanofoundation.tools.adahandle.resolver.mapper;
import com.bloxbean.cardano.yaci.store.common.domain.AddressUtxo;
import com.bloxbean.cardano.yaci.store.common.domain.Amt;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Hex;
import org.cardanofoundation.tools.adahandle.resolver.entity.AdaHandle;

import java.util.ArrayList;
import java.util.Arrays;

@Slf4j
public class AdaHandleMapper {
    public static ArrayList<AdaHandle> toAdaHandles(AddressUtxo addressUtxo) {
        final ArrayList<AdaHandle> adaHandles = new ArrayList<>();
        final String ADA_HANDLE_POLICY_ID = "f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a";
        final byte[] CIP68_100_PREFIX = {0, 6, 67, -80};
        final byte[] CIP68_222_PREFIX = {0, 13, -31, 64};

        if (addressUtxo.getAmounts() != null) {
            for (final Amt amount : addressUtxo.getAmounts()) {
                if (amount.getPolicyId() != null) {
                    if (amount.getPolicyId().equals(ADA_HANDLE_POLICY_ID)) {
                        String adaHandle = amount.getAssetName();

                        try {
                            String assetNameFromUnit = amount.getUnit().replaceFirst("^" + amount.getPolicyId(), "");
                            byte[] decodedAssetName = Hex.decodeHex(assetNameFromUnit);

                            if(Arrays.equals(Arrays.copyOf(decodedAssetName, 4), CIP68_100_PREFIX)) {
                                continue;
                            }

                            if(Arrays.equals(Arrays.copyOf(decodedAssetName, 4), CIP68_222_PREFIX)) {
                                adaHandle = new String(Arrays.copyOfRange(decodedAssetName, 4, decodedAssetName.length));
                            }
                        } catch (Exception e) {
                            log.warn("Error decoding asset name: {}", e.getMessage());
                        }

                        adaHandles.add(new AdaHandle(adaHandle, addressUtxo.getOwnerStakeAddr(), addressUtxo.getOwnerAddr()));
                    }
                }
            }
        }
        return adaHandles;
    }
}