TokenUpdateTransaction - Test specification

Description:

This test specification for TokenUpdateTransaction 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 TokenUpdateTransaction. 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 TokenInfoQuery or TokenBalanceQuery 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/token-service/update-a-token

TokenUpdate protobufs:

https://github.com/hashgraph/hedera-protobufs/blob/main/services/token_update.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

updateToken

Input Parameters

Parameter Name Type Required/Optional Description/Notes
tokenId string optional The ID of the token to update.
symbol string optional The desired new symbol of the token.
name string optional The desired new name of the token.
treasuryAccountId string optional The ID of the desired new treasury account of the token.
adminKey string optional The desired new admin key of the token. DER-encoded hex string representation for private or public keys. Keylists and threshold keys are the hex of the serialized protobuf bytes.
kycKey string optional The desired new KYC key of the token. DER-encoded hex string representation for private or public keys. Keylists and threshold keys are the hex of the serialized protobuf bytes.
freezeKey string optional The desired new freeze key of the token. DER-encoded hex string representation for private or public keys. Keylists and threshold keys are the hex of the serialized protobuf bytes.
wipeKey string optional The desired new wipe key of the token. DER-encoded hex string representation for private or public keys. Keylists and threshold keys are the hex of the serialized protobuf bytes.
supplyKey string optional The desired new supply key of the token. DER-encoded hex string representation for private or public keys. Keylists and threshold keys are the hex of the serialized protobuf bytes.
autoRenewAccountId string optional The ID of the desired account to now pay auto-renewal fees.
autoRenewPeriod string optional The desired new interval of time for which to charge the auto-renew account to renew the token. Units of seconds.
expirationTime string optional The desired new expiration time of the token. Epoch time in seconds.
memo string optional The desired new memo of the token.
feeScheduleKey string optional The desired new fee schedule key of the token. DER-encoded hex string representation for private or public keys. Keylists and threshold keys are the hex of the serialized protobuf bytes.
pauseKey string optional The desired new pause key of the token. DER-encoded hex string representation for private or public keys. Keylists and threshold keys are the hex of the serialized protobuf bytes.
metadata string optional The desired new metadata of the token. Hex-encoded bytes of the metadata
metadataKey string optional The desired new metadata key of the token. DER-encoded hex string representation for private or public keys. Keylists and threshold keys are the hex of the serialized protobuf bytes.
commonTransactionParams json object optional

Output Parameters

Parameter Name Type Description/Notes
status string The status of the submitted TokenUpdateTransaction (from a TransactionReceipt).

Additional Notes

The tests contained in this specification will assume that two valid token were already successfully created. The first token will be a token that was created with the values name="testname", symbol="testsymbol", treasuryAccountId=<OPERATOR_ACCOUNT_ID>, initialSupply=1000000, tokenType="ft". The second will be another token created with the same values and additionally a valid admin key, KYC key, freeze key, wipe key, supply key, fee schedule key, pause key, and metadata key. Any <CREATED_IMMUTABLE_TOKEN_ID> tag will be the ID of the first token, and any <CREATED_MUTABLE_TOKEN_ID> tag will be the ID of the second token. Any <CREATED_MUTABLE_TOKEN_ADMIN_KEY> is the DER-encoded hex string of the admin key of the second token.

Property Tests

Token ID:

  • The ID of the token to update.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with no updates tokenId=<CREATED_IMMUTABLE_TOKEN_ID> The token update succeeds. Y
2 Updates a mutable token with no updates tokenId=<CREATED_MUTABLE_TOKEN_ID> The token update succeeds. Y
3 Updates a token with no token ID The token update fails with an INVALID_TOKEN_ID response code from the network. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 99232,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.53729"
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 99232,
  "result": {
    "status": "SUCCESS"
  }
}

Symbol:

  • The desired new symbol for the token.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a symbol tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, symbol="t" The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a symbol that is the minimum length tokenId=<CREATED_MUTABLE_TOKEN_ID>, symbol="t", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's symbol equals "t". Y
3 Updates a mutable token with a symbol that is empty tokenId=<CREATED_MUTABLE_TOKEN_ID>, symbol="", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's symbol equals "testsymbol". Y
4 Updates a mutable token with a symbol that is the maximum length tokenId=<CREATED_MUTABLE_TOKEN_ID>, symbol="This is a really long symbol but it is still valid because it is 100 characters exactly on the money", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's symbol equals "This is a really long symbol but it is still valid because it is 100 characters exactly on the money". Y
5 Updates a mutable token with a symbol that exceeds the maximum length tokenId=<CREATED_MUTABLE_TOKEN_ID>, symbol="This is a long symbol that is not valid because it exceeds 100 characters and it should fail the test", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with a TOKEN_SYMBOL_TOO_LONG response code from the network. Y
6 Updates a mutable token with a valid symbol without signing with the token's admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, symbol="t" The token update fails with a INVALID_SIGNATURE response code from the network. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 641,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.7895",
    "symbol": "symbol"
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 641,
  "result": {
    "status": "SUCCESS"
  }
}

