diff --git a/src/main/java/org/arkecosystem/crypto/utils/abi/ArgumentDecoder.java b/src/main/java/org/arkecosystem/crypto/utils/abi/ArgumentDecoder.java new file mode 100644 index 0000000..9e19727 --- /dev/null +++ b/src/main/java/org/arkecosystem/crypto/utils/abi/ArgumentDecoder.java @@ -0,0 +1,33 @@ +package org.arkecosystem.crypto.utils.abi; + +import org.arkecosystem.crypto.utils.AbiDecoder; +import org.web3j.utils.Numeric; + +public class ArgumentDecoder { + + private final byte[] bytes; + + public ArgumentDecoder(String hex) { + this.bytes = Numeric.hexStringToByteArray(hex); + } + + public String decodeString() { + return (String) AbiDecoder.decodeString(bytes, 0)[0]; + } + + public String decodeAddress() { + return (String) AbiDecoder.decodeAddress(bytes, 0)[0]; + } + + public String decodeUnsignedInt() { + return (String) AbiDecoder.decodeNumber(bytes, 0, 256, false)[0]; + } + + public String decodeSignedInt() { + return (String) AbiDecoder.decodeNumber(bytes, 0, 256, true)[0]; + } + + public boolean decodeBool() { + return (boolean) AbiDecoder.decodeBool(bytes, 0)[0]; + } +} diff --git a/src/test/java/org/arkecosystem/crypto/utils/abi/ArgumentDecoderTest.java b/src/test/java/org/arkecosystem/crypto/utils/abi/ArgumentDecoderTest.java new file mode 100644 index 0000000..9768404 --- /dev/null +++ b/src/test/java/org/arkecosystem/crypto/utils/abi/ArgumentDecoderTest.java @@ -0,0 +1,76 @@ +package org.arkecosystem.crypto.utils.abi; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class ArgumentDecoderTest { + + @Test + void it_should_decode_string() { + String payload = + "0000000000000000000000000000000000000000000000000000000000000020" + + "000000000000000000000000000000000000000000000000000000000000000D" + + "48656C6C6F2C20776F726C642100000000000000000000000000000000000000"; + + ArgumentDecoder decoder = new ArgumentDecoder(payload); + + assertEquals("Hello, world!", decoder.decodeString()); + } + + @Test + void it_should_decode_address() { + String payload = "000000000000000000000000512F366D524157BcF734546eB29a6d687B762255"; + + ArgumentDecoder decoder = new ArgumentDecoder(payload); + + assertEquals("0x512F366D524157BcF734546eB29a6d687B762255", decoder.decodeAddress()); + } + + @Test + void it_should_decode_unsigned_int() { + String payload = "000000000000000000000000000000000000000000000000016345785d8a0000"; + + ArgumentDecoder decoder = new ArgumentDecoder(payload); + + assertEquals("100000000000000000", decoder.decodeUnsignedInt()); + } + + @Test + void it_should_decode_signed_int() { + String payload = "000000000000000000000000000000000000000000000000016345785d8a0000"; + + ArgumentDecoder decoder = new ArgumentDecoder(payload); + + assertEquals("100000000000000000", decoder.decodeSignedInt()); + } + + @Test + void it_should_decode_negative_signed_int() { + String payload = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + + ArgumentDecoder decoder = new ArgumentDecoder(payload); + + assertEquals("-1", decoder.decodeSignedInt()); + } + + @Test + void it_should_decode_bool_as_true() { + String payload = "0000000000000000000000000000000000000000000000000000000000000001"; + + ArgumentDecoder decoder = new ArgumentDecoder(payload); + + assertTrue(decoder.decodeBool()); + } + + @Test + void it_should_decode_bool_as_false() { + String payload = "0000000000000000000000000000000000000000000000000000000000000000"; + + ArgumentDecoder decoder = new ArgumentDecoder(payload); + + assertFalse(decoder.decodeBool()); + } +}