diff --git a/hapi/hedera-protobuf-java-api/src/main/proto/fees/fee_schedule.proto b/hapi/hedera-protobuf-java-api/src/main/proto/fees/fee_schedule.proto index 8423ce439243..b86f7d1c42f2 100644 --- a/hapi/hedera-protobuf-java-api/src/main/proto/fees/fee_schedule.proto +++ b/hapi/hedera-protobuf-java-api/src/main/proto/fees/fee_schedule.proto @@ -97,12 +97,10 @@ enum Extra { CRYPTO_TRANSFER_BASE_FUNGIBLE_CUSTOM_FEES=19; CRYPTO_TRANSFER_BASE_NFT_CUSTOM_FEES=20; HOOK_EXECUTION=21; - TOKEN_CREATE_FUNGIBLE=22; - TOKEN_CREATE_NFT=23; - TOKEN_MINT_FUNGIBLE=24; - TOKEN_MINT_NFT=25; - CONSENSUS_CREATE_TOPIC_WITH_CUSTOM_FEE=26; - CONSENSUS_SUBMIT_MESSAGE_WITH_CUSTOM_FEE=27; + TOKEN_CREATE_WITH_CUSTOM_FEE=22; + TOKEN_MINT_NFT=23; + CONSENSUS_CREATE_TOPIC_WITH_CUSTOM_FEE=24; + CONSENSUS_SUBMIT_MESSAGE_WITH_CUSTOM_FEE=25; } /** diff --git a/hedera-node/hedera-file-service-impl/src/main/resources/genesis/simpleFeesSchedules.json b/hedera-node/hedera-file-service-impl/src/main/resources/genesis/simpleFeesSchedules.json index 67f6ac089700..9bfdb80acf82 100644 --- a/hedera-node/hedera-file-service-impl/src/main/resources/genesis/simpleFeesSchedules.json +++ b/hedera-node/hedera-file-service-impl/src/main/resources/genesis/simpleFeesSchedules.json @@ -28,9 +28,7 @@ { "name": "CUSTOM_FEE", "fee": 0 }, { "name": "GAS", "fee": 1 }, { "name": "ALLOWANCES", "fee": 500000000 }, - { "name": "TOKEN_CREATE_FUNGIBLE", "fee": 9999000000 }, - { "name": "TOKEN_CREATE_NFT", "fee": 19999000000 }, - { "name": "TOKEN_MINT_FUNGIBLE", "fee": 0 }, + { "name": "TOKEN_CREATE_WITH_CUSTOM_FEE", "fee": 10000000000 }, { "name": "TOKEN_MINT_NFT", "fee": 199000000 }, { "name": "AIRDROPS", "fee": 8800 }, { "name": "HOOK_UPDATES", "fee": 10000000000 }, @@ -185,18 +183,16 @@ "schedule": [ { "name": "TokenCreate", - "baseFee": 0, + "baseFee": 9999000000, "extras": [ {"name": "KEYS", "includedCount": 1}, - {"name": "TOKEN_CREATE_FUNGIBLE", "includedCount": 0 }, - {"name": "TOKEN_CREATE_NFT", "includedCount": 0 } + {"name": "TOKEN_CREATE_WITH_CUSTOM_FEE", "includedCount": 0 } ] }, { "name": "TokenMint", "baseFee": 9000000, "extras": [ - {"name": "TOKEN_MINT_FUNGIBLE", "includedCount": 0 }, {"name": "TOKEN_MINT_NFT", "includedCount": 0 } ] }, diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/calculator/TokenCreateFeeCalculator.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/calculator/TokenCreateFeeCalculator.java index a804020a9324..02062c0e0017 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/calculator/TokenCreateFeeCalculator.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/calculator/TokenCreateFeeCalculator.java @@ -5,7 +5,6 @@ import static org.hiero.hapi.fees.FeeScheduleUtils.lookupServiceFee; import com.hedera.hapi.node.base.HederaFunctionality; -import com.hedera.hapi.node.base.TokenType; import com.hedera.hapi.node.transaction.TransactionBody; import com.hedera.node.app.spi.fees.FeeContext; import com.hedera.node.app.spi.fees.ServiceFeeCalculator; @@ -55,11 +54,8 @@ public void accumulateServiceFee( } addExtraFee(feeResult, serviceDef, Extra.KEYS, feeSchedule, keys); - if (op.tokenType() == TokenType.FUNGIBLE_COMMON) { - addExtraFee(feeResult, serviceDef, Extra.TOKEN_CREATE_FUNGIBLE, feeSchedule, 1); - } - if (op.tokenType() == TokenType.NON_FUNGIBLE_UNIQUE) { - addExtraFee(feeResult, serviceDef, Extra.TOKEN_CREATE_NFT, feeSchedule, 1); + if (!op.customFees().isEmpty()) { + addExtraFee(feeResult, serviceDef, Extra.TOKEN_CREATE_WITH_CUSTOM_FEE, feeSchedule, 1); } } diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/calculator/TokenMintFeeCalculator.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/calculator/TokenMintFeeCalculator.java index a1552b02384a..f637b1178180 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/calculator/TokenMintFeeCalculator.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/calculator/TokenMintFeeCalculator.java @@ -27,10 +27,8 @@ public void accumulateServiceFee( feeResult.addServiceFee(1, serviceDef.baseFee()); var op = txnBody.tokenMintOrThrow(); if (op.amount() > 0) { - addExtraFee(feeResult, serviceDef, Extra.TOKEN_MINT_FUNGIBLE, feeSchedule, op.amount()); addExtraFee(feeResult, serviceDef, Extra.TOKEN_MINT_NFT, feeSchedule, 0); } else { - addExtraFee(feeResult, serviceDef, Extra.TOKEN_MINT_FUNGIBLE, feeSchedule, 0); addExtraFee( feeResult, serviceDef, diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenServiceFeeCalculatorTests.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenServiceFeeCalculatorTests.java index 487229c5ee2f..9f3fe28e93b8 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenServiceFeeCalculatorTests.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenServiceFeeCalculatorTests.java @@ -106,7 +106,7 @@ void createCommonToken() { .build(); final var result = feeCalculator.calculateTxFee(body, calculatorState); assertNotNull(result); - assertEquals(TOKEN_CREATE_BASE_FEE + COMMON_TOKEN_FEE, result.total()); + assertEquals(TOKEN_CREATE_BASE_FEE, result.total()); } @Test @@ -118,7 +118,7 @@ void createUniqueToken() { final var result = feeCalculator.calculateTxFee(txBody2, calculatorState); assertNotNull(result); - assertEquals(TOKEN_CREATE_BASE_FEE + UNIQUE_TOKEN_FEE, result.total()); + assertEquals(TOKEN_CREATE_BASE_FEE, result.total()); } @Test @@ -133,7 +133,7 @@ void mintCommonToken() { .build(); final var result = feeCalculator.calculateTxFee(body, calculatorState); assertNotNull(result); - assertEquals(TOKEN_MINT_BASE_FEE + COMMON_TOKEN_FEE * 10, result.total()); + assertEquals(TOKEN_MINT_BASE_FEE, result.total()); } @Test @@ -242,25 +242,16 @@ private FeeSchedule createTestFeeSchedule() { makeExtraDef(Extra.BYTES, 1), makeExtraDef(Extra.KEYS, 2), makeExtraDef(Extra.SIGNATURES, 3), - makeExtraDef(Extra.TOKEN_CREATE_FUNGIBLE, COMMON_TOKEN_FEE), - makeExtraDef(Extra.TOKEN_CREATE_NFT, UNIQUE_TOKEN_FEE), - makeExtraDef(Extra.TOKEN_MINT_FUNGIBLE, COMMON_TOKEN_FEE), makeExtraDef(Extra.TOKEN_MINT_NFT, UNIQUE_TOKEN_FEE), makeExtraDef(Extra.CUSTOM_FEE, 500)) .network(NetworkFee.DEFAULT.copyBuilder().multiplier(2).build()) .services(makeService( "Token", - makeServiceFee( - TOKEN_CREATE, - TOKEN_CREATE_BASE_FEE, - makeExtraIncluded(Extra.KEYS, 1), - makeExtraIncluded(Extra.TOKEN_CREATE_FUNGIBLE, 0), - makeExtraIncluded(Extra.TOKEN_CREATE_NFT, 0)), + makeServiceFee(TOKEN_CREATE, TOKEN_CREATE_BASE_FEE, makeExtraIncluded(Extra.KEYS, 1)), makeServiceFee( TOKEN_MINT, TOKEN_MINT_BASE_FEE, makeExtraIncluded(Extra.KEYS, 1), - makeExtraIncluded(Extra.TOKEN_MINT_FUNGIBLE, 0), makeExtraIncluded(Extra.TOKEN_MINT_NFT, 0)), makeServiceFee(TOKEN_BURN, TOKEN_BURN_BASE_FEE), makeServiceFee(TOKEN_DELETE, TOKEN_DELETE_BASE_FEE), diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/fees/TokenServiceSimpleFeesSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/fees/TokenServiceSimpleFeesSuite.java index dabe75e5791c..3120647c167a 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/fees/TokenServiceSimpleFeesSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/fees/TokenServiceSimpleFeesSuite.java @@ -13,6 +13,7 @@ import static com.hedera.services.bdd.spec.transactions.TxnVerbs.tokenPause; import static com.hedera.services.bdd.spec.transactions.TxnVerbs.tokenUnfreeze; import static com.hedera.services.bdd.spec.transactions.TxnVerbs.tokenUnpause; +import static com.hedera.services.bdd.spec.transactions.token.CustomFeeSpecs.fixedHbarFee; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.compareSimpleToOld; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.newKeyNamed; import static com.hedera.services.bdd.suites.HapiSuite.ONE_BILLION_HBARS; @@ -45,6 +46,7 @@ public class TokenServiceSimpleFeesSuite { private static final String PAYER = "payer"; private static final String ADMIN = "admin"; private static final String OTHER = "other"; + private static final String HBAR_COLLECTOR = "hbarCollector"; @LeakyHapiTest(overrides = {"fees.simpleFeesEnabled"}) @DisplayName("compare create fungible token") @@ -101,6 +103,36 @@ final Stream compareCreateNonFungibleToken() { // fungible = 19999000000, // node+network = 1000000 // total = 20000000000 = 2.0 + 1, + 1, + 1, + 1); + } + + @LeakyHapiTest(overrides = {"fees.simpleFeesEnabled"}) + @DisplayName("compare create fungible token with custom fees") + final Stream compareCreateFungibleTokenWithCustomFees() { + return compareSimpleToOld( + () -> Arrays.asList( + newKeyNamed(SUPPLY_KEY), + cryptoCreate(ADMIN).balance(ONE_BILLION_HBARS), + cryptoCreate(PAYER).balance(ONE_BILLION_HBARS), + cryptoCreate(HBAR_COLLECTOR).balance(0L), + tokenCreate("commonCustomFees") + .blankMemo() + .payingWith(PAYER) + .fee(ONE_HUNDRED_HBARS) + .treasury(ADMIN) + .tokenType(NON_FUNGIBLE_UNIQUE) + .initialSupply(0L) + .supplyKey(SUPPLY_KEY) + .autoRenewAccount(ADMIN) + .autoRenewPeriod(THREE_MONTHS_IN_SECONDS) + .withCustom(fixedHbarFee(1L, HBAR_COLLECTOR)) + .logged() + .hasKnownStatus(SUCCESS) + .via("create-token-txn")), + "create-token-txn", 2, 1, 2, @@ -240,6 +272,8 @@ final Stream compareMintMultipleUniqueToken() { .hasKnownStatus(SUCCESS) .via("non-fungible-multiple-mint-txn")), "non-fungible-multiple-mint-txn", + // TODO: we need a better way to represent the cost of minting NFTs. + // with this current system the cost of node+network will be double counted // base = 9000000, // tokens = 199000000*3, // node+network = 1000000