Skip to content

Commit 294c86c

Browse files
Adds offchain message signing test for 7702
1 parent 39e659a commit 294c86c

File tree

2 files changed

+110
-0
lines changed
  • android/app/src/androidTest/java/com/trustwallet/core/app/blockchains/ethereum
  • rust/tw_evm/tests

2 files changed

+110
-0
lines changed

android/app/src/androidTest/java/com/trustwallet/core/app/blockchains/ethereum/TestBiz.kt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,4 +242,46 @@ class TestBiz {
242242
val expected = "0x1d92e4b600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000004b0f1812e5df2a09796481ff14017e6005508003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b3000000000000000000000000bc472b43bc237f733c78a581078f58a6a89c46ec00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041db18e3a0150ddef964810e480b25592942a22d0b583f7d5cbb33ef6fb4baa66e753af78e967ee374070e16cf963a6cd7a3adb713e50d553aefbc361c48366a101b00000000000000000000000000000000000000000000000000000000000000"
243243
assertEquals(expected, Numeric.toHexString(encoded))
244244
}
245+
246+
// Off-chain message signing for Biz isValidSignature()
247+
@Test
248+
fun testBizOffchainMsgSigning() {
249+
val chainIdByteArray = "0x7A69".toHexByteArray() // 31337
250+
val wallet = "0x328809Bc894f92807417D2dAD6b7C998c1aFdac6"
251+
252+
val codeAddress = "0xc7183455a4C133Ae270771860664b6B7ec320bB1"
253+
val codeName = "Biz"
254+
val codeVersion = "v2.0.0"
255+
// keccak256("Biz(bytes32 msgHash)")
256+
val typeHash = "0x31322a37c2a66b24e1088197e5b24fcc050625c13d4b84c3eaa6a8be5270321d"
257+
val domainSeparatorHash = "0xd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472"
258+
259+
// keccak256(abi.encode(keccak256("test message")))
260+
val innerHash = "0x4a57b5e386189fd992a83269e996782dbfb8ad539903019abcff0a5b3c012671"
261+
262+
val encodedHash = WCBiz.getEncodedHash(
263+
chainIdByteArray,
264+
codeAddress,
265+
codeName,
266+
codeVersion,
267+
typeHash,
268+
domainSeparatorHash,
269+
wallet,
270+
innerHash
271+
)
272+
assertEquals(
273+
"0xf1b5b1122b48d985c9dccaae7978a607b77bd7e0a851ff9e750acacfd2919c3f",
274+
Numeric.toHexString(encodedHash)
275+
)
276+
277+
val privateKey = "0x9c0257114eb9399a2985f8e75dad7600c5d89fe3824ffa99ec1c3eb8bf3b0501"
278+
val signedHash = WCBiz.getSignedHash(
279+
"0xf1b5b1122b48d985c9dccaae7978a607b77bd7e0a851ff9e750acacfd2919c3f",
280+
privateKey
281+
)
282+
assertEquals(
283+
"0x08c85dc326ddb9f23265fdc4c71f6d763439a29080353e6a2461e6b0f25cfecb2405e9e2d7fb7bd81ac42d2fbf53253c5e03fa73d8a755727c474f11fa37db401c",
284+
Numeric.toHexString(signedHash)
285+
)
286+
}
245287
}

