@zerodev/permissions 5.2.1 → 5.2.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.
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toEmptyECDSASigner = exports.toSignerId = exports.WebAuthnMode = exports.toWebAuthnSigner = exports.toECDSASigner = void 0;
3
+ exports.SessionKeySignerMode = exports.toRemoteSessionKeySigner = exports.toEmptyECDSASigner = exports.toSignerId = exports.WebAuthnMode = exports.toWebAuthnSigner = exports.toECDSASigner = void 0;
4
4
  var toECDSASigner_js_1 = require("./toECDSASigner.js");
5
5
  Object.defineProperty(exports, "toECDSASigner", { enumerable: true, get: function () { return toECDSASigner_js_1.toECDSASigner; } });
6
6
  var toWebAuthnSigner_js_1 = require("./toWebAuthnSigner.js");
@@ -11,4 +11,8 @@ var toSignerId_js_1 = require("./utils/toSignerId.js");
11
11
  Object.defineProperty(exports, "toSignerId", { enumerable: true, get: function () { return toSignerId_js_1.toSignerId; } });
12
12
  var toEmptyECDSASigner_js_1 = require("./toEmptyECDSASigner.js");
13
13
  Object.defineProperty(exports, "toEmptyECDSASigner", { enumerable: true, get: function () { return toEmptyECDSASigner_js_1.toEmptyECDSASigner; } });
