diff --git a/src/tck/include/account/params/TransferCryptoParams.h b/src/tck/include/account/params/TransferCryptoParams.h index 6848b7b57..3648ee3c7 100644 --- a/src/tck/include/account/params/TransferCryptoParams.h +++ b/src/tck/include/account/params/TransferCryptoParams.h @@ -2,8 +2,8 @@ #ifndef HIERO_TCK_CPP_TRANSFER_CRYPTO_PARAMS_H_ #define HIERO_TCK_CPP_TRANSFER_CRYPTO_PARAMS_H_ -#include "account/params/transfer/TransferParams.h" #include "common/CommonTransactionParams.h" +#include "common/transfer/TransferParams.h" #include "json/JsonUtils.h" #include @@ -17,7 +17,7 @@ namespace Hiero::TCK::AccountService struct TransferCryptoParams { /** - * The desired key for the account. + * The transfer information. */ std::optional> mTransfers; @@ -45,8 +45,8 @@ struct [[maybe_unused]] adl_serializer>( - jsonFrom, "transfers"); + params.mTransfers = + Hiero::TCK::getOptionalJsonParameter>(jsonFrom, "transfers"); params.mCommonTxParams = Hiero::TCK::getOptionalJsonParameter(jsonFrom, "commonTransactionParams"); } diff --git a/src/tck/include/account/params/transfer/HbarTransferParams.h b/src/tck/include/common/transfer/HbarTransferParams.h similarity index 87% rename from src/tck/include/account/params/transfer/HbarTransferParams.h rename to src/tck/include/common/transfer/HbarTransferParams.h index f1de1e332..0fd7acbda 100644 --- a/src/tck/include/account/params/transfer/HbarTransferParams.h +++ b/src/tck/include/common/transfer/HbarTransferParams.h @@ -10,7 +10,7 @@ #include #include -namespace Hiero::TCK::AccountService +namespace Hiero::TCK { /** * Struct that contains the parameters of an Hbar transfer. @@ -33,7 +33,7 @@ struct HbarTransferParams std::string mAmount; }; -} // namespace Hiero::TCK::AccountService +} // namespace Hiero::TCK namespace nlohmann { @@ -41,7 +41,7 @@ namespace nlohmann * JSON serializer template specialization required to convert HbarTransferParams arguments properly. */ template<> -struct [[maybe_unused]] adl_serializer +struct [[maybe_unused]] adl_serializer { /** * Convert a JSON object to a HbarTransferParams. @@ -49,7 +49,7 @@ struct [[maybe_unused]] adl_serializer(jsonFrom, "accountId"); params.mEvmAddress = Hiero::TCK::getOptionalJsonParameter(jsonFrom, "evmAddress"); diff --git a/src/tck/include/account/params/transfer/NftTransferParams.h b/src/tck/include/common/transfer/NftTransferParams.h similarity index 85% rename from src/tck/include/account/params/transfer/NftTransferParams.h rename to src/tck/include/common/transfer/NftTransferParams.h index 20d31a3db..84478007c 100644 --- a/src/tck/include/account/params/transfer/NftTransferParams.h +++ b/src/tck/include/common/transfer/NftTransferParams.h @@ -7,7 +7,7 @@ #include #include -namespace Hiero::TCK::AccountService +namespace Hiero::TCK { /** * Struct that contains the parameters of an NFT transfer. @@ -35,7 +35,7 @@ struct NftTransferParams std::string mSerialNumber; }; -} // namespace Hiero::TCK::AccountService +} // namespace Hiero::TCK namespace nlohmann { @@ -43,7 +43,7 @@ namespace nlohmann * JSON serializer template specialization required to convert NftTransferParams arguments properly. */ template<> -struct [[maybe_unused]] adl_serializer +struct [[maybe_unused]] adl_serializer { /** * Convert a JSON object to a NftTransferParams. @@ -51,7 +51,7 @@ struct [[maybe_unused]] adl_serializer(jsonFrom, "senderAccountId"); params.mReceiverAccountId = Hiero::TCK::getRequiredJsonParameter(jsonFrom, "receiverAccountId"); diff --git a/src/tck/include/account/params/transfer/TokenTransferParams.h b/src/tck/include/common/transfer/TokenTransferParams.h similarity index 84% rename from src/tck/include/account/params/transfer/TokenTransferParams.h rename to src/tck/include/common/transfer/TokenTransferParams.h index 7d08c5c78..9eadfd55e 100644 --- a/src/tck/include/account/params/transfer/TokenTransferParams.h +++ b/src/tck/include/common/transfer/TokenTransferParams.h @@ -7,7 +7,7 @@ #include #include -namespace Hiero::TCK::AccountService +namespace Hiero::TCK { /** * Struct that contains the parameters of a token transfer. @@ -35,7 +35,7 @@ struct TokenTransferParams std::optional mDecimals; }; -} // namespace Hiero::TCK::AccountService +} // namespace Hiero::TCK namespace nlohmann { @@ -43,7 +43,7 @@ namespace nlohmann * JSON serializer template specialization required to convert TokenTransferParams arguments properly. */ template<> -struct [[maybe_unused]] adl_serializer +struct [[maybe_unused]] adl_serializer { /** * Convert a JSON object to a TokenTransferParams. @@ -51,7 +51,7 @@ struct [[maybe_unused]] adl_serializer(jsonFrom, "accountId"); params.mTokenId = Hiero::TCK::getRequiredJsonParameter(jsonFrom, "tokenId"); diff --git a/src/tck/include/account/params/transfer/TransferParams.h b/src/tck/include/common/transfer/TransferParams.h similarity index 73% rename from src/tck/include/account/params/transfer/TransferParams.h rename to src/tck/include/common/transfer/TransferParams.h index 8a0e6010f..d9bac20bf 100644 --- a/src/tck/include/account/params/transfer/TransferParams.h +++ b/src/tck/include/common/transfer/TransferParams.h @@ -2,16 +2,16 @@ #ifndef HIERO_TCK_CPP_TRANSFER_PARAMS_H_ #define HIERO_TCK_CPP_TRANSFER_PARAMS_H_ -#include "account/params/transfer/HbarTransferParams.h" -#include "account/params/transfer/NftTransferParams.h" -#include "account/params/transfer/TokenTransferParams.h" +#include "common/transfer/HbarTransferParams.h" +#include "common/transfer/NftTransferParams.h" +#include "common/transfer/TokenTransferParams.h" #include "json/JsonErrorType.h" #include "json/JsonRpcException.h" #include "json/JsonUtils.h" #include -namespace Hiero::TCK::AccountService +namespace Hiero::TCK { /** * Struct that contains the parameters of a transfer. @@ -39,7 +39,7 @@ struct TransferParams std::optional mApproved; }; -} // namespace Hiero::TCK::AccountService +} // namespace Hiero::TCK namespace nlohmann { @@ -47,7 +47,7 @@ namespace nlohmann * JSON serializer template specialization required to convert TransferParams arguments properly. */ template<> -struct [[maybe_unused]] adl_serializer +struct [[maybe_unused]] adl_serializer { /** * Convert a JSON object to a TransferParams. @@ -55,13 +55,11 @@ struct [[maybe_unused]] adl_serializer(jsonFrom, "hbar"); - params.mToken = - Hiero::TCK::getOptionalJsonParameter(jsonFrom, "token"); - params.mNft = Hiero::TCK::getOptionalJsonParameter(jsonFrom, "nft"); + params.mHbar = Hiero::TCK::getOptionalJsonParameter(jsonFrom, "hbar"); + params.mToken = Hiero::TCK::getOptionalJsonParameter(jsonFrom, "token"); + params.mNft = Hiero::TCK::getOptionalJsonParameter(jsonFrom, "nft"); params.mApproved = Hiero::TCK::getOptionalJsonParameter(jsonFrom, "approved"); // Only one allowance type should be allowed. diff --git a/src/tck/include/token/TokenService.h b/src/tck/include/token/TokenService.h index 954835b8d..6e96ded88 100644 --- a/src/tck/include/token/TokenService.h +++ b/src/tck/include/token/TokenService.h @@ -9,6 +9,7 @@ namespace Hiero::TCK::TokenService /** * Forward declarations. */ +struct AirdropTokenParams; struct AssociateTokenParams; struct BurnTokenParams; struct CreateTokenParams; @@ -25,6 +26,14 @@ struct UpdateTokenFeeScheduleParams; struct UpdateTokenParams; struct WipeTokenParams; +/** + * Airdrop tokens to accounts. + * + * @params params The parameters to use to airdrop tokens. + * @return A JSON response containing the status of the token airdrop. + */ +nlohmann::json airdropToken(const AirdropTokenParams& params); + /** * Associate an account with tokens. * diff --git a/src/tck/include/token/params/AirdropTokenParams.h b/src/tck/include/token/params/AirdropTokenParams.h new file mode 100644 index 000000000..3bfdd8d8c --- /dev/null +++ b/src/tck/include/token/params/AirdropTokenParams.h @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: Apache-2.0 +#ifndef HIERO_TCK_CPP_AIRDROP_TOKEN_PARAMS_H_ +#define HIERO_TCK_CPP_AIRDROP_TOKEN_PARAMS_H_ + +#include "common/CommonTransactionParams.h" +#include "common/transfer/TransferParams.h" +#include "json/JsonErrorType.h" +#include "json/JsonRpcException.h" +#include "json/JsonUtils.h" + +#include +#include + +namespace Hiero::TCK::TokenService +{ +/** + * Struct to hold the arguments for a `airdropToken` JSON-RPC method call. + */ +struct AirdropTokenParams +{ + /** + * The airdrop information. + */ + std::optional> mTokenTransfers; + + /** + * Any parameters common to all transaction types. + */ + std::optional mCommonTxParams; +}; + +} // namespace Hiero::TCK::TokenService + +namespace nlohmann +{ +/** + * JSON serializer template specialization required to convert AirdropTokenParams arguments properly. + */ +template<> +struct [[maybe_unused]] adl_serializer +{ + /** + * Convert a JSON object to a AirdropTokenParams. + * + * @param jsonFrom The JSON object with which to fill the AirdropTokenParams. + * @param params The AirdropTokenParams to fill with the JSON object. + */ + static void from_json(const json& jsonFrom, Hiero::TCK::TokenService::AirdropTokenParams& params) + { + params.mTokenTransfers = + Hiero::TCK::getOptionalJsonParameter>(jsonFrom, "tokenTransfers"); + + // Hbar transfer information is not allowed and calls for an INVALID_PARAMS response. + if (params.mTokenTransfers.has_value()) + { + for (const Hiero::TCK::TransferParams& transfer : params.mTokenTransfers.value()) + { + if (transfer.mHbar.has_value()) + { + throw Hiero::TCK::JsonRpcException(Hiero::TCK::JsonErrorType::INVALID_PARAMS, + "invalid parameters: Hbar transfers are NOT allowed as part of a token" + "airdrop."); + } + } + } + + params.mCommonTxParams = + Hiero::TCK::getOptionalJsonParameter(jsonFrom, "commonTransactionParams"); + } +}; + +} // namespace nlohmann + +#endif // HIERO_TCK_CPP_AIRDROP_TOKEN_PARAMS_H_ diff --git a/src/tck/src/TckServer.cc b/src/tck/src/TckServer.cc index af079b000..0f9a9fd82 100644 --- a/src/tck/src/TckServer.cc +++ b/src/tck/src/TckServer.cc @@ -12,6 +12,7 @@ #include "key/params/GenerateKeyParams.h" #include "sdk/params/ResetParams.h" #include "sdk/params/SetupParams.h" +#include "token/params/AirdropTokenParams.h" #include "token/params/AssociateTokenParams.h" #include "token/params/BurnTokenParams.h" #include "token/params/CreateTokenParams.h" @@ -370,6 +371,8 @@ template TckServer::MethodHandle TckServer::getHandle( template TckServer::MethodHandle TckServer::getHandle( nlohmann::json (*method)(const SdkClient::SetupParams&)); +template TckServer::MethodHandle TckServer::getHandle( + nlohmann::json (*method)(const TokenService::AirdropTokenParams&)); template TckServer::MethodHandle TckServer::getHandle( nlohmann::json (*method)(const TokenService::AssociateTokenParams&)); template TckServer::MethodHandle TckServer::getHandle( diff --git a/src/tck/src/account/AccountService.cc b/src/tck/src/account/AccountService.cc index 6329b38c7..64471f311 100644 --- a/src/tck/src/account/AccountService.cc +++ b/src/tck/src/account/AccountService.cc @@ -8,8 +8,8 @@ #include "account/params/UpdateAccountParams.h" #include "account/params/allowance/AllowanceParams.h" #include "account/params/allowance/RemoveAllowanceParams.h" -#include "account/params/transfer/TransferParams.h" #include "common/CommonTransactionParams.h" +#include "common/transfer/TransferParams.h" #include "key/KeyService.h" #include "sdk/SdkClient.h" diff --git a/src/tck/src/main.cc b/src/tck/src/main.cc index 3d7465ac0..d5c6b8084 100644 --- a/src/tck/src/main.cc +++ b/src/tck/src/main.cc @@ -31,6 +31,7 @@ int main(int argc, char** argv) tckServer.add("updateAccount", tckServer.getHandle(&AccountService::updateAccount)); // Add the TokenService functions. + tckServer.add("airdropToken", tckServer.getHandle(&TokenService::airdropToken)); tckServer.add("associateToken", tckServer.getHandle(&TokenService::associateToken)); tckServer.add("burnToken", tckServer.getHandle(&TokenService::burnToken)); tckServer.add("createToken", tckServer.getHandle(&TokenService::createToken)); diff --git a/src/tck/src/token/TokenService.cc b/src/tck/src/token/TokenService.cc index 5177a33c2..96ccf1dd5 100644 --- a/src/tck/src/token/TokenService.cc +++ b/src/tck/src/token/TokenService.cc @@ -2,6 +2,7 @@ #include "token/TokenService.h" #include "key/KeyService.h" #include "sdk/SdkClient.h" +#include "token/params/AirdropTokenParams.h" #include "token/params/AssociateTokenParams.h" #include "token/params/BurnTokenParams.h" #include "token/params/CreateTokenParams.h" @@ -22,6 +23,7 @@ #include #include +#include #include #include #include @@ -55,6 +57,79 @@ namespace Hiero::TCK::TokenService { +//----- +nlohmann::json airdropToken(const AirdropTokenParams& params) +{ + TokenAirdropTransaction tokenAirdropTransaction; + tokenAirdropTransaction.setGrpcDeadline(SdkClient::DEFAULT_TCK_REQUEST_TIMEOUT); + + if (params.mTokenTransfers.has_value()) + { + for (const TransferParams& txParams : params.mTokenTransfers.value()) + { + const bool approved = txParams.mApproved.has_value() && txParams.mApproved.value(); + + if (txParams.mToken.has_value()) + { + const AccountId accountId = AccountId::fromString(txParams.mToken->mAccountId); + const TokenId tokenId = TokenId::fromString(txParams.mToken->mTokenId); + const auto amount = internal::EntityIdHelper::getNum(txParams.mToken->mAmount); + + if (txParams.mToken->mDecimals.has_value()) + { + const uint32_t decimals = txParams.mToken->mDecimals.value(); + if (approved) + { + tokenAirdropTransaction.addApprovedTokenTransferWithDecimals(tokenId, accountId, amount, decimals); + } + else + { + tokenAirdropTransaction.addTokenTransferWithDecimals(tokenId, accountId, amount, decimals); + } + } + else + { + if (approved) + { + tokenAirdropTransaction.addApprovedTokenTransfer(tokenId, accountId, amount); + } + else + { + tokenAirdropTransaction.addTokenTransfer(tokenId, accountId, amount); + } + } + } + else + { + const AccountId senderAccountId = AccountId::fromString(txParams.mNft->mSenderAccountId); + const AccountId receiverAccountId = AccountId::fromString(txParams.mNft->mReceiverAccountId); + const NftId nftId = NftId(TokenId::fromString(txParams.mNft->mTokenId), + internal::EntityIdHelper::getNum(txParams.mNft->mSerialNumber)); + + if (approved) + { + tokenAirdropTransaction.addApprovedNftTransfer(nftId, senderAccountId, receiverAccountId); + } + else + { + tokenAirdropTransaction.addNftTransfer(nftId, senderAccountId, receiverAccountId); + } + } + } + } + + if (params.mCommonTxParams.has_value()) + { + params.mCommonTxParams->fillOutTransaction(tokenAirdropTransaction, SdkClient::getClient()); + } + + return { + {"status", + gStatusToString.at( + tokenAirdropTransaction.execute(SdkClient::getClient()).getReceipt(SdkClient::getClient()).mStatus)} + }; +} + //----- nlohmann::json associateToken(const AssociateTokenParams& params) {