Skip to content

Commit

Permalink
fix: set check ethr signer for node clients (#618)
Browse files Browse the repository at this point in the history
* fix: set check ethr signer for node clients

* test: add ethr signer tests
  • Loading branch information
Harasz committed Jul 25, 2022
1 parent e61ff2b commit c198dc7
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
16 changes: 16 additions & 0 deletions e2e/signer.service.e2e.ts
@@ -0,0 +1,16 @@
import { providers, Wallet } from 'ethers';
import { ProviderType, SignerService } from '../src';

describe('Signer tests', () => {
it('should set `isEthrSigner` for node environment during initialization', async () => {
const wallet = Wallet.createRandom();
const provider = new providers.JsonRpcProvider('http://localhost:8544');
const service = new SignerService(
wallet.connect(provider),
ProviderType.PrivateKey
);
expect(service.isEthSigner).toBeUndefined();
await service.init();
expect(service.isEthSigner).toBe(true);
});
});
28 changes: 28 additions & 0 deletions src/modules/signer/signer.service.ts
Expand Up @@ -85,7 +85,10 @@ export class SignerService {
} else if (isEthSigner === 'false') {
this._isEthSigner = false;
}
} else {
this._setIsEthrSigner();
}

/**
* @todo provide general way to initialize with previously saved key
*/
Expand Down Expand Up @@ -502,4 +505,29 @@ export class SignerService {
sig
)}`;
}

/**
* Set `_isEthSigner` value based on a signed message.
* Generates a test message and signs it.
*/
private async _setIsEthrSigner() {
// arrayification is necessary for WalletConnect signatures to work. eth_sign expects message in bytes: https://docs.walletconnect.org/json-rpc-api-methods/ethereum#eth_sign
// keccak256 hash is applied for Metamask to display a coherent hex value when signing
const message = arrayify(keccak256('0x'));
// Computation of the digest in order to recover the public key under the assumption
// that signature was performed as per the eth_sign spec (https://eth.wiki/json-rpc/API#eth_sign)
const digest = arrayify(hashMessage(message));
const sig = await this._signer.signMessage(message);
const keyFromMessage = recoverPublicKey(message, sig);
const keyFromDigest = recoverPublicKey(digest, sig);
if (getAddress(this._address) === computeAddress(keyFromMessage)) {
this._publicKey = keyFromMessage;
this._isEthSigner = false;
} else if (getAddress(this._address) === computeAddress(keyFromDigest)) {
this._publicKey = keyFromDigest;
this._isEthSigner = true;
} else {
throw new Error(ERROR_MESSAGES.NON_ETH_SIGN_SIGNATURE);
}
}
}

0 comments on commit c198dc7

Please sign in to comment.