14
+ var toRemoteSessionKeySigner_js_1 = require("./toRemoteSessionKeySigner.js");
15
+ Object.defineProperty(exports, "toRemoteSessionKeySigner", { enumerable: true, get: function () { return toRemoteSessionKeySigner_js_1.toRemoteSessionKeySigner; } });
16
+ var toRemoteSessionKeySigner_js_2 = require("./toRemoteSessionKeySigner.js");
17
+ Object.defineProperty(exports, "SessionKeySignerMode", { enumerable: true, get: function () { return toRemoteSessionKeySigner_js_2.SessionKeySignerMode; } });
14
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../signers/index.ts"],"names":[],"mappings":";;;AAAA,uDAG2B;AAFvB,iHAAA,aAAa,OAAA;AAGjB,6DAG8B;AAF1B,uHAAA,gBAAgB,OAAA;AAGpB,6DAAoD;AAA3C,mHAAA,YAAY,OAAA;AACrB,uDAAkD;AAAzC,2GAAA,UAAU,OAAA;AACnB,iEAA4D;AAAnD,2HAAA,kBAAkB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../signers/index.ts"],"names":[],"mappings":";;;AAAA,uDAG2B;AAFvB,iHAAA,aAAa,OAAA;AAGjB,6DAG8B;AAF1B,uHAAA,gBAAgB,OAAA;AAGpB,6DAAoD;AAA3C,mHAAA,YAAY,OAAA;AACrB,uDAAkD;AAAzC,2GAAA,UAAU,OAAA;AACnB,iEAA4D;AAAnD,2HAAA,kBAAkB,OAAA;AAC3B,6EAAwE;AAA/D,uIAAA,wBAAwB,OAAA;AACjC,6EAAoE;AAA3D,mIAAA,oBAAoB,OAAA"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toRemoteSessionKeySigner = exports.SessionKeySignerMode = void 0;
4
+ const sdk_1 = require("@zerodev/sdk");
5
+ const axios_1 = require("axios");
6
+ const accounts_1 = require("permissionless/accounts");
7
+ const viem_1 = require("viem");
8
+ const accounts_2 = require("viem/accounts");
9
+ const constants_js_1 = require("../constants.js");
10
+ var SessionKeySignerMode;
11
+ (function (SessionKeySignerMode) {
12
+ SessionKeySignerMode["Create"] = "create";
13
+ SessionKeySignerMode["Get"] = "get";
14
+ })(SessionKeySignerMode || (exports.SessionKeySignerMode = SessionKeySignerMode = {}));
15
+ async function toRemoteSessionKeySigner({ userName, apiKey, walletAddress, sessionKeyStorageUrl, mode = SessionKeySignerMode.Get, signerContractAddress = constants_js_1.ECDSA_SIGNER_CONTRACT }) {
16
+ if (mode === SessionKeySignerMode.Create) {
17
+ try {
18
+ const createTurnkeyWalletResult = await axios_1.default.post(`${sessionKeyStorageUrl}/key-pair`, {
19
+ userName
20
+ }, {
21
+ headers: {
22
+ "x-api-key": apiKey
23
+ }
24
+ });
25
+ walletAddress = createTurnkeyWalletResult.data.walletAddress;
26
+ }
27
+ catch (error) {
28
+ const errorMessage = error instanceof Error
29
+ ? error.message
30
+ : "An unknown error occurred";
31
+ if (axios_1.default.isAxiosError(error) && error.response) {
32
+ throw new Error(`Request failed with status code ${error.response.status}: ${error.response.data.message || errorMessage}`);
33
+ }
34
+ else {
35
+ throw new Error(`An unexpected error occurred: ${errorMessage}`);
36
+ }
37
+ }
38
+ }
39
+ if (!walletAddress) {
40
+ throw new Error("Wallet address should be provided on get mode");
41
+ }
42
+ const signMessageWithTurnkeyWallet = async (message) => {
43
+ try {
44
+ const signMessageResult = await axios_1.default.post(`${sessionKeyStorageUrl}/sign-message`, {
45
+ walletAddress,
46
+ message
47
+ }, {
48
+ headers: {
49
+ "x-api-key": apiKey
50
+ }
51
+ });
52
+ return signMessageResult.data.signature;
53
+ }
54
+ catch (error) {
55
+ const errorMessage = error instanceof Error
56
+ ? error.message
57
+ : "An unknown error occurred";
58
+ if (axios_1.default.isAxiosError(error) && error.response) {
59
+ throw new Error(`Request failed with status code ${error.response.status}: ${error.response.data.message || errorMessage}`);
60
+ }
61
+ else {
62
+ throw new Error(`An unexpected error occurred: ${errorMessage}`);
63
+ }
64
+ }
65
+ };
66
+ const account = (0, accounts_2.toAccount)({
67
+ address: walletAddress,
68
+ async signMessage({ message }) {
69
+ return (0, sdk_1.fixSignedData)(await signMessageWithTurnkeyWallet(message));
70
+ },
71
+ async signTransaction(_, __) {
72
+ throw new accounts_1.SignTransactionNotSupportedBySmartAccount();
73
+ },
74
+ async signTypedData(typedData) {
75
+ const { domain, message, primaryType } = typedData;
76
+ const types = {
77
+ EIP712Domain: (0, viem_1.getTypesForEIP712Domain)({ domain }),
78
+ ...typedData.types
79
+ };
80
+ (0, viem_1.validateTypedData)({ domain, message, primaryType, types });
81
+ const hash = (0, viem_1.hashTypedData)(typedData);
82
+ return (0, sdk_1.fixSignedData)(await signMessageWithTurnkeyWallet(hash));
83
+ }
84
+ });
85
+ return {
86
+ account,
87
+ signerContractAddress,
88
+ getSignerData: () => {
89
+ if (!walletAddress) {
90
+ throw new Error("Wallet address not found");
91
+ }
92
+ return walletAddress;
93
+ },
94
+ getDummySignature: () => sdk_1.constants.DUMMY_ECDSA_SIG
95
+ };
96
+ }
97
+ exports.toRemoteSessionKeySigner = toRemoteSessionKeySigner;
98
+ //# sourceMappingURL=toRemoteSessionKeySigner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toRemoteSessionKeySigner.js","sourceRoot":"","sources":["../../signers/toRemoteSessionKeySigner.ts"],"names":[],"mappings":";;;AAAA,sCAAuD;AAEvD,iCAAyB;AACzB,sDAAmF;AACnF,+BAQa;AACb,4CAAyC;AACzC,kDAAuD;AAGvD,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC5B,yCAAiB,CAAA;IACjB,mCAAW,CAAA;AACf,CAAC,EAHW,oBAAoB,oCAApB,oBAAoB,QAG/B;AAUM,KAAK,UAAU,wBAAwB,CAAC,EAC3C,QAAQ,EACR,MAAM,EACN,aAAa,EACb,oBAAoB,EACpB,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAC/B,qBAAqB,GAAG,oCAAqB,EACjB;IAC5B,IAAI,IAAI,KAAK,oBAAoB,CAAC,MAAM,EAAE,CAAC;QACvC,IAAI,CAAC;YACD,MAAM,yBAAyB,GAAG,MAAM,eAAK,CAAC,IAAI,CAC9C,GAAG,oBAAoB,WAAW,EAClC;gBACI,QAAQ;aACX,EACD;gBACI,OAAO,EAAE;oBACL,WAAW,EAAE,MAAM;iBACtB;aACJ,CACJ,CAAA;YACD,aAAa,GAAG,yBAAyB,CAAC,IAAI,CAAC,aAAa,CAAA;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,YAAY,GACd,KAAK,YAAY,KAAK;gBAClB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,2BAA2B,CAAA;YACrC,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CACX,mCACI,KAAK,CAAC,QAAQ,CAAC,MACnB,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,YAAY,EAAE,CACrD,CAAA;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAA;YACpE,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,4BAA4B,GAAG,KAAK,EAAE,OAAwB,EAAE,EAAE;QACpE,IAAI,CAAC;YACD,MAAM,iBAAiB,GAAG,MAAM,eAAK,CAAC,IAAI,CACtC,GAAG,oBAAoB,eAAe,EACtC;gBACI,aAAa;gBACb,OAAO;aACV,EACD;gBACI,OAAO,EAAE;oBACL,WAAW,EAAE,MAAM;iBACtB;aACJ,CACJ,CAAA;YAED,OAAO,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAA;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,YAAY,GACd,KAAK,YAAY,KAAK;gBAClB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,2BAA2B,CAAA;YACrC,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CACX,mCACI,KAAK,CAAC,QAAQ,CAAC,MACnB,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,YAAY,EAAE,CACrD,CAAA;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAA;YACpE,CAAC;QACL,CAAC;IACL,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,IAAA,oBAAS,EAAC;QACtB,OAAO,EAAE,aAAa;QACtB,KAAK,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE;YACzB,OAAO,IAAA,mBAAa,EAAC,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAA;QACrE,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,CAAC,EAAE,EAAE;YACvB,MAAM,IAAI,oDAAyC,EAAE,CAAA;QACzD,CAAC;QACD,KAAK,CAAC,aAAa,CAKjB,SAAwD;YACtD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAClC,SAA+C,CAAA;YAEnD,MAAM,KAAK,GAAG;gBACV,YAAY,EAAE,IAAA,8BAAuB,EAAC,EAAE,MAAM,EAAE,CAAC;gBACjD,GAAG,SAAS,CAAC,KAAK;aACrB,CAAA;YAED,IAAA,wBAAiB,EAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAA;YAE1D,MAAM,IAAI,GAAG,IAAA,oBAAa,EAAC,SAAS,CAAC,CAAA;YACrC,OAAO,IAAA,mBAAa,EAAC,MAAM,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAA;QAClE,CAAC;KACJ,CAAC,CAAA;IACF,OAAO;QACH,OAAO;QACP,qBAAqB;QACrB,aAAa,EAAE,GAAG,EAAE;YAChB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;YAC/C,CAAC;YACD,OAAO,aAAa,CAAA;QACxB,CAAC;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC,eAAS,CAAC,eAAe;KACrD,CAAA;AACL,CAAC;AAnHD,4DAmHC"}
@@ -3,4 +3,6 @@ export { toWebAuthnSigner } from "./toWebAuthnSigner.js";
3
3
  export { WebAuthnMode } from "./toWebAuthnPubKey.js";
