TokenFeeScheduleUpdateTransaction - Test specification

Description:

This test specification for TokenFeeScheduleUpdateTransaction 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 TokenFeeScheduleUpdateTransaction. 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-fee-schedule

TokenFeeScheduleUpdate protobufs:

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

updateTokenFeeSchedule

Input Parameters

Parameter Name Type Required/Optional Description/Notes
tokenId string optional The ID of the token whose fee schedule shall be updated.
customFees list<json object> optional The new fees to be assessed during a transfer of the token.
commonTransactionParams json object optional

Output Parameters

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

Additional Notes

The tests contained in this specification will assume that two valid tokens have already been successfully created. The tokens will be an immutable fungible token, and an immutable NFT with values of name="testname", symbol="testsymbol", treasuryAccountId=<OPERATOR_ACCOUNT_ID>, and feeScheduleKey=<VALID_KEY> (and tokenType="ft" or tokenType="nft", depending on the token. The NFT will also need supplyKey=<VALID_KEY>). The fungible token should also be created with a custom fixed fee with feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, and amount="10". Any <CREATED_FUNGIBLE_TOKEN_ID> tag is the ID of the first token, any <CREATED_NON_FUNGIBLE_TOKEN_ID> tag is the ID of the NFT. Any <CREATED_FUNGIBLE_TOKEN_KEY> tag is be the DER-encoded hex string of the fee schedule key of the fungible token, and any <CREATED_NON_FUNGIBLE_TOKEN_KEY> tag is the DER-encoded hex string of the fee schedule key of the NFT. Any <CREATED_NFT_SUPPLY_KEY> will be the supply key of the NFT.

Property Tests

Token ID:

  • The ID of the token whose fee schedule shall be updated.
Test no Name Input Expected response Implemented (Y/N)
1 Updates a token's fee schedule to be empty tokenId=<CREATED_FUNGIBLE_TOKEN_ID> The token fee schedule update succeeds and the token no longer has any custom fees. Y
2 Updates a token's fee schedule to be empty when it is already empty tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID> The token fee schedule update fails with an CUSTOM_SCHEDULE_ALREADY_HAS_NO_FEES response code from the network. Y
3 Updates a token's fee schedule with a token ID that doesn't exist tokenId="123.456.789" The token fee schedule update fails with an INVALID_TOKEN_ID response code from the network. Y
4 Updates a token's fee schedule with a token ID that isn't set tokenId="" The token fee schedule update fails with an SDK internal error. Y
5 Updates a token's fee schedule with a token ID that is deleted tokenId=<DELETED_TOKEN_ID> The token fee schedule update fails with an TOKEN_WAS_DELETED response code from the network. Y
6 Updates a token's fee schedule with no token ID The token fee schedule update fails with an INVALID_TOKEN_ID response code from the network. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 99232,
  "method": "updateTokenFeeSchedule",
  "params": {
    "tokenId": "0.0.5088"
  }
}

JSON Response Example

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

Custom Fees:

  • The new fees to be assessed during a transfer of the token.
