AccountDeleteTransaction - Test specification
Description:
This test specification for AccountDeleteTransaction is to be one of many for testing the functionality of the Hedera SDKs. The SDK under test will use the language specific JSON-RPC server return responses back to the test driver.
Design:
Each test within the test specification is linked to one of the properties within AccountDeleteTransaction. Each property is tested with a mix of boundaries. The inputs for each test are a range of valid, minimum, maximum, negative and invalid values for the method. The expected response of a passed test can be a correct error response code or seen as the result of node queries. A successful transaction (the transaction reached consensus and was applied to state) can be determined by getting a TransactionReceipt or TransactionRecord, or can be determined by using queries such as AccountInfoQuery or AccountBalanceQuery and investigating for the required changes (creations, updates, etc.). The mirror node can also be used to determine if a transaction was successful via its rest API. Error codes are obtained from the response code proto files.
Transaction properties:
https://docs.hedera.com/hedera/sdks-and-apis/sdks/accounts-and-hbar/delete-an-account
CryptoDelete protobufs:
https://github.com/hashgraph/hedera-protobufs/blob/main/services/crypto_delete.proto
Response codes:
https://github.com/hashgraph/hedera-protobufs/blob/main/services/response_code.proto
Mirror Node APIs:
https://docs.hedera.com/hedera/sdks-and-apis/rest-api
JSON-RPC API Endpoint Documentation
Method Name
deleteAccount
Input Parameters
| Parameter Name | Type | Required/Optional | Description/Notes |
|---|---|---|---|
| deleteAccountId | string | optional | The ID of the account to delete. |
| transferAccountId | string | optional | The ID of the account to which to transfer remaining balances. |
| commonTransactionParams | json object | optional |
Output Parameters
| Parameter Name | Type | Description/Notes |
|---|---|---|
| status | string | The status of the submitted AccountDeleteTransaction (from a TransactionReceipt). |
Additional Notes
The tests contained in this specification will assume that a valid account was already successfully created. Assume that the account was created with default values, unless specified otherwise. Any <CREATED_ACCOUNT_ID> tag will be the account ID of this created account. Any <PRIVATE_KEY_OF_CREATED_ACCOUNT> is the DER-encoded hex string of the private key of the account.
Property Tests
Delete Account ID:
- The ID of the account to delete.
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Deletes an account with no transfer account | deleteAccountId=<CREATED_ACCOUNT_ID>, commonTransactionParams.signers=[<PRIVATE_KEY_OF_CREATED_ACCOUNT>] | The account deletion fails with an ACCOUNT_ID_DOES_NOT_EXIST response code from the network. | Y |
| 2 | Deletes an account with no delete account | transferAccountId=<OPERATOR_ACCOUNT_ID>, commonTransactionParams.signers=[<PRIVATE_KEY_OF_CREATED_ACCOUNT>] | The account deletion fails with an ACCOUNT_ID_DOES_NOT_EXIST response code from the network. | Y |
| 3 | Deletes an admin account | deleteAccountId="0.0.4", transferAccountId=<OPERATOR_ACCOUNT_ID>, commonTransactionParams.signers=[<PRIVATE_KEY_OF_CREATED_ACCOUNT>] | The account deletion fails with an ENTITY_NOT_ALLOWED_TO_DELETE response code from the network. | Y |
| 4 | Deletes an account that doesn't exist | deleteAccountId="123.456.789", transferAccountId=<OPERATOR_ACCOUNT_ID>, commonTransactionParams.signers=[<PRIVATE_KEY_OF_CREATED_ACCOUNT>] | The account deletion fails with an INVALID_ACCOUNT_ID response code from the network. | Y |
| 5 | Deletes an account that was already deleted | deleteAccountId=<DELETED_ACCOUNT_ID>, transferAccountId=<OPERATOR_ACCOUNT_ID>, commonTransactionParams.signers=[<PRIVATE_KEY_OF_DELETED_ACCOUNT>] | The account deletion fails with an ACCOUNT_DELETED response code from the network. | Y |
| 6 | Deletes an account without signing with the account's private key | deleteAccountId=<CREATED_ACCOUNT_ID>, transferAccountId=<OPERATOR_ACCOUNT_ID> | The account deletion fails with an INVALID_SIGNATURE response code from the network. | Y |
| 7 | Deletes an account but signs with an incorrect private key | deleteAccountId=<CREATED_ACCOUNT_ID>, transferAccountId=<OPERATOR_ACCOUNT_ID>, commonTransactionParams.signers=[<INCORRECT_VALID_PRIVATE_KEY>] | The account deletion fails with an INVALID_SIGNATURE response code from the network. | Y |
| 8 | Deletes an account with a token balance | deleteAccountId=<CREATED_ACCOUNT_ID>, transferAccountId=<OPERATOR_ACCOUNT_ID>, commonTransactionParams.signers=[<PRIVATE_KEY_OF_CREATED_ACCOUNT>] | The account deletion fails with an TRANSACTION_REQUIRES_ZERO_TOKEN_BALANCES response code from the network. | Y |
| 9 | Deletes a Treasury Account | deleteAccountId=<CREATED_ACCOUNT_ID>, transferAccountId=<OPERATOR_ACCOUNT_ID>, commonTransactionParams.signers=[<PRIVATE_KEY_OF_CREATED_ACCOUNT>] | The account deletion fails with an ACCOUNT_IS_TREASURY response code from the network. | Y |
JSON Request Example
{
"jsonrpc": "2.0",
"id": 64362,
"method": "deleteAccount",
"params": {
"deleteAccountId": "0.0.15432",
"commonTransactionParams": {
"signers": [
"302E020100300506032B657004220420DE6788D0A09F20DED806F446C02FB929D8CD8D17022374AFB3739A1D50BA72C8"
]
}
}
}
JSON Response Example
{
"jsonrpc": "2.0",
"id": 64362,
"result": {
"status": "SUCCESS"
}
}
Transfer Account ID:
- The ID of the account to which to transfer remaining balances.
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Deletes an account with a valid transfer account | deleteAccountId=<CREATED_ACCOUNT_ID>, transferAccountId=<OPERATOR_ACCOUNT_ID>, commonTransactionParams.signers=[<PRIVATE_KEY_OF_CREATED_ACCOUNT>] | The account deletion succeeds. | Y |
| 2 | Deletes an account with a transfer account that is the deleted account | deleteAccountId=<CREATED_ACCOUNT_ID>, transferAccountId=<CREATED_ACCOUNT_ID>, commonTransactionParams.signers=[<PRIVATE_KEY_OF_CREATED_ACCOUNT>] | The account deletion fails with an TRANSFER_ACCOUNT_SAME_AS_DELETE_ACCOUNT response code from the network. | Y |
| 3 | Deletes an account with a transfer account that is invalid/doesn't exist | deleteAccountId=<CREATED_ACCOUNT_ID>, transferAccountId="123.456.789", commonTransactionParams.signers=[<PRIVATE_KEY_OF_CREATED_ACCOUNT>] | The account deletion fails with an INVALID_TRANSFER_ACCOUNT_ID response code from the network. | Y |
| 4 | Deletes an account with a transfer account that is a deleted account | deleteAccountId=<CREATED_ACCOUNT_ID>, transferAccountId=<DELETED_ACCOUNT_ID>, commonTransactionParams.signers=[<PRIVATE_KEY_OF_CREATED_ACCOUNT>] | The account deletion fails with an ACCOUNT_DELETED response code from the network. | Y |
JSON Request Example
{
"jsonrpc": "2.0",
"id": 538,
"method": "deleteAccount",
"params": {
"deleteAccountId": "0.0.768",
"transferAccountId": "0.0.8831",
"commonTransactionParams": {
"signers": [
"302E020100300506032B657004220420DE6788D0A09F20DED806F446C02FB929D8CD8D17022374AFB3739A1D50BA72C8"
]
}
}
}
JSON Response Example
{
"jsonrpc": "2.0",
"id": 538,
"result": {
"status": "SUCCESS"
}
}