use of com.esaulpaugh.headlong.abi.Tuple in project hedera-services by hashgraph.
the class DecodingFacade method decodeERCTransferFrom.
public List<TokenTransferWrapper> decodeERCTransferFrom(final Bytes input, final TokenID token, final boolean isFungible, final UnaryOperator<byte[]> aliasResolver) {
final Tuple decodedArguments = decodeFunctionCall(input, ERC_TRANSFER_FROM_SELECTOR, ERC_TRANSFER_FROM_DECODER);
final var from = convertLeftPaddedAddressToAccountId((byte[]) decodedArguments.get(0), aliasResolver);
final var to = convertLeftPaddedAddressToAccountId((byte[]) decodedArguments.get(1), aliasResolver);
if (isFungible) {
final List<SyntheticTxnFactory.FungibleTokenTransfer> fungibleTransfers = new ArrayList<>();
final var amount = (BigInteger) decodedArguments.get(2);
addAdjustmentAsTransfer(fungibleTransfers, token, to, amount.longValue());
addAdjustmentAsTransfer(fungibleTransfers, token, from, -amount.longValue());
return Collections.singletonList(new TokenTransferWrapper(NO_NFT_EXCHANGES, fungibleTransfers));
} else {
final List<SyntheticTxnFactory.NftExchange> nonFungibleTransfers = new ArrayList<>();
final var serialNumber = (BigInteger) decodedArguments.get(2);
nonFungibleTransfers.add(new SyntheticTxnFactory.NftExchange(serialNumber.longValue(), token, from, to));
return Collections.singletonList(new TokenTransferWrapper(nonFungibleTransfers, NO_FUNGIBLE_TRANSFERS));
}
}
use of com.esaulpaugh.headlong.abi.Tuple in project hedera-services by hashgraph.
the class DecodingFacade method decodeBalanceOf.
public BalanceOfWrapper decodeBalanceOf(final Bytes input, final UnaryOperator<byte[]> aliasResolver) {
final Tuple decodedArguments = decodeFunctionCall(input, BALANCE_OF_TOKEN_SELECTOR, BALANCE_OF_TOKEN_DECODER);
final var account = convertLeftPaddedAddressToAccountId((byte[]) decodedArguments.get(0), aliasResolver);
return new BalanceOfWrapper(account);
}
use of com.esaulpaugh.headlong.abi.Tuple in project hedera-services by hashgraph.
the class HapiContractCall method opBodyDef.
@Override
protected Consumer<TransactionBody.Builder> opBodyDef(HapiApiSpec spec) throws Throwable {
if (details.isPresent()) {
ActionableContractCall actionable = spec.registry().getActionableCall(details.get());
contract = actionable.getContract();
abi = actionable.getDetails().getAbi();
params = actionable.getDetails().getExampleArgs();
} else if (paramsFn.isPresent()) {
params = paramsFn.get().apply(spec);
}
byte[] callData;
if (explicitHexedParams.isPresent()) {
callData = explicitHexedParams.map(Supplier::get).map(CommonUtils::unhex).get();
} else {
final var paramsList = Arrays.asList(params);
final var tupleExist = paramsList.stream().anyMatch(p -> p instanceof Tuple || p instanceof Tuple[]);
if (tupleExist) {
callData = encodeParametersWithTuple(params);
} else {
callData = (!abi.equals(FALLBACK_ABI)) ? CallTransaction.Function.fromJsonInterface(abi).encode(params) : new byte[] {};
}
}
ContractCallTransactionBody opBody = spec.txns().<ContractCallTransactionBody, ContractCallTransactionBody.Builder>body(ContractCallTransactionBody.class, builder -> {
if (!tryAsHexedAddressIfLenMatches) {
builder.setContractID(spec.registry().getContractId(contract));
} else {
builder.setContractID(TxnUtils.asContractId(contract, spec));
}
builder.setFunctionParameters(ByteString.copyFrom(callData));
sentTinyHbars.ifPresent(builder::setAmount);
gas.ifPresent(builder::setGas);
});
return b -> b.setContractCall(opBody);
}
use of com.esaulpaugh.headlong.abi.Tuple in project hedera-services by hashgraph.
the class DecodingFacade method decodeAssociation.
public Association decodeAssociation(final Bytes input, final UnaryOperator<byte[]> aliasResolver) {
final Tuple decodedArguments = decodeFunctionCall(input, ASSOCIATE_TOKEN_SELECTOR, ASSOCIATE_TOKEN_DECODER);
final var accountID = convertLeftPaddedAddressToAccountId((byte[]) decodedArguments.get(0), aliasResolver);
final var tokenID = convertAddressBytesToTokenID((byte[]) decodedArguments.get(1));
return Association.singleAssociation(accountID, tokenID);
}
use of com.esaulpaugh.headlong.abi.Tuple in project hedera-services by hashgraph.
the class DecodingFacade method decodeTokenUriNFT.
public OwnerOfAndTokenURIWrapper decodeTokenUriNFT(final Bytes input) {
final Tuple decodedArguments = decodeFunctionCall(input, TOKEN_URI_NFT_SELECTOR, TOKEN_URI_NFT_DECODER);
final var tokenId = (BigInteger) decodedArguments.get(0);
return new OwnerOfAndTokenURIWrapper(tokenId.longValue());
}
Aggregations