@sovereign-sdk/signers 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -42,7 +42,7 @@ const message = new Uint8Array([/* your message */]);
42
42
  const signature = await signer.sign(message);
43
43
  ```
44
44
 
45
- ### Customer Signer Implementation
45
+ ### Custom Signer Implementation
46
46
 
47
47
  You can implement your own signer by implementing the `Signer` interface if your wallet is not currently supported.
48
48
 
@@ -51,7 +51,7 @@ import { Signer } from '@sovereign-sdk/signers';
51
51
 
52
52
  class MySigner implements Signer {
53
53
  publicKey() {
54
- // retireve the public key from your wallet
54
+ // retrieve the public key from your wallet
55
55
  return new Uint8Array([/* your public key */]);
56
56
  }
57
57
 
package/dist/index.d.mts CHANGED
@@ -65,16 +65,14 @@ declare const newMetaMaskSnapSigner: ({ curve, schema, snapId, ...rest }: MetaMa
65
65
 
66
66
  declare class Ed25519Signer implements Signer {
67
67
  private readonly privateKey;
68
- private readonly chainHash;
69
- constructor(privateKey: ed.Hex, chainHash: Uint8Array);
68
+ constructor(privateKey: ed.Hex);
70
69
  sign(message: Uint8Array): Promise<Uint8Array>;
71
70
  publicKey(): Promise<Uint8Array>;
72
71
  }
73
72
 
74
73
  declare class Secp256k1Signer implements Signer {
75
74
  private readonly privateKey;
76
- private readonly chainHash;
77
- constructor(privateKey: PrivKey, chainHash: Uint8Array);
75
+ constructor(privateKey: PrivKey);
78
76
  sign(message: Uint8Array): Promise<Uint8Array>;
79
77
  /** Returns the public key in compressed form. */
80
78
  publicKey(): Promise<Uint8Array>;
@@ -106,9 +104,8 @@ declare class PrivySignerError extends SignerError {
106
104
  }
107
105
  declare class PrivySigner implements Signer {
108
106
  private readonly provider;
109
- private readonly chainHash;
110
107
  private cachedPublicKey?;
111
- constructor(provider: EthereumProvider, chainHash: Uint8Array);
108
+ constructor(provider: EthereumProvider);
112
109
  private signProvider;
113
110
  sign(message: Uint8Array): Promise<Uint8Array>;
114
111
  /** Returns the public key in compressed form. */
package/dist/index.d.ts CHANGED
@@ -65,16 +65,14 @@ declare const newMetaMaskSnapSigner: ({ curve, schema, snapId, ...rest }: MetaMa
65
65
 
66
66
  declare class Ed25519Signer implements Signer {
67
67
  private readonly privateKey;
68
- private readonly chainHash;
69
- constructor(privateKey: ed.Hex, chainHash: Uint8Array);
68
+ constructor(privateKey: ed.Hex);
70
69
  sign(message: Uint8Array): Promise<Uint8Array>;
71
70
  publicKey(): Promise<Uint8Array>;
72
71
  }
73
72
 
74
73
  declare class Secp256k1Signer implements Signer {
75
74
  private readonly privateKey;
76
- private readonly chainHash;
77
- constructor(privateKey: PrivKey, chainHash: Uint8Array);
75
+ constructor(privateKey: PrivKey);
78
76
  sign(message: Uint8Array): Promise<Uint8Array>;
79
77
  /** Returns the public key in compressed form. */
80
78
  publicKey(): Promise<Uint8Array>;
@@ -106,9 +104,8 @@ declare class PrivySignerError extends SignerError {
106
104
  }
107
105
  declare class PrivySigner implements Signer {
108
106
  private readonly provider;
109
- private readonly chainHash;
110
107
  private cachedPublicKey?;
111
- constructor(provider: EthereumProvider, chainHash: Uint8Array);
108
+ constructor(provider: EthereumProvider);
112
109
  private signProvider;
113
110
  sign(message: Uint8Array): Promise<Uint8Array>;
114
111
  /** Returns the public key in compressed form. */
package/dist/index.js CHANGED
@@ -162,16 +162,12 @@ var newMetaMaskSnapSigner = (_a) => {
162
162
  // src/ed25519.ts
163
163
  var ed = __toESM(require("@noble/ed25519"));
164
164
  var Ed25519Signer = class {
165
- constructor(privateKey, chainHash) {
165
+ constructor(privateKey) {
166
166
  this.privateKey = privateKey;
167
- this.chainHash = chainHash;
168
167
  }
169
168
  sign(message) {
170
169
  return __async(this, null, function* () {
171
- return ed.signAsync(
172
- new Uint8Array([...message, ...this.chainHash]),
173
- this.privateKey
174
- );
170
+ return ed.signAsync(message, this.privateKey);
175
171
  });
176
172
  }
177
173
  publicKey() {
@@ -185,13 +181,12 @@ var Ed25519Signer = class {
185
181
  var import_sha3 = require("@noble/hashes/sha3");
186
182
  var import_secp256k1 = require("@noble/secp256k1");
187
183
  var Secp256k1Signer = class {
188
- constructor(privateKey, chainHash) {
184
+ constructor(privateKey) {
189
185
  this.privateKey = privateKey;
190
- this.chainHash = chainHash;
191
186
  }
192
187
  sign(message) {
193
188
  return __async(this, null, function* () {
194
- const msgHash = (0, import_sha3.keccak_256)(new Uint8Array([...message, ...this.chainHash]));
189
+ const msgHash = (0, import_sha3.keccak_256)(message);
195
190
  const signature = yield (0, import_secp256k1.signAsync)(msgHash, this.privateKey);
196
191
  return signature.toCompactRawBytes();
197
192
  });
@@ -213,9 +208,8 @@ var PrivySignerError = class extends SignerError {
213
208
  }
214
209
  };
215
210
  var PrivySigner = class {
216
- constructor(provider, chainHash) {
211
+ constructor(provider) {
217
212
  this.provider = provider;
218
- this.chainHash = chainHash;
219
213
  }
220
214
  signProvider(messageHash) {
221
215
  return __async(this, null, function* () {
@@ -228,8 +222,7 @@ var PrivySigner = class {
228
222
  }
229
223
  sign(message) {
230
224
  return __async(this, null, function* () {
231
- const data = new Uint8Array([...message, ...this.chainHash]);
232
- const digest = import_ethers.ethers.keccak256(data);
225
+ const digest = import_ethers.ethers.keccak256(message);
233
226
  const signatureBytes = yield this.signProvider(digest);
234
227
  const signature = import_ethers.Signature.from(signatureBytes);
235
228
  this.cachePublicKey(digest, signature);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/snap.ts","../src/errors.ts","../src/ed25519.ts","../src/secp256k1.ts","../src/privy.ts"],"sourcesContent":["export * from \"./signer\";\nexport * from \"./snap\";\nexport * from \"./ed25519\";\nexport * from \"./secp256k1\";\nexport * from \"./privy\";\n","/// <reference path=\"./snap-env.d.ts\" />\n\nimport type { MetaMaskInpageProvider } from \"@metamask/providers\";\nimport { bytesToHex, hexToBytes } from \"@sovereign-sdk/utils\";\nimport { SignerError } from \"./errors\";\nimport type { Signer, SignerOpt } from \"./signer\";\n\n/**\n * Options for initializing a MetaMask Snap signer.\n */\nexport type MetaMaskSnapSignerOpt = {\n /**\n * The {@link MetaMaskInpageProvider} to use for the signer.\n *\n * If not provided, the signer will attempt to use the global `window.ethereum` provider.\n */\n provider?: MetaMaskInpageProvider;\n /**\n * The snap ID to use for the signer.\n *\n * Defaults to `npm:@sovereign-sdk/metamask-snap`.\n * Can be changed to `local:localhost:8080` for local development.\n */\n snapId?: string;\n} & SignerOpt;\n\n/**\n * Create a new MetaMask Snap signer.\n *\n * @param options - The {@link MetaMaskSnapSignerOpt} options.\n * @returns A {@link Signer} implementation utilizing Sovereign's MetaMask Snap.\n */\nexport const newMetaMaskSnapSigner = ({\n curve,\n schema,\n snapId = \"npm:@sovereign-sdk/metamask-snap\",\n ...rest\n}: MetaMaskSnapSignerOpt): Signer => {\n const signerId = \"MetaMaskSnap\";\n const provider = rest.provider ?? window.ethereum;\n\n if (!provider) {\n throw new SignerError(\"Failed to find provider for signer\", signerId);\n }\n\n const assertSupported = async () => {\n try {\n await provider.request({\n method: \"wallet_getSnaps\",\n });\n } catch {\n throw new SignerError(\n \"Provider does not support MetaMask snaps\",\n signerId,\n );\n }\n };\n\n const path = 0;\n\n return {\n async publicKey() {\n await assertSupported();\n\n const args = {\n method: \"wallet_invokeSnap\",\n params: {\n snapId,\n request: {\n method: \"getPublicKey\",\n params: { path, curve },\n },\n },\n };\n // biome-ignore lint/suspicious/noExplicitAny: todo\n const { publicKey } = (await provider.request(args)) as any;\n\n return hexToBytes(publicKey);\n },\n async sign(message: Uint8Array) {\n await assertSupported();\n\n const args = {\n method: \"wallet_invokeSnap\",\n params: {\n snapId,\n request: {\n method: \"signTransaction\",\n params: { unsignedTxHex: bytesToHex(message), schema, curve, path },\n },\n },\n };\n // biome-ignore lint/suspicious/noExplicitAny: todo\n const { signature } = (await provider.request(args)) as any;\n\n return hexToBytes(signature);\n },\n };\n};\n","/**\n * An error that can be thrown by a signer.\n */\nexport class SignerError extends Error {\n public readonly signerId: string;\n\n /**\n * Create a new SignerError.\n *\n * @param message - The error message\n * @param signerId - The ID of the signer that threw the error\n */\n constructor(message: string, signerId: string) {\n super(`[${signerId}] ${message}`);\n\n this.signerId = signerId;\n this.name = this.constructor.name;\n this.stack = new Error().stack;\n }\n}\n","import * as ed from \"@noble/ed25519\";\nimport type { Signer } from \"./signer\";\n\nexport class Ed25519Signer implements Signer {\n private readonly privateKey: ed.Hex;\n private readonly chainHash: Uint8Array;\n\n constructor(privateKey: ed.Hex, chainHash: Uint8Array) {\n this.privateKey = privateKey;\n this.chainHash = chainHash;\n }\n\n public async sign(message: Uint8Array): Promise<Uint8Array> {\n return ed.signAsync(\n new Uint8Array([...message, ...this.chainHash]),\n this.privateKey,\n );\n }\n\n async publicKey() {\n return ed.getPublicKeyAsync(this.privateKey);\n }\n}\n","import { keccak_256 } from \"@noble/hashes/sha3\";\nimport { type PrivKey, getPublicKey, signAsync } from \"@noble/secp256k1\";\nimport type { Signer } from \"./signer\";\n\nexport class Secp256k1Signer implements Signer {\n private readonly privateKey: PrivKey;\n private readonly chainHash: Uint8Array;\n\n constructor(privateKey: PrivKey, chainHash: Uint8Array) {\n this.privateKey = privateKey;\n this.chainHash = chainHash;\n }\n\n public async sign(message: Uint8Array): Promise<Uint8Array> {\n const msgHash = keccak_256(new Uint8Array([...message, ...this.chainHash]));\n const signature = await signAsync(msgHash, this.privateKey);\n\n return signature.toCompactRawBytes();\n }\n\n /** Returns the public key in compressed form. */\n public async publicKey(): Promise<Uint8Array> {\n return getPublicKey(this.privateKey, true);\n }\n}\n","import * as secp from \"@noble/secp256k1\";\nimport { Signature, ethers } from \"ethers\";\nimport { SignerError } from \"./errors\";\nimport type { Signer } from \"./signer\";\n\n/** Minimal EIP-1193 provider interface (exposed by Privy wallets). */\nexport type EthereumProvider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n};\n\nexport class PrivySignerError extends SignerError {\n constructor(message: string) {\n super(message, \"Privy\");\n }\n}\n\nexport class PrivySigner implements Signer {\n private readonly provider: EthereumProvider;\n private readonly chainHash: Uint8Array;\n private cachedPublicKey?: Uint8Array;\n\n constructor(provider: EthereumProvider, chainHash: Uint8Array) {\n this.provider = provider;\n this.chainHash = chainHash;\n }\n\n private async signProvider(messageHash: string): Promise<string> {\n const signatureHex = await this.provider.request({\n method: \"secp256k1_sign\",\n params: [messageHash],\n });\n return signatureHex as string;\n }\n\n async sign(message: Uint8Array): Promise<Uint8Array> {\n const data = new Uint8Array([...message, ...this.chainHash]);\n const digest = ethers.keccak256(data);\n const signatureBytes = await this.signProvider(digest);\n const signature = Signature.from(signatureBytes);\n this.cachePublicKey(digest, signature);\n return ethers.getBytes(ethers.concat([signature.r, signature.s]));\n }\n\n /** Returns the public key in compressed form. */\n async publicKey(): Promise<Uint8Array> {\n if (!this.cachedPublicKey) {\n throw new PrivySignerError(\n \"Public key was not available, you must call sign() first\",\n );\n }\n\n return this.cachedPublicKey;\n }\n\n private cachePublicKey(msgHash: string, signature: Signature) {\n if (this.cachedPublicKey) return;\n\n let secpSig = secp.Signature.fromCompact(\n ethers.getBytesCopy(ethers.concat([signature.r, signature.s])),\n );\n secpSig = secpSig.addRecoveryBit(signature.yParity);\n const publicKey = secpSig.recoverPublicKey(ethers.getBytes(msgHash));\n\n this.cachedPublicKey = publicKey.toBytes(true);\n }\n}\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/snap.ts","../src/errors.ts","../src/ed25519.ts","../src/secp256k1.ts","../src/privy.ts"],"sourcesContent":["export * from \"./signer\";\nexport * from \"./snap\";\nexport * from \"./ed25519\";\nexport * from \"./secp256k1\";\nexport * from \"./privy\";\n","/// <reference path=\"./snap-env.d.ts\" />\n\nimport type { MetaMaskInpageProvider } from \"@metamask/providers\";\nimport { bytesToHex, hexToBytes } from \"@sovereign-sdk/utils\";\nimport { SignerError } from \"./errors\";\nimport type { Signer, SignerOpt } from \"./signer\";\n\n/**\n * Options for initializing a MetaMask Snap signer.\n */\nexport type MetaMaskSnapSignerOpt = {\n /**\n * The {@link MetaMaskInpageProvider} to use for the signer.\n *\n * If not provided, the signer will attempt to use the global `window.ethereum` provider.\n */\n provider?: MetaMaskInpageProvider;\n /**\n * The snap ID to use for the signer.\n *\n * Defaults to `npm:@sovereign-sdk/metamask-snap`.\n * Can be changed to `local:localhost:8080` for local development.\n */\n snapId?: string;\n} & SignerOpt;\n\n/**\n * Create a new MetaMask Snap signer.\n *\n * @param options - The {@link MetaMaskSnapSignerOpt} options.\n * @returns A {@link Signer} implementation utilizing Sovereign's MetaMask Snap.\n */\nexport const newMetaMaskSnapSigner = ({\n curve,\n schema,\n snapId = \"npm:@sovereign-sdk/metamask-snap\",\n ...rest\n}: MetaMaskSnapSignerOpt): Signer => {\n const signerId = \"MetaMaskSnap\";\n const provider = rest.provider ?? window.ethereum;\n\n if (!provider) {\n throw new SignerError(\"Failed to find provider for signer\", signerId);\n }\n\n const assertSupported = async () => {\n try {\n await provider.request({\n method: \"wallet_getSnaps\",\n });\n } catch {\n throw new SignerError(\n \"Provider does not support MetaMask snaps\",\n signerId,\n );\n }\n };\n\n const path = 0;\n\n return {\n async publicKey() {\n await assertSupported();\n\n const args = {\n method: \"wallet_invokeSnap\",\n params: {\n snapId,\n request: {\n method: \"getPublicKey\",\n params: { path, curve },\n },\n },\n };\n // biome-ignore lint/suspicious/noExplicitAny: todo\n const { publicKey } = (await provider.request(args)) as any;\n\n return hexToBytes(publicKey);\n },\n async sign(message: Uint8Array) {\n await assertSupported();\n\n const args = {\n method: \"wallet_invokeSnap\",\n params: {\n snapId,\n request: {\n method: \"signTransaction\",\n params: { unsignedTxHex: bytesToHex(message), schema, curve, path },\n },\n },\n };\n // biome-ignore lint/suspicious/noExplicitAny: todo\n const { signature } = (await provider.request(args)) as any;\n\n return hexToBytes(signature);\n },\n };\n};\n","/**\n * An error that can be thrown by a signer.\n */\nexport class SignerError extends Error {\n public readonly signerId: string;\n\n /**\n * Create a new SignerError.\n *\n * @param message - The error message\n * @param signerId - The ID of the signer that threw the error\n */\n constructor(message: string, signerId: string) {\n super(`[${signerId}] ${message}`);\n\n this.signerId = signerId;\n this.name = this.constructor.name;\n this.stack = new Error().stack;\n }\n}\n","import * as ed from \"@noble/ed25519\";\nimport type { Signer } from \"./signer\";\n\nexport class Ed25519Signer implements Signer {\n private readonly privateKey: ed.Hex;\n\n constructor(privateKey: ed.Hex) {\n this.privateKey = privateKey;\n }\n\n public async sign(message: Uint8Array): Promise<Uint8Array> {\n return ed.signAsync(message, this.privateKey);\n }\n\n async publicKey() {\n return ed.getPublicKeyAsync(this.privateKey);\n }\n}\n","import { keccak_256 } from \"@noble/hashes/sha3\";\nimport { type PrivKey, getPublicKey, signAsync } from \"@noble/secp256k1\";\nimport type { Signer } from \"./signer\";\n\nexport class Secp256k1Signer implements Signer {\n private readonly privateKey: PrivKey;\n\n constructor(privateKey: PrivKey) {\n this.privateKey = privateKey;\n }\n\n public async sign(message: Uint8Array): Promise<Uint8Array> {\n const msgHash = keccak_256(message);\n const signature = await signAsync(msgHash, this.privateKey);\n\n return signature.toCompactRawBytes();\n }\n\n /** Returns the public key in compressed form. */\n public async publicKey(): Promise<Uint8Array> {\n return getPublicKey(this.privateKey, true);\n }\n}\n","import * as secp from \"@noble/secp256k1\";\nimport { Signature, ethers } from \"ethers\";\nimport { SignerError } from \"./errors\";\nimport type { Signer } from \"./signer\";\n\n/** Minimal EIP-1193 provider interface (exposed by Privy wallets). */\nexport type EthereumProvider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n};\n\nexport class PrivySignerError extends SignerError {\n constructor(message: string) {\n super(message, \"Privy\");\n }\n}\n\nexport class PrivySigner implements Signer {\n private readonly provider: EthereumProvider;\n private cachedPublicKey?: Uint8Array;\n\n constructor(provider: EthereumProvider) {\n this.provider = provider;\n }\n\n private async signProvider(messageHash: string): Promise<string> {\n const signatureHex = await this.provider.request({\n method: \"secp256k1_sign\",\n params: [messageHash],\n });\n return signatureHex as string;\n }\n\n async sign(message: Uint8Array): Promise<Uint8Array> {\n const digest = ethers.keccak256(message);\n const signatureBytes = await this.signProvider(digest);\n const signature = Signature.from(signatureBytes);\n this.cachePublicKey(digest, signature);\n return ethers.getBytes(ethers.concat([signature.r, signature.s]));\n }\n\n /** Returns the public key in compressed form. */\n async publicKey(): Promise<Uint8Array> {\n if (!this.cachedPublicKey) {\n throw new PrivySignerError(\n \"Public key was not available, you must call sign() first\",\n );\n }\n\n return this.cachedPublicKey;\n }\n\n private cachePublicKey(msgHash: string, signature: Signature) {\n if (this.cachedPublicKey) return;\n\n let secpSig = secp.Signature.fromCompact(\n ethers.getBytesCopy(ethers.concat([signature.r, signature.s])),\n );\n secpSig = secpSig.addRecoveryBit(signature.yParity);\n const publicKey = secpSig.recoverPublicKey(ethers.getBytes(msgHash));\n\n this.cachedPublicKey = publicKey.toBytes(true);\n }\n}\n"],"mappings":"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","names":["_a"]}
package/dist/index.mjs CHANGED
@@ -124,16 +124,12 @@ var newMetaMaskSnapSigner = (_a) => {
124
124
  // src/ed25519.ts
125
125
  import * as ed from "@noble/ed25519";
126
126
  var Ed25519Signer = class {
127
- constructor(privateKey, chainHash) {
127
+ constructor(privateKey) {
128
128
  this.privateKey = privateKey;
129
- this.chainHash = chainHash;
130
129
  }
131
130
  sign(message) {
132
131
  return __async(this, null, function* () {
133
- return ed.signAsync(
134
- new Uint8Array([...message, ...this.chainHash]),
135
- this.privateKey
136
- );
132
+ return ed.signAsync(message, this.privateKey);
137
133
  });
138
134
  }
139
135
  publicKey() {
@@ -147,13 +143,12 @@ var Ed25519Signer = class {
147
143
  import { keccak_256 } from "@noble/hashes/sha3";
148
144
  import { getPublicKey, signAsync as signAsync2 } from "@noble/secp256k1";
149
145
  var Secp256k1Signer = class {
150
- constructor(privateKey, chainHash) {
146
+ constructor(privateKey) {
151
147
  this.privateKey = privateKey;
152
- this.chainHash = chainHash;
153
148
  }
154
149
  sign(message) {
155
150
  return __async(this, null, function* () {
156
- const msgHash = keccak_256(new Uint8Array([...message, ...this.chainHash]));
151
+ const msgHash = keccak_256(message);
157
152
  const signature = yield signAsync2(msgHash, this.privateKey);
158
153
  return signature.toCompactRawBytes();
159
154
  });
@@ -175,9 +170,8 @@ var PrivySignerError = class extends SignerError {
175
170
  }
176
171
  };
177
172
  var PrivySigner = class {
178
- constructor(provider, chainHash) {
173
+ constructor(provider) {
179
174
  this.provider = provider;
180
- this.chainHash = chainHash;
181
175
  }
182
176
  signProvider(messageHash) {
183
177
  return __async(this, null, function* () {
@@ -190,8 +184,7 @@ var PrivySigner = class {
190
184
  }
191
185
  sign(message) {
192
186
  return __async(this, null, function* () {
193
- const data = new Uint8Array([...message, ...this.chainHash]);
194
- const digest = ethers.keccak256(data);
187
+ const digest = ethers.keccak256(message);
195
188
  const signatureBytes = yield this.signProvider(digest);
196
189
  const signature = Signature2.from(signatureBytes);
197
190
  this.cachePublicKey(digest, signature);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/snap.ts","../src/errors.ts","../src/ed25519.ts","../src/secp256k1.ts","../src/privy.ts"],"sourcesContent":["/// <reference path=\"./snap-env.d.ts\" />\n\nimport type { MetaMaskInpageProvider } from \"@metamask/providers\";\nimport { bytesToHex, hexToBytes } from \"@sovereign-sdk/utils\";\nimport { SignerError } from \"./errors\";\nimport type { Signer, SignerOpt } from \"./signer\";\n\n/**\n * Options for initializing a MetaMask Snap signer.\n */\nexport type MetaMaskSnapSignerOpt = {\n /**\n * The {@link MetaMaskInpageProvider} to use for the signer.\n *\n * If not provided, the signer will attempt to use the global `window.ethereum` provider.\n */\n provider?: MetaMaskInpageProvider;\n /**\n * The snap ID to use for the signer.\n *\n * Defaults to `npm:@sovereign-sdk/metamask-snap`.\n * Can be changed to `local:localhost:8080` for local development.\n */\n snapId?: string;\n} & SignerOpt;\n\n/**\n * Create a new MetaMask Snap signer.\n *\n * @param options - The {@link MetaMaskSnapSignerOpt} options.\n * @returns A {@link Signer} implementation utilizing Sovereign's MetaMask Snap.\n */\nexport const newMetaMaskSnapSigner = ({\n curve,\n schema,\n snapId = \"npm:@sovereign-sdk/metamask-snap\",\n ...rest\n}: MetaMaskSnapSignerOpt): Signer => {\n const signerId = \"MetaMaskSnap\";\n const provider = rest.provider ?? window.ethereum;\n\n if (!provider) {\n throw new SignerError(\"Failed to find provider for signer\", signerId);\n }\n\n const assertSupported = async () => {\n try {\n await provider.request({\n method: \"wallet_getSnaps\",\n });\n } catch {\n throw new SignerError(\n \"Provider does not support MetaMask snaps\",\n signerId,\n );\n }\n };\n\n const path = 0;\n\n return {\n async publicKey() {\n await assertSupported();\n\n const args = {\n method: \"wallet_invokeSnap\",\n params: {\n snapId,\n request: {\n method: \"getPublicKey\",\n params: { path, curve },\n },\n },\n };\n // biome-ignore lint/suspicious/noExplicitAny: todo\n const { publicKey } = (await provider.request(args)) as any;\n\n return hexToBytes(publicKey);\n },\n async sign(message: Uint8Array) {\n await assertSupported();\n\n const args = {\n method: \"wallet_invokeSnap\",\n params: {\n snapId,\n request: {\n method: \"signTransaction\",\n params: { unsignedTxHex: bytesToHex(message), schema, curve, path },\n },\n },\n };\n // biome-ignore lint/suspicious/noExplicitAny: todo\n const { signature } = (await provider.request(args)) as any;\n\n return hexToBytes(signature);\n },\n };\n};\n","/**\n * An error that can be thrown by a signer.\n */\nexport class SignerError extends Error {\n public readonly signerId: string;\n\n /**\n * Create a new SignerError.\n *\n * @param message - The error message\n * @param signerId - The ID of the signer that threw the error\n */\n constructor(message: string, signerId: string) {\n super(`[${signerId}] ${message}`);\n\n this.signerId = signerId;\n this.name = this.constructor.name;\n this.stack = new Error().stack;\n }\n}\n","import * as ed from \"@noble/ed25519\";\nimport type { Signer } from \"./signer\";\n\nexport class Ed25519Signer implements Signer {\n private readonly privateKey: ed.Hex;\n private readonly chainHash: Uint8Array;\n\n constructor(privateKey: ed.Hex, chainHash: Uint8Array) {\n this.privateKey = privateKey;\n this.chainHash = chainHash;\n }\n\n public async sign(message: Uint8Array): Promise<Uint8Array> {\n return ed.signAsync(\n new Uint8Array([...message, ...this.chainHash]),\n this.privateKey,\n );\n }\n\n async publicKey() {\n return ed.getPublicKeyAsync(this.privateKey);\n }\n}\n","import { keccak_256 } from \"@noble/hashes/sha3\";\nimport { type PrivKey, getPublicKey, signAsync } from \"@noble/secp256k1\";\nimport type { Signer } from \"./signer\";\n\nexport class Secp256k1Signer implements Signer {\n private readonly privateKey: PrivKey;\n private readonly chainHash: Uint8Array;\n\n constructor(privateKey: PrivKey, chainHash: Uint8Array) {\n this.privateKey = privateKey;\n this.chainHash = chainHash;\n }\n\n public async sign(message: Uint8Array): Promise<Uint8Array> {\n const msgHash = keccak_256(new Uint8Array([...message, ...this.chainHash]));\n const signature = await signAsync(msgHash, this.privateKey);\n\n return signature.toCompactRawBytes();\n }\n\n /** Returns the public key in compressed form. */\n public async publicKey(): Promise<Uint8Array> {\n return getPublicKey(this.privateKey, true);\n }\n}\n","import * as secp from \"@noble/secp256k1\";\nimport { Signature, ethers } from \"ethers\";\nimport { SignerError } from \"./errors\";\nimport type { Signer } from \"./signer\";\n\n/** Minimal EIP-1193 provider interface (exposed by Privy wallets). */\nexport type EthereumProvider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n};\n\nexport class PrivySignerError extends SignerError {\n constructor(message: string) {\n super(message, \"Privy\");\n }\n}\n\nexport class PrivySigner implements Signer {\n private readonly provider: EthereumProvider;\n private readonly chainHash: Uint8Array;\n private cachedPublicKey?: Uint8Array;\n\n constructor(provider: EthereumProvider, chainHash: Uint8Array) {\n this.provider = provider;\n this.chainHash = chainHash;\n }\n\n private async signProvider(messageHash: string): Promise<string> {\n const signatureHex = await this.provider.request({\n method: \"secp256k1_sign\",\n params: [messageHash],\n });\n return signatureHex as string;\n }\n\n async sign(message: Uint8Array): Promise<Uint8Array> {\n const data = new Uint8Array([...message, ...this.chainHash]);\n const digest = ethers.keccak256(data);\n const signatureBytes = await this.signProvider(digest);\n const signature = Signature.from(signatureBytes);\n this.cachePublicKey(digest, signature);\n return ethers.getBytes(ethers.concat([signature.r, signature.s]));\n }\n\n /** Returns the public key in compressed form. */\n async publicKey(): Promise<Uint8Array> {\n if (!this.cachedPublicKey) {\n throw new PrivySignerError(\n \"Public key was not available, you must call sign() first\",\n );\n }\n\n return this.cachedPublicKey;\n }\n\n private cachePublicKey(msgHash: string, signature: Signature) {\n if (this.cachedPublicKey) return;\n\n let secpSig = secp.Signature.fromCompact(\n ethers.getBytesCopy(ethers.concat([signature.r, signature.s])),\n );\n secpSig = secpSig.addRecoveryBit(signature.yParity);\n const publicKey = secpSig.recoverPublicKey(ethers.getBytes(msgHash));\n\n this.cachedPublicKey = publicKey.toBytes(true);\n }\n}\n"],"mappings":"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","names":["_a","signAsync","signAsync","Signature","Signature"]}
1
+ {"version":3,"sources":["../src/snap.ts","../src/errors.ts","../src/ed25519.ts","../src/secp256k1.ts","../src/privy.ts"],"sourcesContent":["/// <reference path=\"./snap-env.d.ts\" />\n\nimport type { MetaMaskInpageProvider } from \"@metamask/providers\";\nimport { bytesToHex, hexToBytes } from \"@sovereign-sdk/utils\";\nimport { SignerError } from \"./errors\";\nimport type { Signer, SignerOpt } from \"./signer\";\n\n/**\n * Options for initializing a MetaMask Snap signer.\n */\nexport type MetaMaskSnapSignerOpt = {\n /**\n * The {@link MetaMaskInpageProvider} to use for the signer.\n *\n * If not provided, the signer will attempt to use the global `window.ethereum` provider.\n */\n provider?: MetaMaskInpageProvider;\n /**\n * The snap ID to use for the signer.\n *\n * Defaults to `npm:@sovereign-sdk/metamask-snap`.\n * Can be changed to `local:localhost:8080` for local development.\n */\n snapId?: string;\n} & SignerOpt;\n\n/**\n * Create a new MetaMask Snap signer.\n *\n * @param options - The {@link MetaMaskSnapSignerOpt} options.\n * @returns A {@link Signer} implementation utilizing Sovereign's MetaMask Snap.\n */\nexport const newMetaMaskSnapSigner = ({\n curve,\n schema,\n snapId = \"npm:@sovereign-sdk/metamask-snap\",\n ...rest\n}: MetaMaskSnapSignerOpt): Signer => {\n const signerId = \"MetaMaskSnap\";\n const provider = rest.provider ?? window.ethereum;\n\n if (!provider) {\n throw new SignerError(\"Failed to find provider for signer\", signerId);\n }\n\n const assertSupported = async () => {\n try {\n await provider.request({\n method: \"wallet_getSnaps\",\n });\n } catch {\n throw new SignerError(\n \"Provider does not support MetaMask snaps\",\n signerId,\n );\n }\n };\n\n const path = 0;\n\n return {\n async publicKey() {\n await assertSupported();\n\n const args = {\n method: \"wallet_invokeSnap\",\n params: {\n snapId,\n request: {\n method: \"getPublicKey\",\n params: { path, curve },\n },\n },\n };\n // biome-ignore lint/suspicious/noExplicitAny: todo\n const { publicKey } = (await provider.request(args)) as any;\n\n return hexToBytes(publicKey);\n },\n async sign(message: Uint8Array) {\n await assertSupported();\n\n const args = {\n method: \"wallet_invokeSnap\",\n params: {\n snapId,\n request: {\n method: \"signTransaction\",\n params: { unsignedTxHex: bytesToHex(message), schema, curve, path },\n },\n },\n };\n // biome-ignore lint/suspicious/noExplicitAny: todo\n const { signature } = (await provider.request(args)) as any;\n\n return hexToBytes(signature);\n },\n };\n};\n","/**\n * An error that can be thrown by a signer.\n */\nexport class SignerError extends Error {\n public readonly signerId: string;\n\n /**\n * Create a new SignerError.\n *\n * @param message - The error message\n * @param signerId - The ID of the signer that threw the error\n */\n constructor(message: string, signerId: string) {\n super(`[${signerId}] ${message}`);\n\n this.signerId = signerId;\n this.name = this.constructor.name;\n this.stack = new Error().stack;\n }\n}\n","import * as ed from \"@noble/ed25519\";\nimport type { Signer } from \"./signer\";\n\nexport class Ed25519Signer implements Signer {\n private readonly privateKey: ed.Hex;\n\n constructor(privateKey: ed.Hex) {\n this.privateKey = privateKey;\n }\n\n public async sign(message: Uint8Array): Promise<Uint8Array> {\n return ed.signAsync(message, this.privateKey);\n }\n\n async publicKey() {\n return ed.getPublicKeyAsync(this.privateKey);\n }\n}\n","import { keccak_256 } from \"@noble/hashes/sha3\";\nimport { type PrivKey, getPublicKey, signAsync } from \"@noble/secp256k1\";\nimport type { Signer } from \"./signer\";\n\nexport class Secp256k1Signer implements Signer {\n private readonly privateKey: PrivKey;\n\n constructor(privateKey: PrivKey) {\n this.privateKey = privateKey;\n }\n\n public async sign(message: Uint8Array): Promise<Uint8Array> {\n const msgHash = keccak_256(message);\n const signature = await signAsync(msgHash, this.privateKey);\n\n return signature.toCompactRawBytes();\n }\n\n /** Returns the public key in compressed form. */\n public async publicKey(): Promise<Uint8Array> {\n return getPublicKey(this.privateKey, true);\n }\n}\n","import * as secp from \"@noble/secp256k1\";\nimport { Signature, ethers } from \"ethers\";\nimport { SignerError } from \"./errors\";\nimport type { Signer } from \"./signer\";\n\n/** Minimal EIP-1193 provider interface (exposed by Privy wallets). */\nexport type EthereumProvider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n};\n\nexport class PrivySignerError extends SignerError {\n constructor(message: string) {\n super(message, \"Privy\");\n }\n}\n\nexport class PrivySigner implements Signer {\n private readonly provider: EthereumProvider;\n private cachedPublicKey?: Uint8Array;\n\n constructor(provider: EthereumProvider) {\n this.provider = provider;\n }\n\n private async signProvider(messageHash: string): Promise<string> {\n const signatureHex = await this.provider.request({\n method: \"secp256k1_sign\",\n params: [messageHash],\n });\n return signatureHex as string;\n }\n\n async sign(message: Uint8Array): Promise<Uint8Array> {\n const digest = ethers.keccak256(message);\n const signatureBytes = await this.signProvider(digest);\n const signature = Signature.from(signatureBytes);\n this.cachePublicKey(digest, signature);\n return ethers.getBytes(ethers.concat([signature.r, signature.s]));\n }\n\n /** Returns the public key in compressed form. */\n async publicKey(): Promise<Uint8Array> {\n if (!this.cachedPublicKey) {\n throw new PrivySignerError(\n \"Public key was not available, you must call sign() first\",\n );\n }\n\n return this.cachedPublicKey;\n }\n\n private cachePublicKey(msgHash: string, signature: Signature) {\n if (this.cachedPublicKey) return;\n\n let secpSig = secp.Signature.fromCompact(\n ethers.getBytesCopy(ethers.concat([signature.r, signature.s])),\n );\n secpSig = secpSig.addRecoveryBit(signature.yParity);\n const publicKey = secpSig.recoverPublicKey(ethers.getBytes(msgHash));\n\n this.cachedPublicKey = publicKey.toBytes(true);\n }\n}\n"],"mappings":"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","names":["_a","signAsync","signAsync","Signature","Signature"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sovereign-sdk/signers",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Signer interface and default implementations for use with Sovereign SDK applications",
5
5
  "repository": "github:Sovereign-Labs/sovereign-sdk-web3-js",
6
6
  "files": [
@@ -36,7 +36,7 @@
36
36
  "@noble/hashes": "^1.5.0",
37
37
  "@noble/secp256k1": "^2.3.0",
38
38
  "ethers": "^6.15.0",
39
- "@sovereign-sdk/utils": "^0.0.3"
39
+ "@sovereign-sdk/utils": "^0.0.4"
40
40
  },
41
41
  "scripts": {
42
42
  "build": "tsup",