Skip to content

Commit 62da5d7

Browse files
Adding Mint Token operation (#375)
* initial play around * adding Mint Token operation * added changelog unreleased section * amended changelog and version to 12.1.0-alpha.2 * amended the pom xml files to contain 12.1.0-alpha.2 * amended the base energy cost for mint to be 50
1 parent ec9b83a commit 62da5d7

10 files changed

Lines changed: 217 additions & 10 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Changelog
22

3-
## 12.1.0
4-
3+
## Unreleased
4+
- Added `MintTokenOperation` implementing protocol level token mint
5+
- Added protocol level token mint example, see `MintToken` in `concordium-sdk-examples`
56
- Added deserialization for the `ConfigureDelegation` payload
67
- Fixed incorrect deserialization of the `UpdateContract` payload parameter
78

concordium-android-sdk/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>com.concordium.sdk</groupId>
77
<artifactId>concordium-sdk-base</artifactId>
8-
<version>12.1.0-alpha.1</version>
8+
<version>12.1.0-alpha.2</version>
99
</parent>
1010

1111
<artifactId>concordium-android-sdk</artifactId>

concordium-sdk-examples/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<dependency>
2424
<groupId>com.concordium.sdk</groupId>
2525
<artifactId>concordium-sdk</artifactId>
26-
<version>12.0.0</version>
26+
<version>12.1.0-alpha.2</version>
2727
</dependency>
2828
<dependency>
2929
<groupId>org.projectlombok</groupId>
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package com.concordium.sdk.examples;
2+
3+
import com.concordium.sdk.ClientV2;
4+
import com.concordium.sdk.Connection;
5+
import com.concordium.sdk.crypto.ed25519.ED25519SecretKey;
6+
import com.concordium.sdk.exceptions.ClientInitializationException;
7+
import com.concordium.sdk.requests.AccountQuery;
8+
import com.concordium.sdk.requests.BlockQuery;
9+
import com.concordium.sdk.responses.blockitemstatus.FinalizedBlockItem;
10+
import com.concordium.sdk.transactions.*;
11+
import com.concordium.sdk.transactions.tokens.TokenOperationAmount;
12+
import com.concordium.sdk.transactions.tokens.MintTokenOperation;
13+
import com.concordium.sdk.types.AccountAddress;
14+
import lombok.var;
15+
import picocli.CommandLine;
16+
import picocli.CommandLine.Command;
17+
import picocli.CommandLine.Option;
18+
19+
import java.math.BigDecimal;
20+
import java.net.MalformedURLException;
21+
import java.net.URL;
22+
import java.util.Optional;
23+
import java.util.concurrent.Callable;
24+
25+
@Command(name = "MintToken", mixinStandardHelpOptions = true)
26+
public class MintToken implements Callable<Integer> {
27+
@Option(
28+
names = {"--endpoint"},
29+
description = "GRPC interface of the node.",
30+
defaultValue = "https://127.0.0.1:7000")
31+
private String endpoint;
32+
33+
@Option(
34+
names = {"--timeout"},
35+
description = "GRPC request timeout in milliseconds.",
36+
defaultValue = "100000")
37+
private int timeout;
38+
39+
@Override
40+
public Integer call() throws MalformedURLException, ClientInitializationException {
41+
var endpointUrl = new URL(this.endpoint);
42+
43+
Connection connection = Connection.newBuilder()
44+
.host(endpointUrl.getHost())
45+
.port(endpointUrl.getPort())
46+
//.useTLS(TLSConfig.auto()) //update this as necessary if using tls or not
47+
.build();
48+
49+
String tokenSymbol = "RRR10"; // Replace this with the appropriate token symbol in your node
50+
TokenOperationAmount amount = new TokenOperationAmount(
51+
new BigDecimal("1"),
52+
6 //ensure the decimal precision here matches the value of the decimal during token creation
53+
);
54+
55+
//use an address valid in the node being used
56+
AccountAddress sender = AccountAddress.from("4FbFhx5C5XaSUKdnTdrRVbtNW6rtgYYdKRJtggYGBSiktiymsX");
57+
Expiry expiry = Expiry.createNew().addMinutes(5);
58+
59+
//replace with a valid sign key value from the accounts of the node being used
60+
TransactionSigner signer = TransactionSigner.from(
61+
SignerEntry.from(Index.from(0), Index.from(0),
62+
ED25519SecretKey
63+
.from("b4cef1510079ba946c093826d3cf9cdd3132fa9dd8aaaf9c01442bf12d6614fd")));
64+
65+
var client = ClientV2.from(connection);
66+
var senderInfo = client.getAccountInfo(BlockQuery.BEST, AccountQuery.from(sender));
67+
var nonce = senderInfo.getNonce();
68+
var txnHash = client.sendTransaction(
69+
TransactionFactory
70+
.newTokenUpdate( TokenUpdate
71+
.builder()
72+
.tokenSymbol(tokenSymbol)
73+
.operation(
74+
MintTokenOperation
75+
.builder()
76+
.amount(amount)
77+
.build()
78+
).build()
79+
)
80+
.nonce(nonce)
81+
.expiry(expiry)
82+
.sender(sender)
83+
.sign(signer)
84+
);
85+
System.out.println(txnHash);
86+
Optional<FinalizedBlockItem> finalizedBlockItem = client.waitUntilFinalized(txnHash, this.timeout);
87+
System.out.println(finalizedBlockItem);
88+
return 0;
89+
}
90+
91+
public static void main(String[] args) {
92+
int exitCode = new CommandLine(new MintToken()).execute(args);
93+
System.exit(exitCode);
94+
}
95+
}

concordium-sdk/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>com.concordium.sdk</groupId>
99
<artifactId>concordium-sdk-base</artifactId>
10-
<version>12.1.0-alpha.1</version>
10+
<version>12.1.0-alpha.2</version>
1111
</parent>
1212

1313
<artifactId>concordium-sdk</artifactId>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.concordium.sdk.transactions.tokens;
2+
3+
import com.concordium.sdk.types.UInt64;
4+
import lombok.*;
5+
import lombok.extern.jackson.Jacksonized;
6+
7+
import java.util.Optional;
8+
9+
/**
10+
* Mint Token
11+
* @see <a href="https://github.com/Concordium/concordium-update-proposals/blob/main/source/CIS/cis-7.rst#transfer:~:text=%3B%20Mint%20a%20specified%20amount%20to%20the%20sender%20account.%0Atoken%2Dmint%20%3D%20%7B%0A%20%20%20%20%3B%20The%20operation%20type%20is%20%22mint%22.%0A%20%20%20%20%22mint%22%3A%20token%2Dsupply%2Dupdate%2Ddetails">CBOR Schema</a>
12+
*/
13+
@Getter
14+
@Builder
15+
@EqualsAndHashCode
16+
@ToString
17+
// This is for CBOR serialization to use the generated builder.
18+
@Jacksonized
19+
public class MintTokenOperation implements TokenOperation {
20+
21+
/**
22+
* Amount to be transferred.
23+
* It very important that the decimals in it match the actual value of the token.
24+
*/
25+
@NonNull
26+
private final TokenOperationAmount amount;
27+
28+
@Override
29+
public UInt64 getBaseCost() {
30+
return UInt64.from(50);
31+
}
32+
33+
@Override
34+
public String getType() {
35+
return TYPE;
36+
}
37+
38+
public static final String TYPE = "mint";
39+
}

concordium-sdk/src/main/java/com/concordium/sdk/transactions/tokens/TokenOperation.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@
3333
@JsonSubTypes.Type(
3434
value = TransferTokenOperation.class,
3535
name = TransferTokenOperation.TYPE
36+
),
37+
@JsonSubTypes.Type(
38+
value = MintTokenOperation.class,
39+
name = MintTokenOperation.TYPE
3640
)
3741
})
3842
public interface TokenOperation {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.concordium.sdk.tokens;
2+
3+
import com.concordium.sdk.serializing.CborMapper;
4+
import com.concordium.sdk.transactions.tokens.*;
5+
import com.concordium.sdk.types.AccountAddress;
6+
import com.concordium.sdk.types.UInt64;
7+
import lombok.SneakyThrows;
8+
import lombok.val;
9+
import org.bouncycastle.util.encoders.Hex;
10+
import org.junit.Assert;
11+
import org.junit.Test;
12+
13+
import java.math.BigDecimal;
14+
15+
public class MintTokenOperationTest {
16+
17+
@Test
18+
@SneakyThrows
19+
public void testMintTokenOperationSerialization() {
20+
val operation = MintTokenOperation
21+
.builder()
22+
.amount(new TokenOperationAmount(UInt64.from("15"), 6))
23+
.build();
24+
val expectedHex = "bf646d696e74bf66616d6f756e74c482250fffff";
25+
Assert.assertEquals(
26+
expectedHex,
27+
Hex.toHexString(CborMapper.INSTANCE.writeValueAsBytes(operation))
28+
);
29+
Assert.assertEquals(
30+
operation,
31+
CborMapper.INSTANCE.readValue(
32+
Hex.decode(expectedHex),
33+
TokenOperation.class
34+
)
35+
);
36+
}
37+
}

concordium-sdk/src/test/java/com/concordium/sdk/transactions/TokenUpdateTest.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.concordium.sdk.transactions;
22

3-
import com.concordium.sdk.transactions.tokens.CborMemo;
4-
import com.concordium.sdk.transactions.tokens.TaggedTokenHolderAccount;
5-
import com.concordium.sdk.transactions.tokens.TokenOperationAmount;
6-
import com.concordium.sdk.transactions.tokens.TransferTokenOperation;
3+
import com.concordium.sdk.transactions.tokens.*;
74
import com.concordium.sdk.types.AccountAddress;
85
import com.concordium.sdk.types.Nonce;
96
import com.concordium.sdk.types.UInt64;
@@ -230,4 +227,38 @@ public void testTokenUpdatePayloadSerialization() {
230227
TokenUpdate.fromBytes(ByteBuffer.wrap(Hex.decode(expectedHex)))
231228
);
232229
}
230+
231+
232+
@Test
233+
@SneakyThrows
234+
public void testTokenUpdateMintTransactionEnergy() {
235+
Assert.assertEquals(
236+
UInt64.from("642"),
237+
TransactionFactory
238+
.newTokenUpdate(
239+
TokenUpdate
240+
.builder()
241+
.tokenSymbol("TEST")
242+
.operation(
243+
MintTokenOperation
244+
.builder()
245+
.amount(
246+
new TokenOperationAmount(
247+
new BigDecimal("1.5"),
248+
2
249+
)
250+
)
251+
.build()
252+
)
253+
.build()
254+
)
255+
.sender(AccountAddress.from("3JwD2Wm3nMbsowCwb1iGEpnt47UQgdrtnq2qT6opJc3z2AgCrc"))
256+
.nonce(Nonce.from(78910))
257+
.expiry(Expiry.from(123456))
258+
.sign(TransactionTestHelper.getValidSigner())
259+
.getHeader()
260+
.getMaxEnergyCost()
261+
);
262+
}
263+
233264
}

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>com.concordium.sdk</groupId>
77
<artifactId>concordium-sdk-base</artifactId>
8-
<version>12.1.0-alpha.1</version>
8+
<version>12.1.0-alpha.2</version>
99
<packaging>pom</packaging>
1010

1111
<url>https://github.com/Concordium/concordium-java-sdk</url>

0 commit comments

Comments
 (0)