4
4
  export { toSignerId } from "./utils/toSignerId.js";
5
5
  export { toEmptyECDSASigner } from "./toEmptyECDSASigner.js";
6
+ export { toRemoteSessionKeySigner } from "./toRemoteSessionKeySigner.js";
7
+ export { SessionKeySignerMode } from "./toRemoteSessionKeySigner.js";
6
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../signers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EAEhB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACH,gBAAgB,EAEnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../signers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EAEhB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACH,gBAAgB,EAEnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA"}
@@ -0,0 +1,94 @@
1
+ import { constants, fixSignedData } from "@zerodev/sdk";
2
+ import axios from "axios";
3
+ import { SignTransactionNotSupportedBySmartAccount } from "permissionless/accounts";
4
+ import { getTypesForEIP712Domain, hashTypedData, validateTypedData } from "viem";
5
+ import { toAccount } from "viem/accounts";
6
+ import { ECDSA_SIGNER_CONTRACT } from "../constants.js";
7
+ export var SessionKeySignerMode;
8
+ (function (SessionKeySignerMode) {
9
+ SessionKeySignerMode["Create"] = "create";
10
+ SessionKeySignerMode["Get"] = "get";
11
+ })(SessionKeySignerMode || (SessionKeySignerMode = {}));
12
+ export async function toRemoteSessionKeySigner({ userName, apiKey, walletAddress, sessionKeyStorageUrl, mode = SessionKeySignerMode.Get, signerContractAddress = ECDSA_SIGNER_CONTRACT }) {
13
+ if (mode === SessionKeySignerMode.Create) {
14
+ try {
15
+ const createTurnkeyWalletResult = await axios.post(`${sessionKeyStorageUrl}/key-pair`, {
16
+ userName
17
+ }, {
18
+ headers: {
19
+ "x-api-key": apiKey
20
+ }
21
+ });
22
+ walletAddress = createTurnkeyWalletResult.data.walletAddress;
23
+ }
24
+ catch (error) {
25
+ const errorMessage = error instanceof Error
26
+ ? error.message
27
+ : "An unknown error occurred";
28
+ if (axios.isAxiosError(error) && error.response) {
29
+ throw new Error(`Request failed with status code ${error.response.status}: ${error.response.data.message || errorMessage}`);
30
+ }
31
+ else {
32
+ throw new Error(`An unexpected error occurred: ${errorMessage}`);
33
+ }
34
+ }
35
+ }
36
+ if (!walletAddress) {
37
+ throw new Error("Wallet address should be provided on get mode");
38
+ }
39
+ const signMessageWithTurnkeyWallet = async (message) => {
40
+ try {
41
+ const signMessageResult = await axios.post(`${sessionKeyStorageUrl}/sign-message`, {
42
+ walletAddress,
43
+ message
44
+ }, {
45
+ headers: {
46
+ "x-api-key": apiKey
47
+ }
48
+ });
49
+ return signMessageResult.data.signature;
50
+ }
51
+ catch (error) {
52
+ const errorMessage = error instanceof Error
53
+ ? error.message
54
+ : "An unknown error occurred";
55
+ if (axios.isAxiosError(error) && error.response) {
56
+ throw new Error(`Request failed with status code ${error.response.status}: ${error.response.data.message || errorMessage}`);
57
+ }
58
+ else {
59
+ throw new Error(`An unexpected error occurred: ${errorMessage}`);
60
+ }
61
+ }
62
+ };
63
+ const account = toAccount({
64
+ address: walletAddress,
65
+ async signMessage({ message }) {
66
+ return fixSignedData(await signMessageWithTurnkeyWallet(message));
67
+ },
68
+ async signTransaction(_, __) {
69
+ throw new SignTransactionNotSupportedBySmartAccount();
70
+ },
71
+ async signTypedData(typedData) {
72
+ const { domain, message, primaryType } = typedData;
73
+ const types = {
74
+ EIP712Domain: getTypesForEIP712Domain({ domain }),
75
+ ...typedData.types
76
+ };
77
+ validateTypedData({ domain, message, primaryType, types });
78
+ const hash = hashTypedData(typedData);
79
+ return fixSignedData(await signMessageWithTurnkeyWallet(hash));
80
+ }
81
+ });
82
+ return {
83
+ account,
84
+ signerContractAddress,
85
+ getSignerData: () => {
86
+ if (!walletAddress) {
87
+ throw new Error("Wallet address not found");
88
+ }
89
+ return walletAddress;
90
+ },
91
+ getDummySignature: () => constants.DUMMY_ECDSA_SIG
92
+ };
93
+ }
94
+ //# sourceMappingURL=toRemoteSessionKeySigner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toRemoteSessionKeySigner.js","sourceRoot":"","sources":["../../signers/toRemoteSessionKeySigner.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,6 @@ export { toWebAuthnSigner, type WebAuthnModularSignerParams } from "./toWebAuthn
3
3
  export { WebAuthnMode } from "./toWebAuthnPubKey.js";