Name:

  • The desired new name for the token.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a name tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, name="t" The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a name that is the minimum length tokenId=<CREATED_MUTABLE_TOKEN_ID>, name="t", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's name equals "t". Y
3 Updates a mutable token with a name that is empty tokenId=<CREATED_MUTABLE_TOKEN_ID>, name="", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's name equals "testname". Y
4 Updates a mutable token with a name that is the maximum length tokenId=<CREATED_MUTABLE_TOKEN_ID>, name="This is a really long name but it is still valid because it is 100 characters exactly on the money!!", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's name equals "This is a really long name but it is still valid because it is 100 characters exactly on the money!!". Y
5 Updates a mutable token with a name that exceeds the maximum length tokenId=<CREATED_MUTABLE_TOKEN_ID>, name="This is a long name that is not valid because it exceeds 100 characters and it should fail the test!!", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with a TOKEN_NAME_TOO_LONG response code from the network. Y
6 Updates a mutable token with a valid name without signing with the token's admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, name="t" The token update fails with a INVALID_SIGNATURE response code from the network. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 8895,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.7895",
    "name": "name"
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 8895,
  "result": {
    "status": "SUCCESS"
  }
}

Treasury Account ID:

  • The desired new ID of the account that will act as the token's treasury.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a treasury account tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, treasuryAccountId=<OPERATOR_ACCOUNT_ID> The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a treasury account tokenId=<CREATED_MUTABLE_TOKEN_ID>, treasuryAccountId=<VALID_ACCOUNT_ID>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>, <ACCOUNT_PRIVATE_KEY>] The token update succeeds, the token has <VALID_ACCOUNT_ID> as its treasury account, <VALID_ACCOUNT_ID> contains 1,000,000 of the token, and <OPERATOR_ACCOUNT_ID> contains 0 of the token. Y
3 Updates a mutable token with a treasury account without signing with the account's private key tokenId=<CREATED_MUTABLE_TOKEN_ID>, treasuryAccountId=<VALID_ACCOUNT_ID>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_SIGNATURE response code from the network. Y
4 Updates a mutable token with a treasury account that doesn't exist tokenId=<CREATED_MUTABLE_TOKEN_ID>, treasuryAccountId="123.456.789", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_ACCOUNT_ID response code from the network. Y
5 Updates a mutable token with a treasury account that is deleted tokenId=<CREATED_MUTABLE_TOKEN_ID>, treasuryAccountId=<DELETED_ACCOUNT_ID>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>, <DELETED_ACCOUNT_PRIVATE_KEY>] The token update fails with an ACCOUNT_DELETED response code from the network. Y
6 Updates a mutable token with a treasury account without signing with the token's admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, treasuryAccountId=<VALID_ACCOUNT_ID>, commonTransactionParams.signers=[<ACCOUNT_PRIVATE_KEY>] The token update fails with an INVALID_SIGNATURE response code from the network. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 6432,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.5211",
    "treasuryAccountId": "0.0.53725"
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 6432,
  "result": {
    "status": "SUCCESS"
  }
}

