@sovereign-sdk/signers 0.5.1 → 0.5.3

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/dist/wasm.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wasm/eip712.ts","../src/errors.ts"],"sourcesContent":["import type { MetaMaskInpageProvider } from \"@metamask/providers\";\nimport * as secp from \"@noble/secp256k1\";\nimport { KnownTypeId, Schema } from \"@sovereign-sdk/universal-wallet-wasm\";\nimport { hexToBytes } from \"@sovereign-sdk/utils\";\nimport { Signature } from \"ethers\";\nimport { SignerError } from \"../errors\";\nimport type { Signer } from \"../signer\";\n\n/**\n * EIP-712 signer implementation that uses MetaMask's eth_signTypedData_v4 method.\n *\n * This signer expects the message to be a valid UnsignedTransaction that can be\n * parsed by the schema's eip712Json() method.\n *\n * The signer uses the provided address for signing operations.\n */\nexport class Eip712Signer implements Signer {\n private readonly provider: MetaMaskInpageProvider;\n private readonly schema: Schema;\n private readonly address: string;\n private cachedPublicKey?: Uint8Array;\n private static readonly SIGNER_ID = \"Eip712\";\n\n constructor(\n provider: MetaMaskInpageProvider,\n schemaJson: Record<string, unknown>,\n address: string,\n ) {\n if (!address) {\n throw new SignerError(\"Address is required\", Eip712Signer.SIGNER_ID);\n }\n this.provider = provider;\n this.schema = Schema.fromJSON(JSON.stringify(schemaJson));\n this.address = address;\n }\n\n /**\n * Cache the public key recovered from a signature.\n */\n private cachePublicKey(signingHash: Uint8Array, signature: Signature): void {\n if (this.cachedPublicKey) return;\n\n let secpSig = secp.Signature.fromCompact(\n new Uint8Array([\n ...hexToBytes(signature.r.slice(2)),\n ...hexToBytes(signature.s.slice(2)),\n ]),\n );\n secpSig = secpSig.addRecoveryBit(signature.yParity);\n const publicKey = secpSig.recoverPublicKey(signingHash);\n\n this.cachedPublicKey = publicKey.toBytes(true); // compressed form\n }\n\n /**\n * Get the public key. Requires sign() to be called first to recover the key from a signature.\n */\n async publicKey(): Promise<Uint8Array> {\n if (!this.cachedPublicKey) {\n throw new SignerError(\n \"Public key was not available, you must call sign() first\",\n Eip712Signer.SIGNER_ID,\n );\n }\n\n return this.cachedPublicKey;\n }\n\n /**\n * Sign an UnsignedTransaction using EIP-712 typed data signing.\n */\n async sign(message: Uint8Array): Promise<Uint8Array> {\n const address = this.address;\n\n // Rollups invoke the signer with the chain hash appended, so drop the last 32 bytes of the message\n if (message.length < 32) {\n throw new SignerError(\n \"Message too short, expected at least 32 bytes for chain hash\",\n Eip712Signer.SIGNER_ID,\n );\n }\n const unsignedTxBytes = message.slice(0, -32);\n\n // Get the UnsignedTransaction type index\n const typeIndex = this.schema.knownTypeIndex(\n KnownTypeId.UnsignedTransaction,\n );\n\n // Generate the EIP-712 JSON from the message bytes\n let eip712Json: string;\n try {\n eip712Json = this.schema.eip712Json(typeIndex, unsignedTxBytes);\n } catch (error) {\n throw new SignerError(\n `Failed to generate EIP-712 JSON from message: ${error}`,\n Eip712Signer.SIGNER_ID,\n );\n }\n\n // Get the EIP-712 signing hash for public key recovery\n let signingHash: Uint8Array;\n try {\n signingHash = this.schema.eip712SigningHash(typeIndex, unsignedTxBytes);\n } catch (error) {\n throw new SignerError(\n `Failed to generate EIP-712 signing hash: ${error}`,\n Eip712Signer.SIGNER_ID,\n );\n }\n\n let signatureHex: string;\n try {\n signatureHex = (await this.provider.request({\n method: \"eth_signTypedData_v4\",\n params: [address, eip712Json],\n })) as string;\n } catch (error) {\n throw new SignerError(\n `Failed to sign with EIP-712: ${error}`,\n Eip712Signer.SIGNER_ID,\n );\n }\n\n // Parse the signature for public key recovery\n const signature = Signature.from(signatureHex);\n this.cachePublicKey(signingHash, signature);\n\n // Return the standard compact serialized signature (r + s, 64 bytes)\n return hexToBytes(signature.compactSerialized.slice(2));\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA,YAAY,UAAU;AACtB,SAAS,aAAa,cAAc;AACpC,SAAS,kBAAkB;AAC3B,SAAS,aAAAA,kBAAiB;;;ACDnB,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASrC,YAAY,SAAiB,UAAkB;AAC7C,UAAM,IAAI,QAAQ,KAAK,OAAO,EAAE;AAEhC,SAAK,WAAW;AAChB,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,QAAQ,IAAI,MAAM,EAAE;AAAA,EAC3B;AACF;;;ADHO,IAAM,gBAAN,MAAM,cAA+B;AAAA,EAO1C,YACE,UACA,YACA,SACA;AACA,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,YAAY,uBAAuB,cAAa,SAAS;AAAA,IACrE;AACA,SAAK,WAAW;AAChB,SAAK,SAAS,OAAO,SAAS,KAAK,UAAU,UAAU,CAAC;AACxD,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,aAAyB,WAA4B;AAC1E,QAAI,KAAK,gBAAiB;AAE1B,QAAI,UAAe,eAAU;AAAA,MAC3B,IAAI,WAAW;AAAA,QACb,GAAG,WAAW,UAAU,EAAE,MAAM,CAAC,CAAC;AAAA,QAClC,GAAG,WAAW,UAAU,EAAE,MAAM,CAAC,CAAC;AAAA,MACpC,CAAC;AAAA,IACH;AACA,cAAU,QAAQ,eAAe,UAAU,OAAO;AAClD,UAAM,YAAY,QAAQ,iBAAiB,WAAW;AAEtD,SAAK,kBAAkB,UAAU,QAAQ,IAAI;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKM,YAAiC;AAAA;AACrC,UAAI,CAAC,KAAK,iBAAiB;AACzB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,cAAa;AAAA,QACf;AAAA,MACF;AAEA,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAKM,KAAK,SAA0C;AAAA;AACnD,YAAM,UAAU,KAAK;AAGrB,UAAI,QAAQ,SAAS,IAAI;AACvB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,cAAa;AAAA,QACf;AAAA,MACF;AACA,YAAM,kBAAkB,QAAQ,MAAM,GAAG,GAAG;AAG5C,YAAM,YAAY,KAAK,OAAO;AAAA,QAC5B,YAAY;AAAA,MACd;AAGA,UAAI;AACJ,UAAI;AACF,qBAAa,KAAK,OAAO,WAAW,WAAW,eAAe;AAAA,MAChE,SAAS,OAAO;AACd,cAAM,IAAI;AAAA,UACR,iDAAiD,KAAK;AAAA,UACtD,cAAa;AAAA,QACf;AAAA,MACF;AAGA,UAAI;AACJ,UAAI;AACF,sBAAc,KAAK,OAAO,kBAAkB,WAAW,eAAe;AAAA,MACxE,SAAS,OAAO;AACd,cAAM,IAAI;AAAA,UACR,4CAA4C,KAAK;AAAA,UACjD,cAAa;AAAA,QACf;AAAA,MACF;AAEA,UAAI;AACJ,UAAI;AACF,uBAAgB,MAAM,KAAK,SAAS,QAAQ;AAAA,UAC1C,QAAQ;AAAA,UACR,QAAQ,CAAC,SAAS,UAAU;AAAA,QAC9B,CAAC;AAAA,MACH,SAAS,OAAO;AACd,cAAM,IAAI;AAAA,UACR,gCAAgC,KAAK;AAAA,UACrC,cAAa;AAAA,QACf;AAAA,MACF;AAGA,YAAM,YAAYC,WAAU,KAAK,YAAY;AAC7C,WAAK,eAAe,aAAa,SAAS;AAG1C,aAAO,WAAW,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAAA,IACxD;AAAA;AACF;AAlHa,cAKa,YAAY;AAL/B,IAAM,eAAN;","names":["Signature","Signature"]}
1
+ {"version":3,"sources":["../src/wasm/eip712.ts","../src/errors.ts"],"sourcesContent":["import type { MetaMaskInpageProvider } from \"@metamask/providers\";\nimport * as secp from \"@noble/secp256k1\";\nimport { KnownTypeId, Schema } from \"@sovereign-sdk/universal-wallet-wasm\";\nimport { hexToBytes } from \"@sovereign-sdk/utils\";\nimport { type Signature, parseSignature } from \"viem\";\nimport { SignerError } from \"../errors\";\nimport type { Signer } from \"../signer\";\n\n/**\n * Normalize a signature to low-s form if needed.\n * MetaMask's eth_signTypedData_v4 may return high-s signatures (~50% of the time).\n * The rollup server requires low-s signatures.\n */\nfunction normalizeSignature(signature: Signature): Uint8Array {\n const r = hexToBytes(signature.r.slice(2));\n const s = hexToBytes(signature.s.slice(2));\n let secpSig = secp.Signature.fromCompact(new Uint8Array([...r, ...s]));\n\n // Normalize s if it's > n/2 (convert high-s to low-s)\n if (secpSig.hasHighS()) {\n secpSig = secpSig.normalizeS();\n }\n\n return secpSig.toCompactRawBytes();\n}\n\n/**\n * EIP-712 signer implementation that uses MetaMask's eth_signTypedData_v4 method.\n *\n * This signer expects the message to be a valid UnsignedTransaction that can be\n * parsed by the schema's eip712Json() method.\n *\n * The signer uses the provided address for signing operations.\n */\nexport class Eip712Signer implements Signer {\n private readonly provider: MetaMaskInpageProvider;\n private readonly schema: Schema;\n private readonly address: string;\n private cachedPublicKey?: Uint8Array;\n private static readonly SIGNER_ID = \"Eip712\";\n\n constructor(\n provider: MetaMaskInpageProvider,\n schemaJson: Record<string, unknown>,\n address: string,\n ) {\n if (!address) {\n throw new SignerError(\"Address is required\", Eip712Signer.SIGNER_ID);\n }\n this.provider = provider;\n this.schema = Schema.fromJSON(JSON.stringify(schemaJson));\n this.address = address;\n }\n\n /**\n * Cache the public key recovered from a signature.\n * Uses viem's parseSignature which accepts high-s signatures (unlike ethers).\n */\n private cachePublicKey(signingHash: Uint8Array, signature: Signature): void {\n if (this.cachedPublicKey) return;\n\n const r = hexToBytes(signature.r.slice(2));\n const s = hexToBytes(signature.s.slice(2));\n\n let secpSig = secp.Signature.fromCompact(new Uint8Array([...r, ...s]));\n secpSig = secpSig.addRecoveryBit(signature.yParity ?? 0);\n const publicKey = secpSig.recoverPublicKey(signingHash);\n\n this.cachedPublicKey = publicKey.toBytes(true); // compressed form\n }\n\n /**\n * Get the public key. Requires sign() to be called first to recover the key from a signature.\n */\n async publicKey(): Promise<Uint8Array> {\n if (!this.cachedPublicKey) {\n throw new SignerError(\n \"Public key was not available, you must call sign() first\",\n Eip712Signer.SIGNER_ID,\n );\n }\n\n return this.cachedPublicKey;\n }\n\n /**\n * Sign an UnsignedTransaction using EIP-712 typed data signing.\n */\n async sign(message: Uint8Array): Promise<Uint8Array> {\n const address = this.address;\n\n // Rollups invoke the signer with the chain hash appended, so drop the last 32 bytes of the message\n if (message.length < 32) {\n throw new SignerError(\n \"Message too short, expected at least 32 bytes for chain hash\",\n Eip712Signer.SIGNER_ID,\n );\n }\n const unsignedTxBytes = message.slice(0, -32);\n\n // Get the UnsignedTransaction type index\n const typeIndex = this.schema.knownTypeIndex(\n KnownTypeId.UnsignedTransaction,\n );\n\n // Generate the EIP-712 JSON from the message bytes\n let eip712Json: string;\n try {\n eip712Json = this.schema.eip712Json(typeIndex, unsignedTxBytes);\n } catch (error) {\n throw new SignerError(\n `Failed to generate EIP-712 JSON from message: ${error}`,\n Eip712Signer.SIGNER_ID,\n );\n }\n\n // Get the EIP-712 signing hash for public key recovery\n let signingHash: Uint8Array;\n try {\n signingHash = this.schema.eip712SigningHash(typeIndex, unsignedTxBytes);\n } catch (error) {\n throw new SignerError(\n `Failed to generate EIP-712 signing hash: ${error}`,\n Eip712Signer.SIGNER_ID,\n );\n }\n\n let signatureHex: string;\n try {\n signatureHex = (await this.provider.request({\n method: \"eth_signTypedData_v4\",\n params: [address, eip712Json],\n })) as string;\n } catch (error) {\n throw new SignerError(\n `Failed to sign with EIP-712: ${error}`,\n Eip712Signer.SIGNER_ID,\n );\n }\n\n // Parse the signature using viem (accepts high-s signatures unlike ethers)\n // Normalize to ensure 0x prefix\n const normalizedHex = signatureHex.startsWith(\"0x\")\n ? signatureHex\n : `0x${signatureHex}`;\n const signature = parseSignature(normalizedHex as `0x${string}`);\n this.cachePublicKey(signingHash, signature);\n\n // Normalize to low-s form\n // (EIP-2 low-s requirement only applies to transactions, not off-chain message signing,\n // but the rollup server expects low-s signatures)\n return normalizeSignature(signature);\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"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@sovereign-sdk/signers",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "Signer interface and default implementations for use with Sovereign SDK applications",
5
- "repository": "github:Sovereign-Labs/sovereign-sdk",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/Sovereign-Labs/sovereign-sdk.git"
8
+ },
6
9
  "files": [
7
10
  "dist",
8
11
  "README.md",
@@ -52,14 +55,14 @@
52
55
  "dependencies": {
53
56
  "@ledgerhq/hw-app-solana": "^7.5.2",
54
57
  "@ledgerhq/hw-transport": "^6.31.9",
58
+ "@ledgerhq/hw-transport-node-hid": "^6.29.10",
55
59
  "@ledgerhq/hw-transport-webhid": "^6.30.5",
56
60
  "@ledgerhq/hw-transport-webusb": "^6.29.9",
57
- "@ledgerhq/hw-transport-node-hid": "^6.29.10",
58
61
  "@noble/ed25519": "^2.1.0",
59
62
  "@noble/hashes": "^1.5.0",
60
63
  "@noble/secp256k1": "^2.3.0",
61
- "ethers": "^6.15.0",
62
- "@sovereign-sdk/universal-wallet-wasm": "^0.6.0",
64
+ "viem": "^2.44.4",
65
+ "@sovereign-sdk/universal-wallet-wasm": "^0.7.0",
63
66
  "@sovereign-sdk/utils": "^0.0.4"
64
67
  },
65
68
  "scripts": {