4
4
  export { toSignerId } from "./utils/toSignerId.js";
5
5
  export { toEmptyECDSASigner } from "./toEmptyECDSASigner.js";
6
+ export { toRemoteSessionKeySigner } from "./toRemoteSessionKeySigner.js";
7
+ export { SessionKeySignerMode } from "./toRemoteSessionKeySigner.js";
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../signers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EACb,KAAK,wBAAwB,EAChC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACH,gBAAgB,EAChB,KAAK,2BAA2B,EACnC,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../signers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EACb,KAAK,wBAAwB,EAChC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACH,gBAAgB,EAChB,KAAK,2BAA2B,EACnC,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { type Hex } from "viem";
2
+ import type { ModularSigner, ModularSignerParams } from "../types.js";
3
+ export declare enum SessionKeySignerMode {
4
+ Create = "create",
5
+ Get = "get"
6
+ }
7
+ export type SessionKeyModularSignerParams = ModularSignerParams & {
8
+ userName: string;
9
+ apiKey: string;
10
+ sessionKeyStorageUrl: string;
11
+ walletAddress?: Hex;
12
+ mode?: SessionKeySignerMode;
13
+ };
14
+ export declare function toRemoteSessionKeySigner({ userName, apiKey, walletAddress, sessionKeyStorageUrl, mode, signerContractAddress }: SessionKeyModularSignerParams): Promise<ModularSigner>;
15
+ //# sourceMappingURL=toRemoteSessionKeySigner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toRemoteSessionKeySigner.d.ts","sourceRoot":"","sources":["../../signers/toRemoteSessionKeySigner.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,GAAG,EAOX,MAAM,MAAM,CAAA;AAGb,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAErE,oBAAY,oBAAoB;IAC5B,MAAM,WAAW;IACjB,GAAG,QAAQ;CACd;AAED,MAAM,MAAM,6BAA6B,GAAG,mBAAmB,GAAG;IAC9D,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,oBAAoB,EAAE,MAAM,CAAA;IAC5B,aAAa,CAAC,EAAE,GAAG,CAAA;IACnB,IAAI,CAAC,EAAE,oBAAoB,CAAA;CAC9B,CAAA;AAED,wBAAsB,wBAAwB,CAAC,EAC3C,QAAQ,EACR,MAAM,EACN,aAAa,EACb,oBAAoB,EACpB,IAA+B,EAC/B,qBAA6C,EAChD,EAAE,6BAA6B,GAAG,OAAO,CAAC,aAAa,CAAC,CA4GxD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerodev/permissions",
3
- "version": "5.2.1",
3
+ "version": "5.2.3",
4
4
  "author": "ZeroDev",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
