2727import com .hedera .hapi .node .token .TokenPauseTransactionBody ;
2828import com .hedera .hapi .node .token .TokenUnfreezeAccountTransactionBody ;
2929import com .hedera .hapi .node .token .TokenUnpauseTransactionBody ;
30+ import com .hedera .hapi .node .transaction .CustomFee ;
31+ import com .hedera .hapi .node .transaction .FixedFee ;
3032import com .hedera .hapi .node .transaction .TransactionBody ;
3133import com .hedera .node .app .service .token .impl .calculator .CryptoCreateFeeCalculator ;
3234import com .hedera .node .app .service .token .impl .calculator .CryptoDeleteFeeCalculator ;
4042import com .hedera .node .app .service .token .impl .calculator .TokenUnpauseFeeCalculator ;
4143import com .hedera .node .app .spi .fees .CalculatorState ;
4244import com .hedera .node .app .spi .fees .SimpleFeeCalculatorImpl ;
45+ import com .hedera .pbj .runtime .io .buffer .Bytes ;
46+ import java .util .List ;
4347import java .util .Set ;
4448import org .hiero .hapi .support .fees .Extra ;
4549import org .hiero .hapi .support .fees .FeeSchedule ;
5963@ DisplayName ("Token Handler Fee Tests" )
6064public class TokenServiceFeeCalculatorTests {
6165 private static final long TOKEN_CREATE_BASE_FEE = 15 ;
66+ private static final long TOKEN_CREATE_CUSTOM_FEES_SURCHARGE = 66 ;
6267 private static final long TOKEN_MINT_BASE_FEE = 20 ;
68+ private static final long TOKEN_MINT_UNIQUE_SURCHARGE = 66 ;
6369 private static final long TOKEN_FREEZE_BASE_FEE = 25 ;
6470 private static final long TOKEN_UNFREEZE_BASE_FEE = 30 ;
6571 private static final long TOKEN_PAUSE_BASE_FEE = 35 ;
@@ -107,18 +113,50 @@ void createCommonToken() {
107113 assertEquals (TOKEN_CREATE_BASE_FEE , result .total ());
108114 }
109115
110- // @Test
111- // void createUniqueToken() {
112- // lenient().when(calculatorState.numTxnSignatures()).thenReturn(1);
113- // final var txBody2 = TransactionBody.newBuilder().tokenCreation(
114- // TokenCreateTransactionBody.newBuilder().tokenType(TokenType.NON_FUNGIBLE_UNIQUE)
115- // ).build();
116- // final var result = feeCalculator.calculateTxFee(txBody2, calculatorState);
117- //
118- // assertNotNull(result);
119- // assertEquals(TOKEN_CREATE_BASE_FEE, result.total());
120- // }
121- //
116+ @ Test
117+ void createUniqueToken () {
118+ lenient ().when (calculatorState .numTxnSignatures ()).thenReturn (1 );
119+ final var txBody2 = TransactionBody .newBuilder ()
120+ .tokenCreation (TokenCreateTransactionBody .newBuilder ().tokenType (TokenType .NON_FUNGIBLE_UNIQUE ))
121+ .build ();
122+ final var result = feeCalculator .calculateTxFee (txBody2 , calculatorState );
123+
124+ assertNotNull (result );
125+ assertEquals (TOKEN_CREATE_BASE_FEE , result .total ());
126+ }
127+
128+ @ Test
129+ void createCommonTokenWithCustomFees () {
130+ lenient ().when (calculatorState .numTxnSignatures ()).thenReturn (1 );
131+ final var body = TransactionBody .newBuilder ()
132+ .tokenCreation (TokenCreateTransactionBody .newBuilder ()
133+ .tokenType (TokenType .FUNGIBLE_COMMON )
134+ .customFees (CustomFee .newBuilder ()
135+ .fixedFee (FixedFee .newBuilder ().amount (100 ).build ())
136+ .build ())
137+ .build ())
138+ .build ();
139+ final var result = feeCalculator .calculateTxFee (body , calculatorState );
140+ assertNotNull (result );
141+ assertEquals (TOKEN_CREATE_BASE_FEE + TOKEN_CREATE_CUSTOM_FEES_SURCHARGE , result .total ());
142+ }
143+
144+ @ Test
145+ void createUniqueTokenWithCustomFees () {
146+ lenient ().when (calculatorState .numTxnSignatures ()).thenReturn (1 );
147+ final var body = TransactionBody .newBuilder ()
148+ .tokenCreation (TokenCreateTransactionBody .newBuilder ()
149+ .tokenType (TokenType .NON_FUNGIBLE_UNIQUE )
150+ .customFees (CustomFee .newBuilder ()
151+ .fixedFee (FixedFee .newBuilder ().amount (100 ).build ())
152+ .build ())
153+ .build ())
154+ .build ();
155+ final var result = feeCalculator .calculateTxFee (body , calculatorState );
156+ assertNotNull (result );
157+ assertEquals (TOKEN_CREATE_BASE_FEE + TOKEN_CREATE_CUSTOM_FEES_SURCHARGE , result .total ());
158+ }
159+
122160 @ Test
123161 void mintCommonToken () {
124162 lenient ().when (calculatorState .numTxnSignatures ()).thenReturn (1 );
@@ -134,21 +172,21 @@ void mintCommonToken() {
134172 assertEquals (TOKEN_MINT_BASE_FEE + COMMON_TOKEN_FEE * 10 , result .total ());
135173 }
136174
137- // @Test
138- // void mintUniqueToken() {
139- // lenient().when(calculatorState.numTxnSignatures()).thenReturn(1);
140- // final var uniqueToken = TokenID.newBuilder().tokenNum(1234).build();
141- // final var txBody2 = TransactionBody.newBuilder()
142- // .tokenMint(TokenMintTransactionBody.newBuilder()
143- // .token(uniqueToken)
144- // .metadata(List.of(Bytes.wrap("Bart Simpson")))
145- // .build())
146- // .build();
147- // final var result = feeCalculator.calculateTxFee(txBody2, calculatorState);
148- // assertNotNull(result);
149- // assertEquals(TOKEN_MINT_BASE_FEE + UNIQUE_TOKEN_FEE , result.total());
150- // }
151- //
175+ @ Test
176+ void mintUniqueToken () {
177+ lenient ().when (calculatorState .numTxnSignatures ()).thenReturn (1 );
178+ final var uniqueToken = TokenID .newBuilder ().tokenNum (1234 ).build ();
179+ final var txBody2 = TransactionBody .newBuilder ()
180+ .tokenMint (TokenMintTransactionBody .newBuilder ()
181+ .token (uniqueToken )
182+ .metadata (List .of (Bytes .wrap ("Bart Simpson" )))
183+ .build ())
184+ .build ();
185+ final var result = feeCalculator .calculateTxFee (txBody2 , calculatorState );
186+ assertNotNull (result );
187+ assertEquals (TOKEN_MINT_BASE_FEE + TOKEN_MINT_UNIQUE_SURCHARGE , result .total ());
188+ }
189+
152190 @ Test
153191 void freezeToken () {
154192 final var commonToken = TokenID .newBuilder ().tokenNum (1234 ).build ();
@@ -242,17 +280,24 @@ private FeeSchedule createTestFeeSchedule() {
242280 makeExtraDef (Extra .SIGNATURES , 3 ),
243281 makeExtraDef (Extra .STANDARD_FUNGIBLE_TOKENS , COMMON_TOKEN_FEE ),
244282 makeExtraDef (Extra .STANDARD_NON_FUNGIBLE_TOKENS , UNIQUE_TOKEN_FEE ),
245- makeExtraDef (Extra .CUSTOM_FEE , 500 ))
283+ makeExtraDef (Extra .CUSTOM_FEE , 500 ),
284+ makeExtraDef (Extra .TOKEN_CREATE_WITH_CUSTOM_FEE , TOKEN_CREATE_CUSTOM_FEES_SURCHARGE ),
285+ makeExtraDef (Extra .TOKEN_MINT_UNIQUE_TOKEN , TOKEN_MINT_UNIQUE_SURCHARGE ))
246286 .network (NetworkFee .DEFAULT .copyBuilder ().multiplier (2 ).build ())
247287 .services (makeService (
248288 "Token" ,
249- makeServiceFee (TOKEN_CREATE , TOKEN_CREATE_BASE_FEE , makeExtraIncluded (Extra .KEYS , 1 )),
289+ makeServiceFee (
290+ TOKEN_CREATE ,
291+ TOKEN_CREATE_BASE_FEE ,
292+ makeExtraIncluded (Extra .KEYS , 1 ),
293+ makeExtraIncluded (Extra .TOKEN_CREATE_WITH_CUSTOM_FEE , 0 )),
250294 makeServiceFee (
251295 TOKEN_MINT ,
252296 TOKEN_MINT_BASE_FEE ,
253297 makeExtraIncluded (Extra .KEYS , 1 ),
254298 makeExtraIncluded (Extra .STANDARD_FUNGIBLE_TOKENS , 0 ),
255- makeExtraIncluded (Extra .STANDARD_NON_FUNGIBLE_TOKENS , 0 )),
299+ makeExtraIncluded (Extra .STANDARD_NON_FUNGIBLE_TOKENS , 0 ),
300+ makeExtraIncluded (Extra .TOKEN_MINT_UNIQUE_TOKEN , 0 )),
256301 makeServiceFee (TOKEN_BURN , TOKEN_BURN_BASE_FEE ),
257302 makeServiceFee (TOKEN_DELETE , TOKEN_DELETE_BASE_FEE ),
258303 makeServiceFee (TOKEN_PAUSE , TOKEN_PAUSE_BASE_FEE ),
0 commit comments