Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Dev/UnderAudit]: Dev<->Master #3120

Merged
merged 24 commits into from
Oct 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
a565082
[Rust]: Implement Private and Public keys (#3107)
satoshiotomakan Apr 26, 2023
b6f2085
[Rust]: Add cargo fuzz tests (#3126)
satoshiotomakan May 3, 2023
df7cd99
[Rust]: Implement Ed25519 curve (#3146)
satoshiotomakan May 11, 2023
67c9429
[Rust]: Implement Curve25519 (#3163)
satoshiotomakan May 15, 2023
3ef9f53
[Rust]: Implement nist256p1 curve (#3169)
satoshiotomakan May 22, 2023
ae387f7
Resolve dev<-master conflicts (#3215)
satoshiotomakan Jun 9, 2023
cef220b
Merge master into dev (#3279)
satoshiotomakan Jun 30, 2023
9b50c29
Sync `dev` with `master` (#3308)
satoshiotomakan Jul 17, 2023
3d9d407
Sync `dev` with `master` (#3313)
satoshiotomakan Jul 17, 2023
5f3a42f
[Blockchain]: Move Ethereum implementation to Rust (#3322)
satoshiotomakan Jul 27, 2023
0a3ba16
[Rust]: Replace C++ RLP implementation (#3350)
satoshiotomakan Aug 10, 2023
a104f8d
Sync `dev` with `master` (#3358)
satoshiotomakan Aug 11, 2023
c37bd9d
[Rust/Bitcoin/Utxo] Great Migration towards `tw_bitcoin` and `tw_utxo…
lamafab Sep 19, 2023
148af54
Sync `dev` with `master` (#3435)
lamafab Sep 20, 2023
993a6de
[Rust/Eth]: Replace C++ Ethereum ABI implementation (#3440)
satoshiotomakan Sep 29, 2023
93c1c1d
[Rust/Eth]: Replace C++ Ethereum MessageSigner (#3458)
satoshiotomakan Oct 3, 2023
6f7e78e
[Rust/Eth]: Add fuzz tests (#3463)
satoshiotomakan Oct 5, 2023
b0adfbf
[docker]: Remove `apt.kitware.com/ubuntu` apt repository (#3465)
satoshiotomakan Oct 6, 2023
434d2a9
[Rust/Crypto]: Disable secp256k1, nist256p1, ed25519 curves in C++ (#…
satoshiotomakan Oct 8, 2023
4ffd26e
Merge branch 'master' into dev
Milerius Oct 8, 2023
9f08ce0
[Android/Kotlin]: Fix dev release (#3473)
satoshiotomakan Oct 9, 2023
bcd8fde
Merge branch 'master' into dev
satoshiotomakan Oct 13, 2023
85ba811
[dev] Trigger CI
satoshiotomakan Oct 13, 2023
9994f79
[KMP]: Bumo wc-kotlin to 3.3.2
satoshiotomakan Oct 13, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .github/workflows/linux-ci-rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ jobs:
run: |
tools/install-rust-dependencies dev

- name: Install emsdk
run: tools/install-wasm-dependencies

- name: Check code formatting
run: |
cargo fmt --check
Expand All @@ -55,6 +58,9 @@ jobs:
cargo llvm-cov nextest --profile ci --no-fail-fast --lcov --output-path coverage.info
working-directory: rust

- name: Run tests in WASM
run: tools/rust-test wasm

- name: Rust Test Report
uses: dorny/test-reporter@v1
if: success() || failure()
Expand Down
3 changes: 0 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,7 @@ RUN apt-get update \
software-properties-common \
&& apt-get clean && rm -rf /var/lib/apt/lists/*

# Add latest cmake
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc | apt-key add - \
&& apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -sc) main"

# Install required packages for dev
RUN apt-get update \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ class TestBarz {

assertEquals(Numeric.toHexString(output.preHash.toByteArray()), "0x2d37191a8688f69090451ed90a0a9ba69d652c2062ee9d023b3ebe964a3ed2ae");

assertEquals(output.encoded.toStringUtf8(), "{\"callData\":\"0xb61d27f600000000000000000000000061061fcae11fd5461535e134eff67a98cfff44e9000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000\",\"callGasLimit\":\"100000\",\"initCode\":\"0x\",\"maxFeePerGas\":\"7033440745\",\"maxPriorityFeePerGas\":\"7033440745\",\"nonce\":\"2\",\"paymasterAndData\":\"0x\",\"preVerificationGas\":\"46856\",\"sender\":\"0xb16db98b365b1f89191996942612b14f1da4bd5f\",\"signature\":\"0x80e84992ebf8d5f71180231163ed150a7557ed0aa4b4bcee23d463a09847e4642d0fbf112df2e5fa067adf4b2fa17fc4a8ac172134ba5b78e3ec9c044e7f28d71c\",\"verificationGasLimit\":\"100000\"}");
assertEquals(output.encoded.toStringUtf8(), "{\"callData\":\"0xb61d27f600000000000000000000000061061fcae11fd5461535e134eff67a98cfff44e9000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000\",\"callGasLimit\":\"100000\",\"initCode\":\"0x\",\"maxFeePerGas\":\"7033440745\",\"maxPriorityFeePerGas\":\"7033440745\",\"nonce\":\"2\",\"paymasterAndData\":\"0x\",\"preVerificationGas\":\"46856\",\"sender\":\"0xb16Db98B365B1f89191996942612B14F1Da4Bd5f\",\"signature\":\"0x80e84992ebf8d5f71180231163ed150a7557ed0aa4b4bcee23d463a09847e4642d0fbf112df2e5fa067adf4b2fa17fc4a8ac172134ba5b78e3ec9c044e7f28d71c\",\"verificationGasLimit\":\"100000\"}");
}

// https://testnet.bscscan.com/tx/0xea1f5cddc0653e116327cbcb3bc770360a642891176eff2ec69c227e46791c31
Expand Down Expand Up @@ -169,7 +169,7 @@ class TestBarz {

assertEquals(Numeric.toHexString(output.preHash.toByteArray()), "0x548c13a0bb87981d04a3a24a78ad5e4ba8d0afbf3cfe9311250e07b54cd38937");

assertEquals(output.encoded.toStringUtf8(), "{\"callData\":\"0xb61d27f600000000000000000000000061061fcae11fd5461535e134eff67a98cfff44e9000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000\",\"callGasLimit\":\"2500000\",\"initCode\":\"0x3fc708630d85a3b5ec217e53100ec2b735d4f800296601cd0000000000000000000000005034534efe9902779ed6ea6983f435c00f3bc51000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004104b173a6a812025c40c38bac46343646bd0a8137c807aae6e04aac238cc24d2ad2116ca14d23d357588ff2aabd7db29d5976f4ecc8037775db86f67e873a306b1f00000000000000000000000000000000000000000000000000000000000000\",\"maxFeePerGas\":\"7033440745\",\"maxPriorityFeePerGas\":\"7033440745\",\"nonce\":\"0\",\"paymasterAndData\":\"0x\",\"preVerificationGas\":\"46856\",\"sender\":\"0x1392ae041bfbdbaa0cff9234a0c8f64df97b7218\",\"signature\":\"0xbf1b68323974e71ad9bd6dfdac07dc062599d150615419bb7876740d2bcf3c8909aa7e627bb0e08a2eab930e2e7313247c9b683c884236dd6ea0b6834fb2cb0a1b\",\"verificationGasLimit\":\"3000000\"}")
assertEquals(output.encoded.toStringUtf8(), "{\"callData\":\"0xb61d27f600000000000000000000000061061fcae11fd5461535e134eff67a98cfff44e9000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000\",\"callGasLimit\":\"2500000\",\"initCode\":\"0x3fc708630d85a3b5ec217e53100ec2b735d4f800296601cd0000000000000000000000005034534efe9902779ed6ea6983f435c00f3bc51000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004104b173a6a812025c40c38bac46343646bd0a8137c807aae6e04aac238cc24d2ad2116ca14d23d357588ff2aabd7db29d5976f4ecc8037775db86f67e873a306b1f00000000000000000000000000000000000000000000000000000000000000\",\"maxFeePerGas\":\"7033440745\",\"maxPriorityFeePerGas\":\"7033440745\",\"nonce\":\"0\",\"paymasterAndData\":\"0x\",\"preVerificationGas\":\"46856\",\"sender\":\"0x1392Ae041BfBdBAA0cFF9234a0C8F64df97B7218\",\"signature\":\"0xbf1b68323974e71ad9bd6dfdac07dc062599d150615419bb7876740d2bcf3c8909aa7e627bb0e08a2eab930e2e7313247c9b683c884236dd6ea0b6834fb2cb0a1b\",\"verificationGasLimit\":\"3000000\"}")
}

// https://testnet.bscscan.com/tx/0x872f709815a9f79623a349f2f16d93b52c4d5136967bab53a586f045edbe9203
Expand Down Expand Up @@ -224,6 +224,6 @@ class TestBarz {
val output = AnySigner.sign(signingInput.build(), ETHEREUM, SigningOutput.parser())

assertEquals(Numeric.toHexString(output.preHash.toByteArray()), "0x84d0464f5a2b191e06295443970ecdcd2d18f565d0d52b5a79443192153770ab");
assertEquals(output.encoded.toStringUtf8(), "{\"callData\":\"0x47e1da2a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000200000000000000000000000003bbb5660b8687c2aa453a0e42dcb6e0732b126600000000000000000000000003bbb5660b8687c2aa453a0e42dcb6e0732b12660000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27890000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27890000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000\",\"callGasLimit\":\"88673\",\"initCode\":\"0x\",\"maxFeePerGas\":\"10000000000\",\"maxPriorityFeePerGas\":\"10000000000\",\"nonce\":\"3\",\"paymasterAndData\":\"0x\",\"preVerificationGas\":\"56060\",\"sender\":\"0x1e6c542ebc7c960c6a155a9094db838cef842cf5\",\"signature\":\"0x0747b665fe9f3a52407f95a35ac3e76de37c9b89483ae440431244e89a77985f47df712c7364c1a299a5ef62d0b79a2cf4ed63d01772275dd61f72bd1ad5afce1c\",\"verificationGasLimit\":\"522180\"}")
assertEquals(output.encoded.toStringUtf8(), "{\"callData\":\"0x47e1da2a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000200000000000000000000000003bbb5660b8687c2aa453a0e42dcb6e0732b126600000000000000000000000003bbb5660b8687c2aa453a0e42dcb6e0732b12660000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27890000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27890000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000\",\"callGasLimit\":\"88673\",\"initCode\":\"0x\",\"maxFeePerGas\":\"10000000000\",\"maxPriorityFeePerGas\":\"10000000000\",\"nonce\":\"3\",\"paymasterAndData\":\"0x\",\"preVerificationGas\":\"56060\",\"sender\":\"0x1E6c542ebC7c960c6A155A9094DB838cEf842cf5\",\"signature\":\"0x0747b665fe9f3a52407f95a35ac3e76de37c9b89483ae440431244e89a77985f47df712c7364c1a299a5ef62d0b79a2cf4ed63d01772275dd61f72bd1ad5afce1c\",\"verificationGasLimit\":\"522180\"}")
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.trustwallet.core.app.blockchains.ethereum

import com.google.protobuf.ByteString
import com.trustwallet.core.app.utils.toHexByteArray
import org.junit.Assert.assertEquals
import org.junit.Test
import com.trustwallet.core.app.utils.Numeric
import wallet.core.jni.EthereumAbi
import wallet.core.jni.CoinType
import wallet.core.jni.proto.EthereumAbi

class TestEthereumAbiDecoder {

Expand Down Expand Up @@ -35,15 +37,15 @@ class TestEthereumAbiDecoder {
}
""".trimIndent()

val decoded = EthereumAbi.decodeCall(call, abi)
val expected = """{"function":"approve(address,uint256)","inputs":[{"name":"_spender","type":"address","value":"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed"},{"name":"_value","type":"uint256","value":"1"}]}"""
val decoded = wallet.core.jni.EthereumAbi.decodeCall(call, abi)
val expected = """{"function":"approve(address,uint256)","inputs":[{"name":"_spender","type":"address","value":"0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"},{"name":"_value","type":"uint256","value":"1"}]}"""

assertEquals(decoded, expected)
}

@Test
fun testEthereumAbiEncodeTyped() {
val hash = EthereumAbi.encodeTyped(
val hash = wallet.core.jni.EthereumAbi.encodeTyped(
"""
{
"types": {
Expand Down Expand Up @@ -94,4 +96,117 @@ class TestEthereumAbiDecoder {
""")
assertEquals(Numeric.toHexString(hash), "0xa85c2e2b118698e88db68a8105b794a8cc7cec074e89ef991cb4f5f533819cc2")
}

@Test
fun testEthereumAbiEncodeFunction() {
val amountIn = EthereumAbi.NumberNParam.newBuilder().apply {
bits = 256
value = ByteString.copyFrom(Numeric.hexStringToByteArray("0xde0b6b3a7640000")) // 1000000000000000000
}
val amountOutMin = EthereumAbi.NumberNParam.newBuilder().apply {
bits = 256
value = ByteString.copyFrom(Numeric.hexStringToByteArray("0x229f7e501ad62bdb")) // 2494851601099271131
}
val deadline = EthereumAbi.NumberNParam.newBuilder().apply {
bits = 256
value = ByteString.copyFrom(Numeric.hexStringToByteArray("0x5f0ed070")) // 1594806384
}
val addressType = EthereumAbi.AddressType.newBuilder().build()

val encodingInput = EthereumAbi.FunctionEncodingInput.newBuilder()
.setFunctionName("swapExactTokensForTokens")
.addTokens(EthereumAbi.Token.newBuilder().setNumberUint(amountIn))
.addTokens(EthereumAbi.Token.newBuilder().setNumberUint(amountOutMin))
.addTokens(EthereumAbi.Token.newBuilder().apply {
array = EthereumAbi.ArrayParam.newBuilder()
.setElementType(EthereumAbi.ParamType.newBuilder().setAddress(addressType))
.addElements(EthereumAbi.Token.newBuilder().setAddress("0x6B175474E89094C44Da98b954EedeAC495271d0F"))
.addElements(EthereumAbi.Token.newBuilder().setAddress("0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2"))
.addElements(EthereumAbi.Token.newBuilder().setAddress("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"))
.addElements(EthereumAbi.Token.newBuilder().setAddress("0xE41d2489571d322189246DaFA5ebDe1F4699F498"))
.build()
})
.addTokens(EthereumAbi.Token.newBuilder().setAddress("0x7d8bf18C7cE84b3E175b339c4Ca93aEd1dD166F1"))
.addTokens(EthereumAbi.Token.newBuilder().setNumberUint(deadline))
.build()

val encodingOutputData = wallet.core.jni.EthereumAbi.encodeFunction(CoinType.ETHEREUM, encodingInput.toByteArray())
val encodingOutput = EthereumAbi.FunctionEncodingOutput.parseFrom(encodingOutputData)

assertEquals(encodingOutput.error, EthereumAbi.AbiError.OK)
assertEquals(encodingOutput.functionType, "swapExactTokensForTokens(uint256,uint256,address[],address,uint256)")

val expectedEncoded = ByteString.copyFrom(Numeric.hexStringToByteArray("0x38ed17390000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000229f7e501ad62bdb00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000007d8bf18c7ce84b3e175b339c4ca93aed1dd166f1000000000000000000000000000000000000000000000000000000005f0ed07000000000000000000000000000000000000000000000000000000000000000040000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498"))
assertEquals(encodingOutput.encoded, expectedEncoded)
}

@Test
fun testEthereumAbiDecodeParams() {
val encoded = ByteString.copyFrom(Numeric.hexStringToByteArray("00000000000000000000000088341d1a8f672d2780c8dc725902aae72f143b0c0000000000000000000000000000000000000000000000000000000000000001"))

val addressType = EthereumAbi.AddressType.newBuilder().build()
val boolType = EthereumAbi.BoolType.newBuilder().build()

val params = EthereumAbi.AbiParams.newBuilder()
.addParams(EthereumAbi.Param.newBuilder().apply {
name = "to"
param = EthereumAbi.ParamType.newBuilder().setAddress(addressType).build()
})
.addParams(EthereumAbi.Param.newBuilder().apply {
name = "approved"
param = EthereumAbi.ParamType.newBuilder().setBoolean(boolType).build()
})
val decodingInput = EthereumAbi.ParamsDecodingInput.newBuilder()
.setEncoded(encoded)
.setAbiParams(params)
.build()

val decodingOutputData = wallet.core.jni.EthereumAbi.decodeParams(CoinType.ETHEREUM, decodingInput.toByteArray())
val decodingOutput = EthereumAbi.ParamsDecodingOutput.parseFrom(decodingOutputData)

assertEquals(decodingOutput.error, EthereumAbi.AbiError.OK)

assertEquals(decodingOutput.getTokens(0).name, "to")
assertEquals(decodingOutput.getTokens(0).address, "0x88341d1a8F672D2780C8dC725902AAe72F143B0c")

assertEquals(decodingOutput.getTokens(1).name, "approved")
assertEquals(decodingOutput.getTokens(1).boolean, true)
}

@Test
fun testEthereumAbiDecodeValue() {
val encoded = ByteString.copyFrom(Numeric.hexStringToByteArray("000000000000000000000000000000000000000000000000000000000000002c48656c6c6f20576f726c64212020202048656c6c6f20576f726c64212020202048656c6c6f20576f726c64210000000000000000000000000000000000000000"))

val decodingInput = EthereumAbi.ValueDecodingInput.newBuilder()
.setEncoded(encoded)
.setParamType("string")
.build()

val decodingOutputData = wallet.core.jni.EthereumAbi.decodeValue(CoinType.ETHEREUM, decodingInput.toByteArray())
val decodingOutput = EthereumAbi.ValueDecodingOutput.parseFrom(decodingOutputData)

assertEquals(decodingOutput.error, EthereumAbi.AbiError.OK)
assertEquals(decodingOutput.token.stringValue, "Hello World! Hello World! Hello World!")
}

@Test
fun testEthereumAbiDecodeContractCall() {
val encoded = ByteString.copyFrom(Numeric.hexStringToByteArray("c47f0027000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000086465616462656566000000000000000000000000000000000000000000000000"))
val abi = """{"c47f0027":{"constant":false,"inputs":[{"name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}}"""
val decodingInput = EthereumAbi.ContractCallDecodingInput.newBuilder()
.setEncoded(encoded)
.setSmartContractAbiJson(abi)
.build()

val decodingOutputData = wallet.core.jni.EthereumAbi.decodeContractCall(CoinType.ETHEREUM, decodingInput.toByteArray())
val decodingOutput = EthereumAbi.ContractCallDecodingOutput.parseFrom(decodingOutputData)

assertEquals(decodingOutput.error, EthereumAbi.AbiError.OK)

val expectedJson = """{"function":"setName(string)","inputs":[{"name":"name","type":"string","value":"deadbeef"}]}"""
assertEquals(decodingOutput.decodedJson, expectedJson)

assertEquals(decodingOutput.getTokens(0).name, "name")
assertEquals(decodingOutput.getTokens(0).stringValue, "deadbeef")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ class TestEthereumAbiValue {
fun testValueDecoderValue() {
assertEquals("42", EthereumAbiValue.decodeValue(Numeric.hexStringToByteArray("000000000000000000000000000000000000000000000000000000000000002a"), "uint"))
assertEquals("24", EthereumAbiValue.decodeValue(Numeric.hexStringToByteArray("0000000000000000000000000000000000000000000000000000000000000018"), "uint8"))
assertEquals("0xf784682c82526e245f50975190ef0fff4e4fc077", EthereumAbiValue.decodeValue(Numeric.hexStringToByteArray("000000000000000000000000f784682c82526e245f50975190ef0fff4e4fc077"), "address"))
assertEquals("0xF784682C82526e245F50975190EF0fff4E4fC077", EthereumAbiValue.decodeValue(Numeric.hexStringToByteArray("000000000000000000000000f784682c82526e245f50975190ef0fff4e4fc077"), "address"))
assertEquals("Hello World! Hello World! Hello World!", EthereumAbiValue.decodeValue(
Numeric.hexStringToByteArray("000000000000000000000000000000000000000000000000000000000000002c48656c6c6f20576f726c64212020202048656c6c6f20576f726c64212020202048656c6c6f20576f726c64210000000000000000000000000000000000000000"),
"string"))
Expand All @@ -103,7 +103,7 @@ class TestEthereumAbiValue {
@Test
fun testValueDecoderArray_address() {
val input = Numeric.hexStringToByteArray("0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f784682c82526e245f50975190ef0fff4e4fc0770000000000000000000000002e00cd222cb42b616d86d037cc494e8ab7f5c9a3")
assertEquals("[\"0xf784682c82526e245f50975190ef0fff4e4fc077\",\"0x2e00cd222cb42b616d86d037cc494e8ab7f5c9a3\"]", EthereumAbiValue.decodeArray(input, "address[]"))
assertEquals("[\"0xF784682C82526e245F50975190EF0fff4E4fC077\",\"0x2e00CD222Cb42B616D86D037Cc494e8ab7F5c9a3\"]", EthereumAbiValue.decodeArray(input, "address[]"))
}

@Test
Expand Down
Loading
Loading