Skip to content

Commit fdd568b

Browse files
authored
feat: add token transfer and approve builders (#192)
1 parent a362b93 commit fdd568b

10 files changed

Lines changed: 546 additions & 3 deletions

File tree

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ public enum AbiFunction {
44
VOTE("vote"),
55
UNVOTE("unvote"),
66
VALIDATOR_REGISTRATION("registerValidator"),
7-
VALIDATOR_RESIGNATION("resignValidator");
7+
VALIDATOR_RESIGNATION("resignValidator"),
8+
TRANSFER("transfer"),
9+
APPROVE("approve");
810

911
private final String functionName;
1012

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.arkecosystem.crypto.transactions.builder;
2+
3+
import java.math.BigInteger;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import org.arkecosystem.crypto.enums.AbiFunction;
7+
import org.arkecosystem.crypto.transactions.types.AbstractTransaction;
8+
import org.arkecosystem.crypto.transactions.types.EvmCall;
9+
import org.arkecosystem.crypto.utils.AbiEncoder;
10+
11+
public class TokenApproveBuilder extends AbstractTransactionBuilder<TokenApproveBuilder> {
12+
public TokenApproveBuilder contractAddress(String address) {
13+
this.transaction.recipientAddress = address;
14+
return this.instance();
15+
}
16+
17+
public TokenApproveBuilder spender(String address, BigInteger amount) {
18+
List<Object> args = new ArrayList<>();
19+
args.add(address);
20+
args.add(amount);
21+
22+
try {
23+
String payload =
24+
new AbiEncoder("Abi.Token.json")
25+
.encodeFunctionCall(AbiFunction.APPROVE.toString(), args);
26+
27+
this.transaction.data = payload.replaceFirst("^0x", "");
28+
} catch (Exception e) {
29+
throw new RuntimeException("Error encoding token approve", e);
30+
}
31+
32+
return this.instance();
33+
}
34+
35+
@Override
36+
protected AbstractTransaction getTransactionInstance() {
37+
return new EvmCall();
38+
}
39+
40+
@Override
41+
protected TokenApproveBuilder instance() {
42+
return this;
43+
}
44+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.arkecosystem.crypto.transactions.builder;
2+
3+
import java.math.BigInteger;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import org.arkecosystem.crypto.enums.AbiFunction;
7+
import org.arkecosystem.crypto.transactions.types.AbstractTransaction;
8+
import org.arkecosystem.crypto.transactions.types.EvmCall;
9+
import org.arkecosystem.crypto.utils.AbiEncoder;
10+
11+
public class TokenTransferBuilder extends AbstractTransactionBuilder<TokenTransferBuilder> {
12+
public TokenTransferBuilder contractAddress(String address) {
13+
this.transaction.recipientAddress = address;
14+
return this.instance();
15+
}
16+
17+
public TokenTransferBuilder recipient(String address, BigInteger amount) {
18+
List<Object> args = new ArrayList<>();
19+
args.add(address);
20+
args.add(amount);
21+
22+
try {
23+
String payload =
24+
new AbiEncoder("Abi.Token.json")
25+
.encodeFunctionCall(AbiFunction.TRANSFER.toString(), args);
26+
27+
this.transaction.data = payload.replaceFirst("^0x", "");
28+
} catch (Exception e) {
29+
throw new RuntimeException("Error encoding token transfer", e);
30+
}
31+
32+
return this.instance();
33+
}
34+
35+
@Override
36+
protected AbstractTransaction getTransactionInstance() {
37+
return new EvmCall();
38+
}
39+
40+
@Override
41+
protected TokenTransferBuilder instance() {
42+
return this;
43+
}
44+
}

src/main/java/org/arkecosystem/crypto/utils/AbiBase.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ public abstract class AbiBase {
1414
protected List<Map<String, Object>> abi;
1515

1616
public AbiBase() throws IOException {
17-
String abiFilePath = "Abi.Consensus.json";
17+
this("Abi.Consensus.json");
18+
}
1819

20+
public AbiBase(String abiFilePath) throws IOException {
1921
InputStream abiInputStream = getClass().getClassLoader().getResourceAsStream(abiFilePath);
2022

2123
ObjectMapper mapper = new ObjectMapper();

src/main/java/org/arkecosystem/crypto/utils/AbiEncoder.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ public AbiEncoder() throws IOException {
1111
super();
1212
}
1313

14+
public AbiEncoder(String abiFilePath) throws IOException {
15+
super(abiFilePath);
16+
}
17+
1418
public String encodeFunctionCall(String functionName) throws Exception {
1519
return encodeFunctionCall(functionName, Collections.emptyList());
1620
}
@@ -266,7 +270,7 @@ private Map<String, Object> encodeNumber(Object value, boolean signed) throws Ex
266270
}
267271
}
268272
String hex = bigValue.toString(16);
269-
String encoded = String.format("%064s", hex);
273+
String encoded = "0".repeat(Math.max(0, 64 - hex.length())) + hex;
270274

271275
return Map.of("dynamic", false, "encoded", "0x" + encoded);
272276
}

0 commit comments

Comments
 (0)