q9f / eth.rb

a straightforward library to build, sign, and broadcast ethereum transactions anywhere you can run ruby.
https://q9f.github.io/eth.rb
Apache License 2.0
196 stars 85 forks source link

Signature Mismatch in Ruby vs. JavaScrip #262

Closed bolom closed 5 months ago

bolom commented 5 months ago

Eth.rb

The signature generated for an address differs between Ruby and JavaScript.

Ruby code:

types = ['address']
values = ["0x0063046686E46Dc6F15918b61AE2B121458534a5"]

encoded = Eth::Abi.encode(types, values, true)
hashed = Eth::Util.keccak256(encoded)
signed = wallet.personal_sign(hashed)

# Signature: 0x9a720009e1982fb83e20ef8d4803b8ac15a8f060feb03325c55025ab7bf443b00e269bdc7af3ee2e481d80e35e98060ad745705f34d5455e1afd6ac4f298e3d01c

JavaScript code:

import { keccak256, encodePacked, stringToHex } from 'viem';
import { Operator } from './operator';

const operator = new Operator();
const encoded = encodePacked(['address'], ['0x0063046686E46Dc6F15918b61AE2B121458534a5']);
let output = keccak256(encoded);
const operatorSignature = await operator.signRawMessage(output);
console.log(operatorSignature);

// Signature: 0xd867d494b565e61480f88c3d3af58e097bef4e3562b4f6851c0d28deb0fcfc7b4934304da204225f6c3cd0561bb58d55c2f03f223edeb08bf7fbe193368c17c21c

Not sure why @q9f

bolom commented 5 months ago

It's matching only for uint256