@@ -58,6 +58,6 @@
58
58
  "peerDependencies": {
59
59
  "viem": "^2.9.17",
60
60
  "@zerodev/sdk": "^5.2.1",
61
- "permissionless": "^0.1.17"
61
+ "permissionless": "^0.1.18"
62
62
  }
63
63
  }
package/signers/index.ts CHANGED
@@ -9,3 +9,5 @@ export {
9
9
  export { WebAuthnMode } from "./toWebAuthnPubKey.js"
10
10
  export { toSignerId } from "./utils/toSignerId.js"
11
11
  export { toEmptyECDSASigner } from "./toEmptyECDSASigner.js"
12
+ export { toRemoteSessionKeySigner } from "./toRemoteSessionKeySigner.js"
13
+ export { SessionKeySignerMode } from "./toRemoteSessionKeySigner.js"
@@ -0,0 +1,146 @@
1
+ import { constants, fixSignedData } from "@zerodev/sdk"
2
+ import type { TypedData } from "abitype"
3
+ import axios from "axios"
4
+ import { SignTransactionNotSupportedBySmartAccount } from "permissionless/accounts"
5
+ import {
6
+ type Hex,
7
+ type SignTypedDataParameters,
8
+ type SignableMessage,
9
+ type TypedDataDefinition,
10
+ getTypesForEIP712Domain,
11
+ hashTypedData,
12
+ validateTypedData
13
+ } from "viem"
14
+ import { toAccount } from "viem/accounts"
15
+ import { ECDSA_SIGNER_CONTRACT } from "../constants.js"
16
+ import type { ModularSigner, ModularSignerParams } from "../types.js"
17
+
18
+ export enum SessionKeySignerMode {
19
+ Create = "create",
20
+ Get = "get"
21
+ }
22
+
23
+ export type SessionKeyModularSignerParams = ModularSignerParams & {
24
+ userName: string
25
+ apiKey: string
26
+ sessionKeyStorageUrl: string
27
+ walletAddress?: Hex
28
+ mode?: SessionKeySignerMode
29
+ }
30
+
31
+ export async function toRemoteSessionKeySigner({
32
+ userName,
33
+ apiKey,
34
+ walletAddress,
35
+ sessionKeyStorageUrl,
36
+ mode = SessionKeySignerMode.Get,
37
+ signerContractAddress = ECDSA_SIGNER_CONTRACT
38
+ }: SessionKeyModularSignerParams): Promise<ModularSigner> {
39
+ if (mode === SessionKeySignerMode.Create) {
40
+ try {
41
+ const createTurnkeyWalletResult = await axios.post(
42
+ `${sessionKeyStorageUrl}/key-pair`,
43
+ {
44
+ userName
45
+ },
46
+ {
47
+ headers: {
48
+ "x-api-key": apiKey
49
+ }
50
+ }
51
+ )
52
+ walletAddress = createTurnkeyWalletResult.data.walletAddress
53
+ } catch (error) {
54
+ const errorMessage =
55
+ error instanceof Error
56
+ ? error.message
57
+ : "An unknown error occurred"
58
+ if (axios.isAxiosError(error) && error.response) {
59
+ throw new Error(
60
+ `Request failed with status code ${
61
+ error.response.status
62
+ }: ${error.response.data.message || errorMessage}`
63
+ )
64
+ } else {
65
+ throw new Error(`An unexpected error occurred: ${errorMessage}`)
66
+ }
67
+ }
68
+ }
69
+
70
+ if (!walletAddress) {
71
+ throw new Error("Wallet address should be provided on get mode")
72
+ }
73
+
74
+ const signMessageWithTurnkeyWallet = async (message: SignableMessage) => {
75
+ try {
76
+ const signMessageResult = await axios.post(
77
+ `${sessionKeyStorageUrl}/sign-message`,
78
+ {
79
+ walletAddress,
80
+ message
81
+ },
82
+ {
83
+ headers: {
84
+ "x-api-key": apiKey
85
+ }
86
+ }
87
+ )
88
+
89
+ return signMessageResult.data.signature
90
+ } catch (error) {
91
+ const errorMessage =
92
+ error instanceof Error
93
+ ? error.message
94
+ : "An unknown error occurred"
95
+ if (axios.isAxiosError(error) && error.response) {
96
+ throw new Error(
97
+ `Request failed with status code ${
98
+ error.response.status
99
+ }: ${error.response.data.message || errorMessage}`
100
+ )
101
+ } else {
102
+ throw new Error(`An unexpected error occurred: ${errorMessage}`)
103
+ }
104
+ }
105
+ }
106
+
107
+ const account = toAccount({
108
+ address: walletAddress,
109
+ async signMessage({ message }) {
110
+ return fixSignedData(await signMessageWithTurnkeyWallet(message))
111
+ },
112
+ async signTransaction(_, __) {
113
+ throw new SignTransactionNotSupportedBySmartAccount()
114
+ },
115
+ async signTypedData<
116
+ const TTypedData extends TypedData | Record<string, unknown>,
117
+ TPrimaryType extends
118
+ | keyof TTypedData
119
+ | "EIP712Domain" = keyof TTypedData
120
+ >(typedData: TypedDataDefinition<TTypedData, TPrimaryType>) {
121
+ const { domain, message, primaryType } =
122
+ typedData as unknown as SignTypedDataParameters
123
+
124
+ const types = {
125
+ EIP712Domain: getTypesForEIP712Domain({ domain }),
126
+ ...typedData.types
127
+ }
128
+
129
+ validateTypedData({ domain, message, primaryType, types })
130
+
131
+ const hash = hashTypedData(typedData)
132
+ return fixSignedData(await signMessageWithTurnkeyWallet(hash))
133
+ }
134
+ })
135
+ return {
136
+ account,
137
+ signerContractAddress,
138
+ getSignerData: () => {
139
+ if (!walletAddress) {
140
+ throw new Error("Wallet address not found")
141
+ }
142
+ return walletAddress
143
+ },
144
+ getDummySignature: () => constants.DUMMY_ECDSA_SIG
145
+ }
146
+ }