Skip to content

Commit fdf6778

Browse files
committed
support token create unique
support token create with custom fees support token mint unique Signed-off-by: Josh Marinacci <[email protected]>
1 parent 4ec1b8b commit fdf6778

File tree

6 files changed

+184
-93
lines changed

6 files changed

+184
-93
lines changed

hapi/hedera-protobuf-java-api/src/main/proto/fees/fee_schedule.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ enum Extra {
9494
ALLOWANCES=14;
9595
AIRDROPS=15;
9696
HOOKS=16;
97+
TOKEN_CREATE_UNIQUE_TOKEN=20;
98+
TOKEN_CREATE_WITH_CUSTOM_FEE=21;
99+
TOKEN_MINT_UNIQUE_TOKEN=22;
97100
}
98101

99102
/**

hedera-node/hedera-file-service-impl/src/main/resources/genesis/simpleFeesSchedules.json

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@
3131
{ "name": "GAS", "fee": 1 },
3232
{ "name": "ALLOWANCES", "fee": 2000 },
3333
{ "name": "AIRDROPS", "fee": 8800 },
34-
{ "name": "HOOKS", "fee": 10000000000 }
34+
{ "name": "HOOKS", "fee": 10000000000 },
35+
{ "name": "TOKEN_CREATE_UNIQUE_TOKEN", "fee": 0 },
36+
{ "name": "TOKEN_CREATE_WITH_CUSTOM_FEE", "fee": 10000000000 },
37+
{ "name": "TOKEN_MINT_UNIQUE_TOKEN", "fee": 190000000 }
3538
],
3639
"services": [
3740
{
@@ -159,13 +162,16 @@
159162
"name": "TokenCreate",
160163
"baseFee": 10000000000,
161164
"extras": [
162-
{"name": "STANDARD_FUNGIBLE_TOKENS", "includedCount": 1 }
165+
{"name": "STANDARD_FUNGIBLE_TOKENS", "includedCount": 1 },
166+
{"name": "TOKEN_CREATE_UNIQUE_TOKEN", "includedCount": 0 },
167+
{"name": "TOKEN_CREATE_WITH_CUSTOM_FEE", "includedCount": 0 }
163168
]
164169
},
165170
{
166171
"name": "TokenMint",
167172
"baseFee": 10000000,
168173
"extras": [
174+
{"name": "TOKEN_MINT_UNIQUE_TOKEN", "includedCount": 0 }
169175
]
170176
},
171177
{

hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/calculator/TokenCreateFeeCalculator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ public void accumulateServiceFee(
5959
addExtraFee(feeResult, serviceDef, Extra.STANDARD_FUNGIBLE_TOKENS, feeSchedule, 1);
6060
}
6161
if (op.tokenType() == TokenType.NON_FUNGIBLE_UNIQUE) {
62-
addExtraFee(feeResult, serviceDef, Extra.STANDARD_NON_FUNGIBLE_TOKENS, feeSchedule, 1);
62+
addExtraFee(feeResult, serviceDef, Extra.TOKEN_CREATE_UNIQUE_TOKEN, feeSchedule, 1);
63+
}
64+
65+
if (!op.customFees().isEmpty()) {
66+
addExtraFee(feeResult, serviceDef, Extra.TOKEN_CREATE_WITH_CUSTOM_FEE, feeSchedule, 1);
6367
}
6468
}
6569

hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/calculator/TokenMintFeeCalculator.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,11 @@ public void accumulateServiceFee(
2828
var op = txnBody.tokenMintOrThrow();
2929
if (op.amount() > 0) {
3030
addExtraFee(feeResult, serviceDef, Extra.STANDARD_FUNGIBLE_TOKENS, feeSchedule, op.amount());
31-
addExtraFee(feeResult, serviceDef, Extra.STANDARD_NON_FUNGIBLE_TOKENS, feeSchedule, 0);
3231
} else {
33-
addExtraFee(feeResult, serviceDef, Extra.STANDARD_FUNGIBLE_TOKENS, feeSchedule, 0);
3432
addExtraFee(
3533
feeResult,
3634
serviceDef,
37-
Extra.STANDARD_NON_FUNGIBLE_TOKENS,
35+
Extra.TOKEN_MINT_UNIQUE_TOKEN,
3836
feeSchedule,
3937
op.metadata().size());
4038
}

hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenServiceFeeCalculatorTests.java

Lines changed: 75 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import com.hedera.hapi.node.token.TokenPauseTransactionBody;
2828
import com.hedera.hapi.node.token.TokenUnfreezeAccountTransactionBody;
2929
import com.hedera.hapi.node.token.TokenUnpauseTransactionBody;
30+
import com.hedera.hapi.node.transaction.CustomFee;
31+
import com.hedera.hapi.node.transaction.FixedFee;
3032
import com.hedera.hapi.node.transaction.TransactionBody;
3133
import com.hedera.node.app.service.token.impl.calculator.CryptoCreateFeeCalculator;
3234
import com.hedera.node.app.service.token.impl.calculator.CryptoDeleteFeeCalculator;
@@ -40,6 +42,8 @@
4042
import com.hedera.node.app.service.token.impl.calculator.TokenUnpauseFeeCalculator;
4143
import com.hedera.node.app.spi.fees.CalculatorState;
4244
import com.hedera.node.app.spi.fees.SimpleFeeCalculatorImpl;
45+
import com.hedera.pbj.runtime.io.buffer.Bytes;
46+
import java.util.List;
4347
import java.util.Set;
4448
import org.hiero.hapi.support.fees.Extra;
4549
import org.hiero.hapi.support.fees.FeeSchedule;
@@ -59,7 +63,9 @@
5963
@DisplayName("Token Handler Fee Tests")
6064
public 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

Comments
 (0)