diff --git a/src/tck/include/token/TokenService.h b/src/tck/include/token/TokenService.h index 832e72a5..23c68fd2 100644 --- a/src/tck/include/token/TokenService.h +++ b/src/tck/include/token/TokenService.h @@ -12,6 +12,7 @@ namespace Hiero::TCK::TokenService struct AssociateTokenParams; struct CreateTokenParams; struct DeleteTokenParams; +struct DissociateTokenParams; struct PauseTokenParams; struct UnpauseTokenParams; struct UpdateTokenFeeScheduleParams; @@ -41,6 +42,14 @@ nlohmann::json createToken(const CreateTokenParams& params); */ nlohmann::json deleteToken(const DeleteTokenParams& params); +/** + * Dissociate an account from tokens. + * + * @param params The parameters to use to dissociate the account. + * @return A JSON response containing the status of the account dissociation. + */ +nlohmann::json dissociateToken(const DissociateTokenParams& params); + /** * Pause a token. * diff --git a/src/tck/include/token/params/DeleteTokenParams.h b/src/tck/include/token/params/DeleteTokenParams.h index d1ab7ccf..8f30ae6f 100644 --- a/src/tck/include/token/params/DeleteTokenParams.h +++ b/src/tck/include/token/params/DeleteTokenParams.h @@ -27,7 +27,7 @@ struct DeleteTokenParams std::optional mCommonTxParams; }; -} // namespace Hedera::TCK::TokenService +} // namespace Hiero::TCK::TokenService namespace nlohmann { diff --git a/src/tck/include/token/params/DissociateTokenParams.h b/src/tck/include/token/params/DissociateTokenParams.h new file mode 100644 index 00000000..2a696d40 --- /dev/null +++ b/src/tck/include/token/params/DissociateTokenParams.h @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: Apache-2.0 +#ifndef HIERO_TCK_CPP_DISSOCIATE_TOKEN_PARAMS_H_ +#define HIERO_TCK_CPP_DISSOCIATE_TOKEN_PARAMS_H_ + +#include "common/CommonTransactionParams.h" +#include "json/JsonUtils.h" + +#include +#include +#include + +namespace Hiero::TCK::TokenService +{ +/** + * Struct to hold the arguments for a `dissociateToken` JSON-RPC method call. + */ +struct DissociateTokenParams +{ + /** + * The ID of the account from which to dissociate the token. + */ + std::optional mAccountId; + + /** + * The IDs of the tokens to dissociate. + */ + std::optional> mTokenIds; + + /** + * Any parameters common to all transaction types. + */ + std::optional mCommonTxParams; +}; + +} // namespace Hiero::TCK::TokenService + +namespace nlohmann +{ +/** + * JSON serializer template specialization required to convert DissociateTokenParams arguments properly. + */ +template<> +struct [[maybe_unused]] adl_serializer +{ + /** + * Convert a JSON object to a DissociateTokenParams. + * + * @param jsonFrom The JSON object with which to fill the DissociateTokenParams. + * @param params The DissociateTokenParams to fill with the JSON object. + */ + static void from_json(const json& jsonFrom, Hiero::TCK::TokenService::DissociateTokenParams& params) + { + params.mAccountId = Hiero::TCK::getOptionalJsonParameter(jsonFrom, "accountId"); + params.mTokenIds = Hiero::TCK::getOptionalJsonParameter>(jsonFrom, "tokenIds"); + params.mCommonTxParams = + Hiero::TCK::getOptionalJsonParameter(jsonFrom, "commonTransactionParams"); + } +}; + +} // namespace nlohmann + +#endif // HIERO_TCK_CPP_DISSOCIATE_TOKEN_PARAMS_H_ diff --git a/src/tck/src/TckServer.cc b/src/tck/src/TckServer.cc index a76cb258..662330d9 100644 --- a/src/tck/src/TckServer.cc +++ b/src/tck/src/TckServer.cc @@ -12,6 +12,7 @@ #include "token/params/AssociateTokenParams.h" #include "token/params/CreateTokenParams.h" #include "token/params/DeleteTokenParams.h" +#include "token/params/DissociateTokenParams.h" #include "token/params/PauseTokenParams.h" #include "token/params/UnpauseTokenParams.h" #include "token/params/UpdateTokenFeeScheduleParams.h" @@ -359,6 +360,8 @@ template TckServer::MethodHandle TckServer::getHandle( nlohmann::json (*method)(const TokenService::DeleteTokenParams&)); +template TckServer::MethodHandle TckServer::getHandle( + nlohmann::json (*method)(const TokenService::DissociateTokenParams&)); template TckServer::MethodHandle TckServer::getHandle( nlohmann::json (*method)(const TokenService::PauseTokenParams&)); template TckServer::MethodHandle TckServer::getHandle( diff --git a/src/tck/src/main.cc b/src/tck/src/main.cc index f6e29a8c..0333cc1d 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("associateToken", tckServer.getHandle(&TokenService::associateToken)); tckServer.add("createToken", tckServer.getHandle(&TokenService::createToken)); tckServer.add("deleteToken", tckServer.getHandle(&TokenService::deleteToken)); + tckServer.add("dissociateToken", tckServer.getHandle(&TokenService::dissociateToken)); tckServer.add("pauseToken", tckServer.getHandle(&TokenService::pauseToken)); tckServer.add("unpauseToken", tckServer.getHandle(&TokenService::unpauseToken)); tckServer.add("updateTokenFeeSchedule", tckServer.getHandle(&TokenService::updateTokenFeeSchedule)); diff --git a/src/tck/src/token/TokenService.cc b/src/tck/src/token/TokenService.cc index 93e04ada..d85879a5 100644 --- a/src/tck/src/token/TokenService.cc +++ b/src/tck/src/token/TokenService.cc @@ -5,6 +5,7 @@ #include "token/params/AssociateTokenParams.h" #include "token/params/CreateTokenParams.h" #include "token/params/DeleteTokenParams.h" +#include "token/params/DissociateTokenParams.h" #include "token/params/PauseTokenParams.h" #include "token/params/UnpauseTokenParams.h" #include "token/params/UpdateTokenFeeScheduleParams.h" @@ -17,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -245,6 +247,40 @@ nlohmann::json deleteToken(const DeleteTokenParams& params) }; } +//----- +nlohmann::json dissociateToken(const DissociateTokenParams& params) +{ + TokenDissociateTransaction tokenDissociateTransaction; + tokenDissociateTransaction.setGrpcDeadline(std::chrono::seconds(SdkClient::DEFAULT_TCK_REQUEST_TIMEOUT)); + + if (params.mAccountId.has_value()) + { + tokenDissociateTransaction.setAccountId(AccountId::fromString(params.mAccountId.value())); + } + + if (params.mTokenIds.has_value()) + { + std::vector tokenIds; + for (const std::string& tokenId : params.mTokenIds.value()) + { + tokenIds.push_back(TokenId::fromString(tokenId)); + } + + tokenDissociateTransaction.setTokenIds(tokenIds); + } + + if (params.mCommonTxParams.has_value()) + { + params.mCommonTxParams->fillOutTransaction(tokenDissociateTransaction, SdkClient::getClient()); + } + + return { + {"status", + gStatusToString.at( + tokenDissociateTransaction.execute(SdkClient::getClient()).getReceipt(SdkClient::getClient()).mStatus)} + }; +} + //----- nlohmann::json pauseToken(const PauseTokenParams& params) {