Test no Name Input Expected response Implemented (Y/N)
1 Updates a token's fee schedule with a fixed fee with an amount of 0 tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="0"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
2 Updates a token's fee schedule with a fixed fee with an amount of -1 tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="-1"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
3 Updates a token's fee schedule with a fixed fee with an amount of 9,223,372,036,854,775,807 (int64 max) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="9223372036854775807"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fixed fee with an amount of 9,223,372,036,854,775,807. Y
4 Updates a token's fee schedule with a fixed fee with an amount of 9,223,372,036,854,775,806 (int64 max - 1) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="9223372036854775806"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fixed fee with an amount of 9,223,372,036,854,775,806. Y
5 Updates a token's fee schedule with a fixed fee with an amount of -9,223,372,036,854,775,808 (int64 min) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="-9223372036854775808"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
6 Updates a token's fee schedule with a fixed fee with an amount of -9,223,372,036,854,775,807 (int64 min + 1) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="-9223372036854775807"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
7 Updates a token's fee schedule with a fractional fee with a numerator of 0 tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="0", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
8 Updates a token's fee schedule with a fractional fee with a numerator of -1 tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="-1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
9 Updates a token's fee schedule with a fractional fee with a numerator of 9,223,372,036,854,775,807 (int64 max) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="9223372036854775807", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fractional fee with an amount of 9,223,372,036,854,775,807 / 10. Y
10 Updates a token's fee schedule with a fractional fee with a numerator of 9,223,372,036,854,775,806 (int64 max - 1) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="9223372036854775806", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fractional fee with an amount of 9,223,372,036,854,775,806 / 10. Y
11 Updates a token's fee schedule with a fractional fee with a numerator of -9,223,372,036,854,775,808 (int64 min) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="-9223372036854775808", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
12 Updates a token's fee schedule with a fractional fee with a numerator of -9,223,372,036,854,775,807 (int64 min + 1) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="-9223372036854775807", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
13 Updates a token's fee schedule with a fractional fee with a denominator of 0 tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="0", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a FRACTION_DIVIDES_BY_ZERO response code from the network. Y
14 Updates a token's fee schedule with a fractional fee with a denominator of -1 tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="-1", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
15 Updates a token's fee schedule with a fractional fee with a denominator of 9,223,372,036,854,775,807 (int64 max) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="9223372036854775807", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fractional fee with an amount of 1 / 9,223,372,036,854,775,807. Y
16 Updates a token's fee schedule with a fractional fee with a denominator of 9,223,372,036,854,775,806 (int64 max - 1) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="9223372036854775806", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fractional fee with an amount of 1 / 9,223,372,036,854,775,806. Y
17 Updates a token's fee schedule with a fractional fee with a denominator of -9,223,372,036,854,775,808 (int64 min) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="-9223372036854775808", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
18 Updates a token's fee schedule with a fractional fee with a denominator of -9,223,372,036,854,775,807 (int64 min + 1) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="-9223372036854775807", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
19 Updates a token's fee schedule with a fractional fee with a minimum amount of 0 tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="0", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fractional fee with a minimum amount of 0. Y
20 Updates a token's fee schedule with a fractional fee with a minimum amount of -1 tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="-1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
21 Updates a token's fee schedule with a fractional fee with a minimum amount of 9,223,372,036,854,775,807 (int64 max) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="9223372036854775807", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a FRACTIONAL_FEE_MAX_AMOUNT_LESS_THAN_MIN_AMOUNT response code from the network. Y
22 Updates a token's fee schedule with a fractional fee with a minimum amount of 9,223,372,036,854,775,806 (int64 max - 1) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="9223372036854775806", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a FRACTIONAL_FEE_MAX_AMOUNT_LESS_THAN_MIN_AMOUNT response code from the network. Y
23 Updates a token's fee schedule with a fractional fee with a minimum amount of -9,223,372,036,854,775,808 (int64 min) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="-9223372036854775808", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
24 Updates a token's fee schedule with a fractional fee with a minimum amount of -9,223,372,036,854,775,807 (int64 min + 1) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="-9223372036854775807", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
25 Updates a token's fee schedule with a fractional fee with a maximum amount of 0 tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="0", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fractional fee with a maximum amount of 0 (unlimited). Y
26 Updates a token's fee schedule with a fractional fee with a maximum amount of -1 tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="-1", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
27 Updates a token's fee schedule with a fractional fee with a maximum amount of 9,223,372,036,854,775,807 (int64 max) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="9223372036854775807", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fractional fee with a maximum amount of 9,223,372,036,854,775,807. Y
28 Updates a token's fee schedule with a fractional fee with a maximum amount of 9,223,372,036,854,775,806 (int64 max - 1) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="9223372036854775806", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fractional fee with a maximum amount of 9,223,372,036,854,775,806. Y
29 Updates a token's fee schedule with a fractional fee with a maximum amount of -9,223,372,036,854,775,808 (int64 min) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="-9223372036854775808", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
30 Updates a token's fee schedule with a fractional fee with a maximum amount of -9,223,372,036,854,775,807 (int64 min + 1) tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="-9223372036854775807", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
31 Updates a NFT's fee schedule with a royalty fee with a numerator of 0 tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="0", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
32 Updates a NFT's fee schedule with a royalty fee with a numerator of -1 tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="-1", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
33 Updates a NFT's fee schedule with a royalty fee with a numerator of 9,223,372,036,854,775,807 (int64 max) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="9223372036854775807", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a ROYALTY_FRACTION_CANNOT_EXCEED_ONE response code from the network. Y
34 Updates a NFT's fee schedule with a royalty fee with a numerator of 9,223,372,036,854,775,806 (int64 max - 1) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="9223372036854775806", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a ROYALTY_FRACTION_CANNOT_EXCEED_ONE response code from the network. Y
35 Updates a NFT's fee schedule with a royalty fee with a numerator of -9,223,372,036,854,775,808 (int64 min) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="-9223372036854775808", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
36 Updates a NFT's fee schedule with a royalty fee with a numerator of -9,223,372,036,854,775,807 (int64 min + 1) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="-9223372036854775807", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
37 Updates a NFT's fee schedule with a royalty fee with a denominator of 0 tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="0", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a FRACTION_DIVIDES_BY_ZERO response code from the network. Y
38 Updates a NFT's fee schedule with a royalty fee with a denominator of -1 tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="-1", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
39 Updates a NFT's fee schedule with a royalty fee with a denominator of 9,223,372,036,854,775,807 (int64 max) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="9223372036854775807", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom royalty fee with an amount of 1 / 9,223,372,036,854,775,807. Y
40 Updates a NFT's fee schedule with a royalty fee with a denominator of 9,223,372,036,854,775,806 (int64 max - 1) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="9223372036854775806", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom royalty fee with an amount of 1 / 9,223,372,036,854,775,806. Y
41 Updates a NFT's fee schedule with a royalty fee with a denominator of -9,223,372,036,854,775,808 (int64 min) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="-9223372036854775808", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
42 Updates a NFT's fee schedule with a royalty fee with a denominator of -9,223,372,036,854,775,807 (int64 min + 1) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="-9223372036854775807", royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
43 Updates a NFT's fee schedule with a royalty fee with a fallback fee with an amount of 0 tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="0"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
44 Updates a NFT's fee schedule with a royalty fee with a fallback fee with an amount of -1 tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="-1"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
45 Updates a NFT's fee schedule with a royalty fee with a fallback fee with an amount of 9,223,372,036,854,775,807 (int64 max) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="9223372036854775807"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom royalty fee with a fallback fee with an amount of 9,223,372,036,854,775,807. Y
46 Updates a NFT's fee schedule with a royalty fee with a fallback fee with an amount of 9,223,372,036,854,775,806 (int64 max - 1) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="9223372036854775806"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom royalty fee with a fallback fee with an amount of 9,223,372,036,854,775,806. Y
47 Updates a NFT's fee schedule with a royalty fee with a fallback fee with an amount of -9,223,372,036,854,775,808 (int64 min) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="-9223372036854775808"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
48 Updates a NFT's fee schedule with a royalty fee with a fallback fee with an amount of -9,223,372,036,854,775,807 (int64 min + 1) tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="10", royaltyFee.fallbackFee.amount="-9223372036854775807"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEE_MUST_BE_POSITIVE response code from the network. Y
49 Updates a token's fee schedule with a fixed fee with a fee collector account that doesn't exist tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId="123.456.789", feeCollectorsExempt=false, fixedFee.amount="10"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with an INVALID_CUSTOM_FEE_COLLECTOR response code from the network. Y
50 Updates a token's fee schedule with a fractional with a fee collector account that doesn't exist tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId="123.456.789", feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with an INVALID_CUSTOM_FEE_COLLECTOR response code from the network. Y
51 Updates a NFT's fee schedule with a royalty fee with a fee collector account that doesn't exist tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId="123.456.789", feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="10", royaltyFee.fallbackFee.feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, royaltyFee.fallbackFee.feeCollectorsExempt=false, royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with an INVALID_CUSTOM_FEE_COLLECTOR response code from the network. Y
52 Updates a token's fee schedule with a fixed fee with an empty fee collector account tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId="", feeCollectorsExempt=false, fixedFee.amount="10"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with an SDK internal error. Y
53 Updates a token's fee schedule with a fractional with an empty fee collector account tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId="", feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with an SDK internal error. Y
54 Updates a NFT's fee schedule with a royalty fee with an empty fee collector account tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId="", feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="10", royaltyFee.fallbackFee.feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, royaltyFee.fallbackFee.feeCollectorsExempt=false, royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with an SDK internal error. Y
55 Updates a token's fee schedule with a fixed fee with a deleted fee collector account tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<DELETED_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="10"}], commonTransactionParams.signers=[<DELETED_ACCOUNT_PRIVATE_KEY>] The token fee schedule update fails with a INVALID_CUSTOM_FEE_COLLECTOR response code from the network. Y
56 Updates a token's fee schedule with a fractional fee with a deleted fee collector account tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<DELETED_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<DELETED_ACCOUNT_PRIVATE_KEY>] The token fee schedule update fails with a INVALID_CUSTOM_FEE_COLLECTOR response code from the network. Y
57 Updates a NFT's fee schedule with a royalty fee with a deleted fee collector account tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<DELETED_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="10", royaltyFee.fallbackFee.feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, royaltyFee.fallbackFee.feeCollectorsExempt=false, royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>, <DELETED_ACCOUNT_PRIVATE_KEY>] The token fee schedule update fails with a INVALID_CUSTOM_FEE_COLLECTOR response code from the network. Y
58 Updates a token's fee schedule with a fixed fee that is assessed with a token that doesn't exist tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="10", fixedFee.denominatingTokenId="123.456.789"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a INVALID_TOKEN_ID_IN_CUSTOM_FEES response code from the network. Y
59 Updates a token's fee schedule with a fixed fee that is assessed with an empty token tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="10", fixedFee.denominatingTokenId=""}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with an SDK internal error. Y
60 Updates a token's fee schedule with a fixed fee that is assessed with a deleted token tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="10", fixedFee.denominatingTokenId=<DELETED_TOKEN_ID>}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a INVALID_TOKEN_ID_IN_CUSTOM_FEES response code from the network. Y
61 Updates a token's fee schedule with a fractional fee that is assessed to the receiver tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="exclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update succeeds and the token has the custom fractional fee that is assessed to the receiver. Y
62 Updates a fungible token's fee schedule with a royalty fee tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, royaltyFee.numerator="1", royaltyFee.denominator="10", royaltyFee.fallbackFee.feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, royaltyFee.fallbackFee.feeCollectorsExempt=false, royaltyFee.fallbackFee.amount="10"}], commonTransactionParams.signers=[<CREATED_NON_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_ROYALTY_FEE_ONLY_ALLOWED_FOR_NON_FUNGIBLE_UNIQUE response code from the network. Y
63 Updates a NFT's fee schedule with a fractional fee tokenId=<CREATED_NON_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fractionalFee.numerator="1", fractionalFee.denominator="10", fractionalFee.minimumAmount="1", fractionalFee.maximumAmount="10", fractionalFee.assessmentMethod="inclusive"}], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FRACTIONAL_FEE_ONLY_ALLOWED_FOR_FUNGIBLE_COMMON response code from the network. Y
64 Updates a token's fee schedule with more than the maximum amount of fees allowed tokenId=<CREATED_FUNGIBLE_TOKEN_ID>, customFees=[{feeCollectorAccountId=<OPERATOR_ACCOUNT_ID>, feeCollectorsExempt=false, fixedFee.amount="10"} ... (x11)], commonTransactionParams.signers=[<CREATED_FUNGIBLE_TOKEN_KEY>] The token fee schedule update fails with a CUSTOM_FEES_LIST_TOO_LONG response code from the network. Y

JSON Request Example

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "updateTokenFeeSchedule",
  "params": {
    "tokenId": "0.0.982",
    "customFees": [
      {
        "feeCollectorAccountId": "0.0.2",
        "feeCollectorsExempt": false,
        "fee": {
          "amount": "10",
          "denominatingTokenId": "0.0.10"
        }
      }
    ]
  }
}

JSON Response Example

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