Skip to content

Commit

Permalink
feat(eip712): Handle domain.chainId base10 decimal string (#3388)
Browse files Browse the repository at this point in the history
  • Loading branch information
satoshiotomakan authored Aug 22, 2023
1 parent 6dc5acb commit 6aaedfc
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/Ethereum/MessageSigner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,14 @@ std::string MessageSigner::signTypedData(const PrivateKey& privateKey, const std
if (msgType == MessageType::Eip155 && nlohmann::json::accept(data)) {
auto json = nlohmann::json::parse(data);
if (json.contains("types") && json.at("types").contains("EIP712Domain")) {
if (json.at("domain").at("chainId").get<std::size_t>() != *chainId) {
const auto& chainIdValue = json.at("domain").at("chainId");
std::size_t actualChainId{0};
if (chainIdValue.is_string()) {
actualChainId = std::stoull(chainIdValue.get<std::string>());
} else {
actualChainId = chainIdValue.get<std::size_t>();
}
if (actualChainId != *chainId) {
return "EIP712 chainId is different than the current chainID.";
}
}
Expand Down
94 changes: 94 additions & 0 deletions tests/chains/Ethereum/EthereumMessageSignerTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,4 +243,98 @@ namespace TW::Ethereum {
EXPECT_EQ(std::string(TWStringUTF8Bytes(signature.get())), "446434e4c34d6b7456e5f07a1b994b88bf85c057234c68d1e10c936b1c85706c4e19147c0ac3a983bc2d56ebfd7146f8b62bcea6114900fe8e7d7351f44bf37624");
EXPECT_TRUE(TWEthereumMessageSignerVerifyMessage(pubKey.get(), msg.get(), signature.get()));
}

// Test `TWEthereumMessageSignerSignTypedMessageEip155` where `domain.chainId` is a base10 decimal string.
// Generated by using https://metamask.github.io/test-dapp/
TEST(EthereumEip712, SignMessageAndVerifyEip155ChainIdString) {
PrivateKey ethKey(parse_hex("9066aa168c379a403becb235c15e7129c133c244e56a757ab07bc369288bcab0"));
// 5600
auto chainId = 0x15e0;
auto msg = R"(
{
"domain": {
"chainId": "5600",
"name": "Ether Mail",
"verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC",
"version": "1"
},
"message": {
"contents": "Hello, Bob!",
"from": {
"name": "Cow",
"wallets": [
"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826",
"0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF"
]
},
"to": [
{
"name": "Bob",
"wallets": [
"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB",
"0xB0BdaBea57B0BDABeA57b0bdABEA57b0BDabEa57",
"0xB0B0b0b0b0b0B000000000000000000000000000"
]
}
]
},
"primaryType": "Mail",
"types": {
"EIP712Domain": [
{
"name": "name",
"type": "string"
},
{
"name": "version",
"type": "string"
},
{
"name": "chainId",
"type": "uint256"
},
{
"name": "verifyingContract",
"type": "address"
}
],
"Group": [
{
"name": "name",
"type": "string"
},
{
"name": "members",
"type": "Person[]"
}
],
"Mail": [
{
"name": "from",
"type": "Person"
},
{
"name": "to",
"type": "Person[]"
},
{
"name": "contents",
"type": "string"
}
],
"Person": [
{
"name": "name",
"type": "string"
},
{
"name": "wallets",
"type": "address[]"
}
]
}
})";
auto signature = Ethereum::MessageSigner::signTypedData(ethKey, msg, MessageType::Eip155, chainId);
ASSERT_EQ(signature, "248b45acf2920a9cef00d3b469a875482b5f0e8ce16f6290212d395aaec7f3be0645d6a5cb6fcdfdca9ecefbadd4e77dae656124094ecc984c5fcb9cb4384b05e3");
}
}

0 comments on commit 6aaedfc

Please sign in to comment.