Skip to content

Commit e1394ce

Browse files
authored
feat: add username resignation builder (#203)
1 parent 5ad8a1b commit e1394ce

4 files changed

Lines changed: 122 additions & 0 deletions

File tree

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ private AbstractTransaction guessTransactionFromTransactionData(
108108
return new ValidatorResignation(transactionData.toHashMap());
109109
} else if (TransactionTypeIdentifier.isUsernameRegistration(payload)) {
110110
return new UsernameRegistration(transactionData.toHashMap());
111+
} else if (TransactionTypeIdentifier.isUsernameResignation(payload)) {
112+
return new UsernameResignation(transactionData.toHashMap());
111113
}
112114

113115
return new EvmCall();
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.ContractAddresses;
4+
import org.arkecosystem.crypto.transactions.types.AbstractTransaction;
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.recipientAddress = ContractAddresses.USERNAMES.address();
13+
}
14+
15+
@Override
16+
protected AbstractTransaction getTransactionInstance() {
17+
return new UsernameResignation();
18+
}
19+
20+
@Override
21+
protected UsernameResignationBuilder instance() {
22+
return this;
23+
}
24+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.arkecosystem.crypto.transactions.types;
2+
3+
import java.util.Map;
4+
import org.arkecosystem.crypto.enums.AbiFunction;
5+
import org.arkecosystem.crypto.enums.ContractAbiType;
6+
import org.arkecosystem.crypto.utils.AbiEncoder;
7+
8+
public class UsernameResignation extends AbstractTransaction {
9+
10+
public UsernameResignation() {
11+
super();
12+
}
13+
14+
public UsernameResignation(Map<String, Object> data) {
15+
super(data);
16+
}
17+
18+
@Override
19+
public String getPayload() {
20+
try {
21+
return new AbiEncoder(ContractAbiType.USERNAMES)
22+
.encodeFunctionCall(AbiFunction.USERNAME_RESIGNATION.toString());
23+
} catch (Exception e) {
24+
throw new RuntimeException("Error encoding username resignation call", e);
25+
}
26+
}
27+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package org.arkecosystem.crypto.transactions.builder;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import org.arkecosystem.crypto.AbstractTest;
6+
import org.arkecosystem.crypto.encoding.Hex;
7+
import org.arkecosystem.crypto.enums.ContractAddresses;
8+
import org.arkecosystem.crypto.transactions.Deserializer;
9+
import org.arkecosystem.crypto.transactions.types.AbstractTransaction;
10+
import org.arkecosystem.crypto.transactions.types.UsernameResignation;
11+
import org.junit.jupiter.api.Test;
12+
13+
public class UsernameResignationBuilderTest extends AbstractTest {
14+
15+
private static final String RESIGN_SELECTOR = "0xebed6dab";
16+
17+
@Test
18+
public void it_should_default_to_the_usernames_well_known_contract() {
19+
UsernameResignationBuilder builder = new UsernameResignationBuilder();
20+
21+
assertEquals(ContractAddresses.USERNAMES.address(), builder.transaction.recipientAddress);
22+
}
23+
24+
@Test
25+
public void it_should_encode_resign_username_selector() {
26+
UsernameResignationBuilder builder =
27+
new UsernameResignationBuilder()
28+
.gasPrice(5_000_000_000L)
29+
.gasLimit(100_000)
30+
.nonce(1L);
31+
32+
builder.transaction.refreshPayloadData();
33+
34+
assertEquals(RESIGN_SELECTOR, builder.transaction.data);
35+
}
36+
37+
@Test
38+
public void it_should_sign_and_verify_a_username_resignation_transaction() {
39+
UsernameResignationBuilder builder =
40+
new UsernameResignationBuilder()
41+
.gasPrice(5_000_000_000L)
42+
.gasLimit(100_000)
43+
.nonce(1L)
44+
.sign(this.passphrase);
45+
46+
assertNotNull(builder.transaction.signature);
47+
assertNotNull(builder.transaction.id);
48+
assertTrue(builder.verify());
49+
}
50+
51+
@Test
52+
public void it_should_round_trip_through_serialization() {
53+
UsernameResignationBuilder builder =
54+
new UsernameResignationBuilder()
55+
.gasPrice(5_000_000_000L)
56+
.gasLimit(100_000)
57+
.nonce(7L)
58+
.sign(this.passphrase);
59+
60+
String serialized = Hex.encode(builder.transaction.serialize());
61+
AbstractTransaction restored = Deserializer.newDeserializer(serialized).deserialize();
62+
63+
assertInstanceOf(UsernameResignation.class, restored);
64+
assertEquals(builder.transaction.id, restored.id);
65+
assertEquals(
66+
builder.transaction.recipientAddress.toLowerCase(),
67+
restored.recipientAddress.toLowerCase());
68+
}
69+
}

0 commit comments

Comments
 (0)