rust/tw_evm/tests/biz_ffi.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use tw_evm::address::Address;
1010
use tw_evm::ffi::biz::{
1111
tw_biz_get_encoded_hash, tw_biz_get_signed_hash, tw_biz_sign_execute_with_signature_call,
1212
};
13+
use tw_hash::sha3::keccak256;
1314
use tw_memory::test_utils::tw_data_helper::TWDataHelper;
1415
use tw_memory::test_utils::tw_string_helper::TWStringHelper;
1516
use tw_number::U256;
@@ -114,3 +115,70 @@ fn test_execute_with_signature_ffi() {
114115
let expected = "0x1d92e4b600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000004b0f1812e5df2a09796481ff14017e6005508003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b3000000000000000000000000bc472b43bc237f733c78a581078f58a6a89c46ec00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041db18e3a0150ddef964810e480b25592942a22d0b583f7d5cbb33ef6fb4baa66e753af78e967ee374070e16cf963a6cd7a3adb713e50d553aefbc361c48366a101b00000000000000000000000000000000000000000000000000000000000000";
115116
assert_eq!(encoded.to_vec().unwrap().to_hex_prefixed(), expected);
116117
}
118+
119+
/// Tests off-chain message signing for Biz `isValidSignature()` (EIP-1271).
120+
#[test]
121+
fn test_biz_offchain_msg_signing() {
122+
let biz_msg_type_hash = keccak256(b"Biz(bytes32 msgHash)");
123+
assert_eq!(
124+
hex::encode(&biz_msg_type_hash, true),
125+
"0x31322a37c2a66b24e1088197e5b24fcc050625c13d4b84c3eaa6a8be5270321d"
126+
);
127+
128+
let chain_id = U256::from(31337u64).to_big_endian();
129+
let chain_id = TWDataHelper::create(chain_id.to_vec());
130+
let code_address = TWStringHelper::create("0xc7183455a4C133Ae270771860664b6B7ec320bB1");
131+
let code_name = TWStringHelper::create("Biz");
132+
let code_version = TWStringHelper::create("v2.0.0");
133+
let type_hash = TWStringHelper::create(
134+
"0x31322a37c2a66b24e1088197e5b24fcc050625c13d4b84c3eaa6a8be5270321d",
135+
);
136+
let domain_separator_hash = TWStringHelper::create(
137+
"0xd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472",
138+
);
139+
let sender = TWStringHelper::create("0x328809Bc894f92807417D2dAD6b7C998c1aFdac6");
140+
141+
let raw_hash = keccak256(b"test message");
142+
assert_eq!(
143+
hex::encode(&raw_hash, true),
144+
"0xea83cdcdd06bf61e414054115a551e23133711d0507dcbc07a4bab7dc4581935"
145+
);
146+
147+
let inner_hash = keccak256(&raw_hash);
148+
assert_eq!(
149+
hex::encode(&inner_hash, true),
150+
"0x4a57b5e386189fd992a83269e996782dbfb8ad539903019abcff0a5b3c012671"
151+
);
152+
153+
let inner_hash_str = TWStringHelper::create(&hex::encode(&inner_hash, true));
154+
let encoded_hash = TWDataHelper::wrap(unsafe {
155+
tw_biz_get_encoded_hash(
156+
chain_id.ptr(),
157+
code_address.ptr(),
158+
code_name.ptr(),
159+
code_version.ptr(),
160+
type_hash.ptr(),
161+
domain_separator_hash.ptr(),
162+
sender.ptr(),
163+
inner_hash_str.ptr(),
164+
)
165+
});
166+
assert_eq!(
167+
hex::encode(encoded_hash.to_vec().unwrap(), true),
168+
"0xf1b5b1122b48d985c9dccaae7978a607b77bd7e0a851ff9e750acacfd2919c3f"
169+
);
170+
171+
let private_key = TWStringHelper::create(
172+
"0x9c0257114eb9399a2985f8e75dad7600c5d89fe3824ffa99ec1c3eb8bf3b0501",
173+
);
174+
let encoded_hash_str = TWStringHelper::create(
175+
"0xf1b5b1122b48d985c9dccaae7978a607b77bd7e0a851ff9e750acacfd2919c3f",
176+
);
177+
let signed_hash = TWDataHelper::wrap(unsafe {
178+
tw_biz_get_signed_hash(encoded_hash_str.ptr(), private_key.ptr())
179+
});
180+
assert_eq!(
181+
hex::encode(signed_hash.to_vec().unwrap(), true),
182+
"0x08c85dc326ddb9f23265fdc4c71f6d763439a29080353e6a2461e6b0f25cfecb2405e9e2d7fb7bd81ac42d2fbf53253c5e03fa73d8a755727c474f11fa37db401c"
183+
);
184+
}

0 commit comments

Comments
 (0)