Skip to content

Commit 32b047a

Browse files
committed
add username transactions wip
1 parent e39b8bf commit 32b047a

14 files changed

Lines changed: 344 additions & 8 deletions

src/main/java/org/arkecosystem/crypto/enums/CoreTransactionTypes.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ public enum CoreTransactionTypes {
66
VALIDATOR_REGISTRATION(2),
77
VOTE(3),
88
MULTI_SIGNATURE_REGISTRATION(4),
9-
IPFS(5),
109
MULTI_PAYMENT(6),
1110
VALIDATOR_RESIGNATION(7),
12-
HTLC_LOCK(8),
13-
HTLC_CLAIM(9),
14-
HTLC_REFUND(10);
11+
USERNAME_REGISTRATION(8),
12+
USERNAME_RESIGNATION(9);
1513

1614
private final int value;
1715

src/main/java/org/arkecosystem/crypto/enums/Fees.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ public enum Fees {
66
VALIDATOR_REGISTRATION(2_500_000_000L),
77
VOTE(100_000_000L),
88
MULTI_SIGNATURE_REGISTRATION(500_000_000L),
9-
IPFS(500_000_000L),
109
MULTI_PAYMENT(10_000_000L),
1110
VALIDATOR_RESIGNATION(2_500_000_000L),
12-
HTLC_LOCK(10_000_000L),
13-
HTLC_CLAIM(0L),
14-
HTLC_REFUND(0L);
11+
USERNAME_REGISTRATION(2_500_000_000L),
12+
USERNAME_RESIGNATION(2_500_000_000L);
1513

1614
private final Long value;
1715

src/main/java/org/arkecosystem/crypto/transactions/Deserializer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import org.arkecosystem.crypto.transactions.types.SecondSignatureRegistration;
1616
import org.arkecosystem.crypto.transactions.types.Transaction;
1717
import org.arkecosystem.crypto.transactions.types.Transfer;
18+
import org.arkecosystem.crypto.transactions.types.UsernameRegistration;
19+
import org.arkecosystem.crypto.transactions.types.UsernameResignation;
1820
import org.arkecosystem.crypto.transactions.types.ValidatorRegistration;
1921
import org.arkecosystem.crypto.transactions.types.ValidatorResignation;
2022
import org.arkecosystem.crypto.transactions.types.Vote;
@@ -42,6 +44,10 @@ public Deserializer(String serialized) {
4244
coreTransactionTypes.put(CoreTransactionTypes.MULTI_PAYMENT.getValue(), new MultiPayment());
4345
coreTransactionTypes.put(
4446
CoreTransactionTypes.VALIDATOR_RESIGNATION.getValue(), new ValidatorResignation());
47+
coreTransactionTypes.put(
48+
CoreTransactionTypes.USERNAME_RESIGNATION.getValue(), new UsernameResignation());
49+
coreTransactionTypes.put(
50+
CoreTransactionTypes.USERNAME_REGISTRATION.getValue(), new UsernameRegistration());
4551

4652
transactionGroups.put(TransactionTypeGroup.CORE.getValue(), coreTransactionTypes);
4753

src/main/java/org/arkecosystem/crypto/transactions/TransactionAsset.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class TransactionAsset {
1313
public HashMap<String, Object> customAsset = new HashMap<>();
1414
public long amount = 0L;
1515
public String validatorPublicKey;
16+
public String username;
1617

1718
public static class Signature {
1819
public String publicKey;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.arkecosystem.crypto.transactions.builder;
2+
3+
import org.arkecosystem.crypto.enums.Fees;
4+
import org.arkecosystem.crypto.transactions.types.Transaction;
5+
import org.arkecosystem.crypto.transactions.types.UsernameRegistration;
6+
7+
public class UsernameRegistrationBuilder
8+
extends AbstractTransactionBuilder<UsernameRegistrationBuilder> {
9+
public UsernameRegistrationBuilder() {
10+
super();
11+
this.transaction.fee = Fees.VALIDATOR_REGISTRATION.getValue();
12+
}
13+
14+
public UsernameRegistrationBuilder usernameAsset(String username) {
15+
this.transaction.asset.username = username;
16+
17+
return this;
18+
}
19+
20+
@Override
21+
public Transaction getTransactionInstance() {
22+
return new UsernameRegistration();
23+
}
24+
25+
@Override
26+
public UsernameRegistrationBuilder instance() {
27+
return this;
28+
}
29+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.arkecosystem.crypto.transactions.builder;
2+
3+
import org.arkecosystem.crypto.enums.Fees;
4+
import org.arkecosystem.crypto.transactions.types.Transaction;
5+
import org.arkecosystem.crypto.transactions.types.UsernameResignation;
6+
7+
public class UsernameResignationBuilder
8+
extends AbstractTransactionBuilder<UsernameResignationBuilder> {
9+
10+
public UsernameResignationBuilder() {
11+
super();
12+
this.transaction.fee = Fees.USERNAME_RESIGNATION.getValue();
13+
}
14+
15+
@Override
16+
public Transaction getTransactionInstance() {
17+
return new UsernameResignation();
18+
}
19+
20+
@Override
21+
public UsernameResignationBuilder instance() {
22+
return this;
23+
}
24+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.arkecosystem.crypto.transactions.types;
2+
3+
import java.nio.ByteBuffer;
4+
import java.nio.ByteOrder;
5+
import java.util.HashMap;
6+
import org.arkecosystem.crypto.encoding.Hex;
7+
import org.arkecosystem.crypto.enums.CoreTransactionTypes;
8+
import org.arkecosystem.crypto.enums.TransactionTypeGroup;
9+
10+
public class UsernameRegistration extends Transaction {
11+
@Override
12+
public int getTransactionType() {
13+
return CoreTransactionTypes.USERNAME_REGISTRATION.getValue();
14+
}
15+
16+
@Override
17+
public int getTransactionTypeGroup() {
18+
return TransactionTypeGroup.CORE.getValue();
19+
}
20+
21+
@Override
22+
public HashMap<String, Object> assetToHashMap() {
23+
HashMap<String, Object> asset = new HashMap<>();
24+
25+
asset.put("username", this.asset.username);
26+
27+
return asset;
28+
}
29+
30+
@Override
31+
public byte[] serialize() {
32+
byte[] username = this.asset.username.getBytes();
33+
34+
ByteBuffer buffer = ByteBuffer.allocate(username.length + 1);
35+
36+
buffer.order(ByteOrder.LITTLE_ENDIAN);
37+
38+
buffer.put((byte) username.length);
39+
buffer.put(username);
40+
41+
return buffer.array();
42+
}
43+
44+
@Override
45+
public void deserialize(ByteBuffer buffer) {
46+
int usernameLength = buffer.get() & 0xff;
47+
48+
byte[] username = new byte[usernameLength];
49+
buffer.get(username);
50+
51+
String utf8Username = new String(username);
52+
this.asset.username = utf8Username;
53+
}
54+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.arkecosystem.crypto.transactions.types;
2+
3+
import java.nio.ByteBuffer;
4+
import java.util.HashMap;
5+
import org.arkecosystem.crypto.enums.CoreTransactionTypes;
6+
import org.arkecosystem.crypto.enums.TransactionTypeGroup;
7+
8+
public class UsernameResignation extends Transaction {
9+
@Override
10+
public int getTransactionType() {
11+
return CoreTransactionTypes.USERNAME_RESIGNATION.getValue();
12+
}
13+
14+
@Override
15+
public int getTransactionTypeGroup() {
16+
return TransactionTypeGroup.CORE.getValue();
17+
}
18+
19+
@Override
20+
public HashMap<String, Object> assetToHashMap() {
21+
return null;
22+
}
23+
24+
@Override
25+
public byte[] serialize() {
26+
return new byte[0];
27+
}
28+
29+
@Override
30+
public void deserialize(ByteBuffer buffer) {}
31+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.arkecosystem.crypto.transactions.builder;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import java.util.HashMap;
6+
import org.arkecosystem.crypto.transactions.types.Transaction;
7+
import org.junit.jupiter.api.Test;
8+
9+
class UsernameRegistrationBuilderTest {
10+
@Test
11+
void build() {
12+
Transaction actual =
13+
new UsernameRegistrationBuilder()
14+
.usernameAsset(
15+
"alfonsobries")
16+
.nonce(3)
17+
.sign("this is a top secret passphrase")
18+
.transaction;
19+
20+
HashMap actualHashMap = actual.toHashMap();
21+
22+
HashMap asset = (HashMap) actualHashMap.get("asset");
23+
24+
assertEquals(
25+
asset.get("validatorPublicKey"),
26+
"a08058db53e2665c84a40f5152e76dd2b652125a6079130d4c315e728bcf4dd1dfb44ac26e82302331d61977d3141118");
27+
28+
assertTrue(actual.verify());
29+
}
30+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.arkecosystem.crypto.transactions.builder;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import java.util.HashMap;
6+
import org.arkecosystem.crypto.transactions.types.Transaction;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class UsernameResignationBuilderTest {
10+
@Test
11+
void build() {
12+
Transaction actual =
13+
new UsernameResignationBuilder()
14+
.nonce(3)
15+
.sign("this is a top secret passphrase")
16+
.transaction;
17+
18+
HashMap actualHashMap = actual.toHashMap();
19+
HashMap actualAsset = (HashMap) actualHashMap.get("asset");
20+
assertNull(actualAsset);
21+
22+
assertTrue(actual.verify());
23+
}
24+
25+
@Test
26+
void buildSecondSignature() {
27+
Transaction actual =
28+
new UsernameResignationBuilder()
29+
.nonce(3)
30+
.sign("this is a top secret passphrase")
31+
.secondSign("this is a top secret second passphrase")
32+
.transaction;
33+
34+
assertTrue(actual.verify());
35+
assertTrue(
36+
actual.secondVerify(
37+
"03699e966b2525f9088a6941d8d94f7869964a000efe65783d78ac82e1199fe609"));
38+
}
39+
}

0 commit comments

Comments
 (0)