Skip to content
This repository was archived by the owner on Oct 20, 2024. It is now read-only.

Commit 2eecf61

Browse files
authored
Add RemoteEOA signer (#121)
1 parent 1d9d0e0 commit 2eecf61

File tree

4 files changed

+40
-5
lines changed

4 files changed

+40
-5
lines changed

src/preset/builder/simpleAccount.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ import {
1515
SimpleAccount as SimpleAccountImpl,
1616
SimpleAccount__factory,
1717
} from "../../typechain";
18-
import { IPresetBuilderOpts, UserOperationMiddlewareFn } from "../../types";
18+
import {
19+
EOASigner,
20+
IPresetBuilderOpts,
21+
UserOperationMiddlewareFn,
22+
} from "../../types";
1923

2024
export class SimpleAccount extends UserOperationBuilder {
21-
private signer: ethers.Signer;
25+
private signer: EOASigner;
2226
private provider: ethers.providers.JsonRpcProvider;
2327
private entryPoint: EntryPoint;
2428
private factory: SimpleAccountFactory;
@@ -27,7 +31,7 @@ export class SimpleAccount extends UserOperationBuilder {
2731
proxy: SimpleAccountImpl;
2832

2933
private constructor(
30-
signer: ethers.Signer,
34+
signer: EOASigner,
3135
rpcUrl: string,
3236
opts?: IPresetBuilderOpts
3337
) {
@@ -62,7 +66,7 @@ export class SimpleAccount extends UserOperationBuilder {
6266
};
6367

6468
public static async init(
65-
signer: ethers.Signer,
69+
signer: EOASigner,
6670
rpcUrl: string,
6771
opts?: IPresetBuilderOpts
6872
): Promise<SimpleAccount> {
@@ -89,7 +93,7 @@ export class SimpleAccount extends UserOperationBuilder {
8993
const base = instance
9094
.useDefaults({
9195
sender: instance.proxy.address,
92-
signature: await instance.signer.signMessage(
96+
signature: await ethers.Wallet.createRandom().signMessage(
9397
ethers.utils.arrayify(ethers.utils.keccak256("0xdead"))
9498
),
9599
})

src/preset/signers/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from "./barzSecp256r1";
2+
export * from "./remoteEOA";

src/preset/signers/remoteEOA.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Bytes, ethers } from "ethers";
2+
import { EOASigner } from "../../types";
3+
4+
export class RemoteEOA implements EOASigner {
5+
public provider: ethers.providers.JsonRpcProvider;
6+
7+
constructor(url: string) {
8+
this.provider = new ethers.providers.JsonRpcProvider(url);
9+
}
10+
11+
getAddress(): Promise<string> {
12+
return this.provider.getSigner().getAddress();
13+
}
14+
15+
async signMessage(message: string | Bytes): Promise<string> {
16+
const signer = this.provider.getSigner();
17+
let signature = await signer.signMessage(message);
18+
19+
// Code snippet from https://gist.github.com/kalaspuff/19365e21e01929c79d5d2638c1ee580e
20+
// See also https://github.com/ethereum/go-ethereum/issues/19751#issuecomment-504900739
21+
if (/(^0[xX]|^)[0-9a-fA-F]{128}(00|01)$/.test(signature)) {
22+
const sigV = (parseInt(signature.slice(-2), 16) + 27).toString(16);
23+
signature = signature.slice(0, -2) + sigV;
24+
}
25+
26+
return signature;
27+
}
28+
}

src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ export interface IPresetBuilderOpts {
6767
// eslint-disable-next-line @typescript-eslint/no-empty-interface
6868
export interface ISigner extends Pick<ethers.Signer, "signMessage"> {}
6969

70+
export type EOASigner = ISigner & Pick<ethers.Signer, "getAddress">;
71+
7072
export interface ICall {
7173
to: string;
7274
value: BigNumberish;

0 commit comments

Comments
 (0)