Admin Key:

  • The desired new key which can perform administrative operations (update/delete) on the token.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a valid key as its admin key tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, adminKey=<VALID_KEY> The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a valid ED25519 public key as its admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, adminKey=<VALID_ED25519_PUBLIC_KEY>, commonTransactionParams.signers=[<CORRESPONDING_VALID_ED25519_PRIVATE_KEY>, <CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ED25519 public key as its admin key. Y
3 Updates a mutable token with a valid ECDSAsecp256k1 public key as its admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, adminKey=<VALID_ECDSA_SECP256K1_PUBLIC_KEY>, commonTransactionParams.signers=[<CORRESPONDING_VALID_ED25519_PRIVATE_KEY>, <CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ECDSAsecp256k1 public key as its admin key. Y
4 Updates a mutable token with a valid ED25519 private key as its admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, adminKey=<VALID_ED25519_PRIVATE_KEY>, commonTransactionParams.signers=[<VALID_ED25519_PRIVATE_KEY>, <CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ED25519 public key as its admin key. Y
5 Updates a mutable token with a valid ECDSAsecp256k1 private key as its admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, adminKey=<VALID_ECDSA_SECP256K1_PRIVATE_KEY>, commonTransactionParams.signers=[<VALID_ECDSA_SECP256K1_PRIVATE_KEY>, <CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ECDSAsecp256k1 public key as its admin key. Y
6 Updates a mutable token with a valid KeyList of ED25519 and ECDSAsecp256k1 private and public keys as its admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, adminKey=<VALID_KEYLIST>, commonTransactionParams.signers=[<KEYS_IN_KEYLIST>, <CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new KeyList as its admin key. Y
7 Updates a mutable token with a valid KeyList of nested Keylists (three levels) as its admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, adminKey=<VALID_NESTED_KEYLIST>, commonTransactionParams.signers=[<KEYS_IN_NESTED_KEYLIST>, <CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new nested KeyList as its admin key. Y
8 Updates a mutable token with a valid ThresholdKey of ED25519 and ECDSAsecp256k1 private and public keys as its admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, adminKey=<VALID_THRESHOLD_KEY>, commonTransactionParams.signers=[<KEYS_IN_THRESHOLD_KEY>, <CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ThresholdKey as its admin key. Y
9 Updates a mutable token with a valid key as its admin key but doesn't sign with it tokenId=<CREATED_MUTABLE_TOKEN_ID>, adminKey=<VALID_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_SIGNATURE response code from the network. Y
10 Updates a mutable token with an invalid key as its admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, adminKey=<INVALID_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an SDK internal error. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.6438",
    "adminKey": "302a300506032b6570032100e9a0f9c81b3a2bb81a4af5fe05657aa849a3b9b0705da1fb52f331f42cf4b496",
    "commonTransactionParams": {
      "signers": [
        "302e020100300506032b65700422042031f8eb3e77a04ebe599c51570976053009e619414f26bdd39676a5d3b2782a1d"
      ]
    }
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

KYC Key:

  • The desired new key which can grant or revoke KYC operations on an account for the token's transactions.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a valid key as its KYC key tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, kycKey=<VALID_KEY> The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a valid ED25519 public key as its KYC key tokenId=<CREATED_MUTABLE_TOKEN_ID>, kycKey=<VALID_ED25519_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ED25519 public key as its KYC key. Y
3 Updates a mutable token with a valid ECDSAsecp256k1 public key as its KYC key tokenId=<CREATED_MUTABLE_TOKEN_ID>, kycKey=<VALID_ECDSA_SECP256K1_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ECDSAsecp256k1 public key as its KYC key. Y
4 Updates a mutable token with a valid ED25519 private key as its KYC key tokenId=<CREATED_MUTABLE_TOKEN_ID>, kycKey=<VALID_ED25519_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ED25519 public key as its KYC key. Y
5 Updates a mutable token with a valid ECDSAsecp256k1 private key as its KYC key tokenId=<CREATED_MUTABLE_TOKEN_ID>, kycKey=<VALID_ECDSA_SECP256K1_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ECDSAsecp256k1 public key as its KYC key. Y
6 Updates a mutable token with a valid KeyList of ED25519 and ECDSAsecp256k1 private and public keys as its KYC key tokenId=<CREATED_MUTABLE_TOKEN_ID>, kycKey=<VALID_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new KeyList as its KYC key. Y
7 Updates a mutable token with a valid KeyList of nested Keylists (three levels) as its KYC key tokenId=<CREATED_MUTABLE_TOKEN_ID>, kycKey=<VALID_NESTED_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new nested KeyList as its KYC key. Y
8 Updates a mutable token with a valid ThresholdKey of ED25519 and ECDSAsecp256k1 private and public keys as its KYC key tokenId=<CREATED_MUTABLE_TOKEN_ID>, kycKey=<VALID_THRESHOLD_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ThresholdKey as its KYC key. Y
9 Updates a mutable token with an empty KeyList as its KYC key tokenId=<CREATED_MUTABLE_TOKEN_ID>, kycKey=<EMPTY_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token no longer has a KCY key. Y
10 Updates a mutable token that doesn't have a KYC key with a valid key as its KYC key tokenId=<VALID_TOKEN_ID_WITHOUT_KYC_KEY>, kycKey=<VALID_KEY>, commonTransactionParams.signers=[<ADMIN_KEY_OF_VALID_TOKEN_WITHOUT_KYC_KEY>] The token update fails with an TOKEN_HAS_NO_KYC_KEY response code from the network. Y
11 Updates a mutable token with an invalid key as its KYC key tokenId=<CREATED_MUTABLE_TOKEN_ID>, kycKey=<INVALID_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an SDK internal error. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.382",
    "kycKey": "302a300506032b6570032100e9a0f9c81b3a2bb81a4af5fe05657aa849a3b9b0705da1fb52f331f42cf4b496",
    "commonTransactionParams": {
      "signers": [
        "302e020100300506032b65700422042031f8eb3e77a04ebe599c51570976053009e619414f26bdd39676a5d3b2782a1d"
      ]
    }
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Freeze Key:

  • The desired new key which can freeze or unfreeze an account for the token's transactions.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a valid key as its freeze key tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, freezeKey=<VALID_KEY> The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a valid ED25519 public key as its freeze key tokenId=<CREATED_MUTABLE_TOKEN_ID>, freezeKey=<VALID_ED25519_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ED25519 public key as its freeze key. Y
3 Updates a mutable token with a valid ECDSAsecp256k1 public key as its freeze key tokenId=<CREATED_MUTABLE_TOKEN_ID>, freezeKey=<VALID_ECDSA_SECP256K1_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ECDSAsecp256k1 public key as its freeze key. Y
4 Updates a mutable token with a valid ED25519 private key as its freeze key tokenId=<CREATED_MUTABLE_TOKEN_ID>, freezeKey=<VALID_ED25519_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ED25519 public key as its freeze key. Y
5 Updates a mutable token with a valid ECDSAsecp256k1 private key as its freeze key tokenId=<CREATED_MUTABLE_TOKEN_ID>, freezeKey=<VALID_ECDSA_SECP256K1_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ECDSAsecp256k1 public key as its freeze key. Y
6 Updates a mutable token with a valid KeyList of ED25519 and ECDSAsecp256k1 private and public keys as its freeze key tokenId=<CREATED_MUTABLE_TOKEN_ID>, freezeKey=<VALID_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new KeyList as its freeze key. Y
7 Updates a mutable token with a valid KeyList of nested Keylists (three levels) as its freeze key tokenId=<CREATED_MUTABLE_TOKEN_ID>, freezeKey=<VALID_NESTED_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new nested KeyList as its freeze key. Y
8 Updates a mutable token with a valid ThresholdKey of ED25519 and ECDSAsecp256k1 private and public keys as its freeze key tokenId=<CREATED_MUTABLE_TOKEN_ID>, freezeKey=<VALID_THRESHOLD_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ThresholdKey as its freeze key. Y
9 Updates a mutable token with an empty KeyList as its freeze key tokenId=<CREATED_MUTABLE_TOKEN_ID>, freezeKey=<EMPTY_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token no longer has a freeze key. Y
10 Updates a mutable token that doesn't have a freeze key with a valid key as its freeze key tokenId=<VALID_TOKEN_ID_WITHOUT_FREEZE_KEY>, freezeKey=<VALID_KEY>, commonTransactionParams.signers=[<ADMIN_KEY_OF_VALID_TOKEN_WITHOUT_FREEZE_KEY>] The token update fails with an TOKEN_HAS_NO_FREEZE_KEY response code from the network. Y
11 Updates a mutable token with an invalid key as its freeze key tokenId=<CREATED_MUTABLE_TOKEN_ID>, freezeKey=<INVALID_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an SDK internal error. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.382",
    "freezeKey": "302a300506032b6570032100e9a0f9c81b3a2bb81a4af5fe05657aa849a3b9b0705da1fb52f331f42cf4b496",
    "commonTransactionParams": {
      "signers": [
        "302e020100300506032b65700422042031f8eb3e77a04ebe599c51570976053009e619414f26bdd39676a5d3b2782a1d"
      ]
    }
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Wipe Key:

  • The desired new key which can wipe the token's balance from an account.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a valid key as its wipe key tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, wipeKey=<VALID_KEY> The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a valid ED25519 public key as its wipe key tokenId=<CREATED_MUTABLE_TOKEN_ID>, wipeKey=<VALID_ED25519_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ED25519 public key as its wipe key. Y
3 Updates a mutable token with a valid ECDSAsecp256k1 public key as its wipe key tokenId=<CREATED_MUTABLE_TOKEN_ID>, wipeKey=<VALID_ECDSA_SECP256K1_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ECDSAsecp256k1 public key as its wipe key. Y
4 Updates a mutable token with a valid ED25519 private key as its wipe key tokenId=<CREATED_MUTABLE_TOKEN_ID>, wipeKey=<VALID_ED25519_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ED25519 public key as its wipe key. Y
5 Updates a mutable token with a valid ECDSAsecp256k1 private key as its wipe key tokenId=<CREATED_MUTABLE_TOKEN_ID>, wipeKey=<VALID_ECDSA_SECP256K1_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ECDSAsecp256k1 public key as its wipe key. Y
6 Updates a mutable token with a valid KeyList of ED25519 and ECDSAsecp256k1 private and public keys as its wipe key tokenId=<CREATED_MUTABLE_TOKEN_ID>, wipeKey=<VALID_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new KeyList as its wipe key. Y
7 Updates a mutable token with a valid KeyList of nested Keylists (three levels) as its wipe key tokenId=<CREATED_MUTABLE_TOKEN_ID>, wipeKey=<VALID_NESTED_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new nested KeyList as its wipe key. Y
8 Updates a mutable token with a valid ThresholdKey of ED25519 and ECDSAsecp256k1 private and public keys as its wipe key tokenId=<CREATED_MUTABLE_TOKEN_ID>, wipeKey=<VALID_THRESHOLD_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ThresholdKey as its wipe key. Y
9 Updates a mutable token with an empty KeyList as its wipe key tokenId=<CREATED_MUTABLE_TOKEN_ID>, wipeKey=<EMPTY_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token no longer has a wipe key. Y
10 Updates a mutable token that doesn't have a wipe key with a valid key as its wipe key tokenId=<VALID_TOKEN_ID_WITHOUT_WIPE_KEY>, wipeKey=<VALID_KEY>, commonTransactionParams.signers=[<ADMIN_KEY_OF_VALID_TOKEN_WITHOUT_WIPE_KEY>] The token update fails with an TOKEN_HAS_NO_WIPE_KEY response code from the network. Y
11 Updates a mutable token with an invalid key as its wipe key tokenId=<CREATED_MUTABLE_TOKEN_ID>, wipeKey=<INVALID_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an SDK internal error. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.382",
    "wipeKey": "302a300506032b6570032100e9a0f9c81b3a2bb81a4af5fe05657aa849a3b9b0705da1fb52f331f42cf4b496",
    "commonTransactionParams": {
      "signers": [
        "302e020100300506032b65700422042031f8eb3e77a04ebe599c51570976053009e619414f26bdd39676a5d3b2782a1d"
      ]
    }
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Supply Key:

  • The desired new key which can change the supply of a token.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a valid key as its supply key tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, supplyKey=<VALID_KEY> The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a valid ED25519 public key as its supply key tokenId=<CREATED_MUTABLE_TOKEN_ID>, supplyKey=<VALID_ED25519_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ED25519 public key as its supply key. Y
3 Updates a mutable token with a valid ECDSAsecp256k1 public key as its supply key tokenId=<CREATED_MUTABLE_TOKEN_ID>, supplyKey=<VALID_ECDSA_SECP256K1_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ECDSAsecp256k1 public key as its supply key. Y
4 Updates a mutable token with a valid ED25519 private key as its supply key tokenId=<CREATED_MUTABLE_TOKEN_ID>, supplyKey=<VALID_ED25519_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ED25519 public key as its supply key. Y
5 Updates a mutable token with a valid ECDSAsecp256k1 private key as its supply key tokenId=<CREATED_MUTABLE_TOKEN_ID>, supplyKey=<VALID_ECDSA_SECP256K1_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ECDSAsecp256k1 public key as its supply key. Y
6 Updates a mutable token with a valid KeyList of ED25519 and ECDSAsecp256k1 private and public keys as its supply key tokenId=<CREATED_MUTABLE_TOKEN_ID>, supplyKey=<VALID_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new KeyList as its supply key. Y
7 Updates a mutable token with a valid KeyList of nested Keylists (three levels) as its supply key tokenId=<CREATED_MUTABLE_TOKEN_ID>, supplyKey=<VALID_NESTED_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new nested KeyList as its supply key. Y
8 Updates a mutable token with a valid ThresholdKey of ED25519 and ECDSAsecp256k1 private and public keys as its supply key tokenId=<CREATED_MUTABLE_TOKEN_ID>, supplyKey=<VALID_THRESHOLD_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ThresholdKey as its supply key. Y
9 Updates a mutable token with an empty KeyList as its supply key tokenId=<CREATED_MUTABLE_TOKEN_ID>, supplyKey=<EMPTY_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token no longer has a supply key. Y
10 Updates a mutable token that doesn't have a supply key with a valid key as its supply key tokenId=<VALID_TOKEN_ID_WITHOUT_SUPPLY_KEY>, supplyKey=<VALID_KEY>, commonTransactionParams.signers=[<ADMIN_KEY_OF_VALID_TOKEN_WITHOUT_SUPPLY_KEY>] The token update fails with an TOKEN_HAS_NO_SUPPLY_KEY response code from the network. Y
11 Updates a mutable token with an invalid key as its supply key tokenId=<CREATED_MUTABLE_TOKEN_ID>, supplyKey=<INVALID_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an SDK internal error. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.382",
    "supplyKey": "302a300506032b6570032100e9a0f9c81b3a2bb81a4af5fe05657aa849a3b9b0705da1fb52f331f42cf4b496",
    "commonTransactionParams": {
      "signers": [
        "302e020100300506032b65700422042031f8eb3e77a04ebe599c51570976053009e619414f26bdd39676a5d3b2782a1d"
      ]
    }
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Auto Renew Account:

  • The desired new ID of the account to pay for the auto-renewal of the token.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with an auto renew account tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, autoRenewAccountId=<OPERATOR_ACCOUNT_ID> The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with an auto renew account tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewAccountId=<VALID_ACCOUNT_ID>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>, <ACCOUNT_PRIVATE_KEY>] The token update succeeds and <VALID_ACCOUNT_ID> is the ID of the token's new auto-renew account. Y
3 Updates a mutable token with an auto renew account without signing with the account's private key tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewAccountId=<VALID_ACCOUNT_ID>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_SIGNATURE response code from the network. Y
4 Updates a mutable token with an auto renew account that doesn't exist tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewAccountId="123.456.789", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_AUTORENEW_ACCOUNT response code from the network. Y
5 Updates a mutable token with an empty auto renew account tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewAccountId="", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an SDK internal error. Y
6 Updates a mutable token with an auto renew account that is deleted tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewAccountId=<DELETED_ACCOUNT_ID>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>, <DELETED_ACCOUNT_PRIVATE_KEY>] The token update fails with an INVALID_AUTORENEW_ACCOUNT response code from the network. Y
7 Updates a mutable token with an auto renew account without signing with the token's admin key tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewAccountId=<VALID_ACCOUNT_ID>, commonTransactionParams.signers=[<ACCOUNT_PRIVATE_KEY>] The token update fails with an INVALID_SIGNATURE response code from the network. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.53289",
    "autoRenewAccountId": "0.0.2"
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Auto Renew Period:

  • The desired new duration the auto renew account of this token is charged to extend its expiration date every ‘this many’ seconds. If it doesn't have enough balance, it extends as long as possible. If the account is empty when it expires, the token is deleted.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with an auto renew period set to 60 days (5,184,000 seconds) tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, autoRenewPeriod="5184000" The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with an auto renew period set to 0 seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="0", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_RENEWAL_PERIOD response code from the network. Y
3 Updates a mutable token with an auto renew period set to -1 seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="-1", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_RENEWAL_PERIOD response code from the network. Y
4 Updates a mutable token with an auto renew period set to 9,223,372,036,854,775,807 (int64 max) seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="9223372036854775807", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_RENEWAL_PERIOD response code from the network. Y
5 Updates a mutable token with an auto renew period set to 9,223,372,036,854,775,806 (int64 max - 1) seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="9223372036854775806", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_RENEWAL_PERIOD response code from the network. Y
6 Updates a mutable token with an auto renew period set to -9,223,372,036,854,775,808 (int64 min) seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="-9223372036854775808", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_RENEWAL_PERIOD response code from the network. Y
7 Updates a mutable token with an auto renew period set to -9,223,372,036,854,775,8087 (int64 min + 1) seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="-9223372036854775807", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_RENEWAL_PERIOD response code from the network. Y
8 Updates a mutable token with an auto renew period set to 60 days (5,184,000 seconds) tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="5184000", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's auto renew period equals 5,184,000 seconds. Y
9 Updates a mutable token with an auto renew period set to 30 days (2,592,000 seconds) tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="2592000", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's auto renew period equals 2,592,000 seconds. Y
10 Updates a mutable token with an auto renew period set to 30 days minus one second (2,591,999 seconds) tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="2591999", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_RENEWAL_PERIOD response code from the network. Y
11 Updates a mutable token with an auto renew period set to 8,000,001 seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="8000001", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's auto renew period equals 8,000,001 seconds. Y
12 Updates a mutable token with an auto renew period set to 8,000,002 seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, autoRenewPeriod="8000002", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_RENEWAL_PERIOD response code from the network. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.853",
    "autoRenewPeriod": "5184000"
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Expiration Time:

  • The desired new time at which the token will expire and attempt to extend its expiration date.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a valid expiration time tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, expirationTime=<CURRENT_TIME> + "5184000" The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token to an expiration time of 0 tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime="0", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_EXPIRATION_TIME response code from the network. Y
3 Updates a mutable token to an expiration time of -1 tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime="-1", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_EXPIRATION_TIME response code from the network. Y
4 Updates a mutable token to an expiration time of 9,223,372,036,854,775,807 (int64 max) seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime="9223372036854775807", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_EXPIRATION_TIME response code from the network. Y
5 Updates a mutable token to an expiration time of 9,223,372,036,854,775,806 (int64 max - 1) seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime="9223372036854775806", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_EXPIRATION_TIME response code from the network. Y
6 Updates a mutable token to an expiration time of -9,223,372,036,854,775,808 (int64 min) seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime="-9223372036854775808", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_EXPIRATION_TIME response code from the network. Y
7 Updates a mutable token to an expiration time of -9,223,372,036,854,775,807 (int64 min + 1) seconds tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime="-9223372036854775807", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_EXPIRATION_TIME response code from the network. Y
8 Updates a mutable token to an expiration time of 60 days (5,184,000 seconds) from the current time tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime=<CURRENT_TIME> + "5184000", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has an expiration time 5,184,000 seconds (60 days) from the current epoch time. Y
9 Updates a mutable token to an expiration time of 30 days (2,592,000 seconds) from the current time tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime=<CURRENT_TIME> + "2592000", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has an expiration time 2,592,000 seconds (30 days) from the current epoch time. Y
10 Updates a mutable token to an expiration time of 30 days minus one second (2,591,999 seconds) from the current time tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime=<CURRENT_TIME> + "2591999", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_EXPIRATION_TIME response code from the network. Y
11 Updates a mutable token with an expiration time 8,000,001 seconds from the current time tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime=<CURRENT_TIME> + "8000001", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has an expiration time 8,000,001 from the current epoch time. Y
12 Updates a mutable token with an expiration time 8,000,002 seconds from the current time tokenId=<CREATED_MUTABLE_TOKEN_ID>, expirationTime=<CURRENT_TIME> + "8000002", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an INVALID_EXPIRATION_TIME response code from the network. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.3315",
    "expirationTime": "5184000"
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Memo:

  • The desired new memo of the token (UTF-8 encoding max 100 bytes).
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a memo that is a valid length tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, memo="testmemo" The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a memo that is a valid length tokenId=<CREATED_MUTABLE_TOKEN_ID>, memo="testmemo", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's memo equals "testmemo". Y
3 Updates a mutable token with a memo that is the minimum length tokenId=<CREATED_MUTABLE_TOKEN_ID>, memo="", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's memo is empty. Y
4 Updates a mutable token with a memo that is the maximum length tokenId=<CREATED_MUTABLE_TOKEN_ID>, memo="This is a really long memo but it is still valid because it is 100 characters exactly on the money!!", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token's memo equals "This is a really long memo but it is still valid because it is 100 characters exactly on the money!!". Y
5 Updates a mutable token with a memo that exceeds the maximum length tokenId=<CREATED_MUTABLE_TOKEN_ID>, memo="This is a long memo that is not valid because it exceeds 100 characters and it should fail the test!!", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an MEMO_TOO_LONG response code from the network. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.138",
    "memo": "testmemo"
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Fee Schedule Key:

  • The desired new key which can change the token's custom fee schedule.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a valid key as its fee schedule key tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, feeScheduleKey=<VALID_KEY> The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a valid ED25519 public key as its fee schedule key tokenId=<CREATED_MUTABLE_TOKEN_ID>, feeScheduleKey=<VALID_ED25519_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ED25519 public key as its fee schedule key. Y
3 Updates a mutable token with a valid ECDSAsecp256k1 public key as its fee schedule key tokenId=<CREATED_MUTABLE_TOKEN_ID>, feeScheduleKey=<VALID_ECDSA_SECP256K1_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ECDSAsecp256k1 public key as its fee schedule key. Y
4 Updates a mutable token with a valid ED25519 private key as its fee schedule key tokenId=<CREATED_MUTABLE_TOKEN_ID>, feeScheduleKey=<VALID_ED25519_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ED25519 public key as its fee schedule key. Y
5 Updates a mutable token with a valid ECDSAsecp256k1 private key as its fee schedule key tokenId=<CREATED_MUTABLE_TOKEN_ID>, feeScheduleKey=<VALID_ECDSA_SECP256K1_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ECDSAsecp256k1 public key as its fee schedule key. Y
6 Updates a mutable token with a valid KeyList of ED25519 and ECDSAsecp256k1 private and public keys as its fee schedule key tokenId=<CREATED_MUTABLE_TOKEN_ID>, feeScheduleKey=<VALID_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new KeyList as its fee schedule key. Y
7 Updates a mutable token with a valid KeyList of nested Keylists (three levels) as its fee schedule key tokenId=<CREATED_MUTABLE_TOKEN_ID>, feeScheduleKey=<VALID_NESTED_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new nested KeyList as its fee schedule key. Y
8 Updates a mutable token with a valid ThresholdKey of ED25519 and ECDSAsecp256k1 private and public keys as its fee schedule key tokenId=<CREATED_MUTABLE_TOKEN_ID>, feeScheduleKey=<VALID_THRESHOLD_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ThresholdKey as its fee schedule key. Y
9 Updates a mutable token with an empty KeyList as its fee schedule key tokenId=<CREATED_MUTABLE_TOKEN_ID>, feeScheduleKey=<EMPTY_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token no longer has a fee schedule key. Y
10 Updates a mutable token that doesn't have a fee schedule key with a valid key as its fee schedule key tokenId=<VALID_TOKEN_ID_WITHOUT_FEE_SCHEDULE_KEY>, feeScheduleKey=<VALID_KEY>, commonTransactionParams.signers=[<ADMIN_KEY_OF_VALID_TOKEN_WITHOUT_FEE_SCHEDULE_KEY>] The token update fails with an TOKEN_HAS_NO_FEE_SCHEDULE_KEY response code from the network. Y
11 Updates a mutable token with an invalid key as its fee schedule key tokenId=<CREATED_MUTABLE_TOKEN_ID>, feeScheduleKey=<INVALID_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an SDK internal error. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.85532",
    "feeScheduleKey": "302a300506032b6570032100e9a0f9c81b3a2bb81a4af5fe05657aa849a3b9b0705da1fb52f331f42cf4b496",
    "commonTransactionParams": {
      "signers": [
        "302e020100300506032b65700422042031f8eb3e77a04ebe599c51570976053009e619414f26bdd39676a5d3b2782a1d"
      ]
    }
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Pause Key:

  • The desired new key which can pause and unpause a token.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a valid key as its pause key tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, pauseKey=<VALID_KEY> The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a valid ED25519 public key as its pause key tokenId=<CREATED_MUTABLE_TOKEN_ID>, pauseKey=<VALID_ED25519_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ED25519 public key as its pause key. Y
3 Updates a mutable token with a valid ECDSAsecp256k1 public key as its pause key tokenId=<CREATED_MUTABLE_TOKEN_ID>, pauseKey=<VALID_ECDSA_SECP256K1_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ECDSAsecp256k1 public key as its pause key. Y
4 Updates a mutable token with a valid ED25519 private key as its pause key tokenId=<CREATED_MUTABLE_TOKEN_ID>, pauseKey=<VALID_ED25519_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ED25519 public key as its pause key. Y
5 Updates a mutable token with a valid ECDSAsecp256k1 private key as its pause key tokenId=<CREATED_MUTABLE_TOKEN_ID>, pauseKey=<VALID_ECDSA_SECP256K1_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ECDSAsecp256k1 public key as its pause key. Y
6 Updates a mutable token with a valid KeyList of ED25519 and ECDSAsecp256k1 private and public keys as its pause key tokenId=<CREATED_MUTABLE_TOKEN_ID>, pauseKey=<VALID_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new KeyList as its pause key. Y
7 Updates a mutable token with a valid KeyList of nested Keylists (three levels) as its pause key tokenId=<CREATED_MUTABLE_TOKEN_ID>, pauseKey=<VALID_NESTED_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new nested KeyList as its pause key. Y
8 Updates a mutable token with a valid ThresholdKey of ED25519 and ECDSAsecp256k1 private and public keys as its pause key tokenId=<CREATED_MUTABLE_TOKEN_ID>, pauseKey=<VALID_THRESHOLD_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ThresholdKey as its pause key. Y
9 Updates a mutable token with an empty KeyList as its pause key tokenId=<CREATED_MUTABLE_TOKEN_ID>, pauseKey=<EMPTY_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token no longer has a pause key. Y
10 Updates a mutable token that doesn't have a pause key with a valid key as its pause key tokenId=<VALID_TOKEN_ID_WITHOUT_PAUSE_KEY>, pauseKey=<VALID_KEY>, commonTransactionParams.signers=[<ADMIN_KEY_OF_VALID_TOKEN_WITHOUT_PAUSE_KEY>] The token update fails with an TOKEN_HAS_NO_PAUSE_KEY response code from the network. Y
11 Updates a mutable token with an invalid key as its pause key tokenId=<CREATED_MUTABLE_TOKEN_ID>, pauseKey=<INVALID_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an SDK internal error. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.85532",
    "pauseKey": "302a300506032b6570032100e9a0f9c81b3a2bb81a4af5fe05657aa849a3b9b0705da1fb52f331f42cf4b496",
    "commonTransactionParams": {
      "signers": [
        "302e020100300506032b65700422042031f8eb3e77a04ebe599c51570976053009e619414f26bdd39676a5d3b2782a1d"
      ]
    }
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Metadata:

  • The desired new metadata of the created token.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with metadata tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, metadata="1234" The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with metadata tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadata="1234", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token definition has "1234" as its metadata. Y
3 Updates a mutable token with empty metadata tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadata="", commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token definition has no metadata. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.255",
    "metadata": "1234"
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}

Metadata Key:

  • The desired new key which can update the metadata of a token.
Test no Name Input Expected response Implemented (Y/N)
1 Updates an immutable token with a valid key as its metadata key tokenId=<CREATED_IMMUTABLE_TOKEN_ID>, metadataKey=<VALID_KEY> The token update fails with a TOKEN_IS_IMMUTABLE response code from the network. Y
2 Updates a mutable token with a valid ED25519 public key as its metadata key tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadataKey=<VALID_ED25519_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ED25519 public key as its pause key. Y
3 Updates a mutable token with a valid ECDSAsecp256k1 public key as its metadata key tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadataKey=<VALID_ECDSA_SECP256K1_PUBLIC_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ECDSAsecp256k1 public key as its pause key. Y
4 Updates a mutable token with a valid ED25519 private key as its metadata key tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadataKey=<VALID_ED25519_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ED25519 public key as its pause key. Y
5 Updates a mutable token with a valid ECDSAsecp256k1 private key as its metadata key tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadataKey=<VALID_ECDSA_SECP256K1_PRIVATE_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the corresponding new ECDSAsecp256k1 public key as its pause key. Y
6 Updates a mutable token with a valid KeyList of ED25519 and ECDSAsecp256k1 private and public keys as its metadata key tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadataKey=<VALID_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new KeyList as its pause key. Y
7 Updates a mutable token with a valid KeyList of nested Keylists (three levels) as its metadata key tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadataKey=<VALID_NESTED_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new nested KeyList as its pause key. Y
8 Updates a mutable token with a valid ThresholdKey of ED25519 and ECDSAsecp256k1 private and public keys as its metadata key tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadataKey=<VALID_THRESHOLD_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token has the new ThresholdKey as its pause key. Y
9 Updates a mutable token with an empty KeyList as its metadata key tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadataKey=<EMPTY_KEYLIST>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update succeeds and the token no longer has a metadata key. Y
10 Updates a mutable token with a valid key as its metadata key but doesn't sign with it tokenId=<VALID_TOKEN_ID_WITHOUT_METADATA_KEY>, metadataKey=<VALID_KEY>, commonTransactionParams.signers=[<ADMIN_KEY_OF_VALID_TOKEN_WITHOUT_METADATA_KEY>] The token update fails with an TOKEN_HAS_NO_METADATA_KEY response code from the network. Y
11 Updates a mutable token with an invalid key as its metadata key tokenId=<CREATED_MUTABLE_TOKEN_ID>, metadataKey=<INVALID_KEY>, commonTransactionParams.signers=[<CREATED_MUTABLE_TOKEN_ADMIN_KEY>] The token update fails with an SDK internal error. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateToken",
  "params": {
    "tokenId": "0.0.8822",
    "metadataKey": "302a300506032b6570032100e9a0f9c81b3a2bb81a4af5fe05657aa849a3b9b0705da1fb52f331f42cf4b496",
    "commonTransactionParams": {
      "signers": [
        "302e020100300506032b65700422042031f8eb3e77a04ebe599c51570976053009e619414f26bdd39676a5d3b2782a1d"
      ]
    }
  }
}

JSON Response Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "result": {
    "status": "SUCCESS"
  }
}