@cartridge/controller 0.7.13-alpha.1 → 0.7.13-alpha.2

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.
Files changed (44) hide show
  1. package/.turbo/turbo-build$colon$deps.log +51 -49
  2. package/.turbo/turbo-build.log +47 -45
  3. package/dist/icon.d.ts +1 -1
  4. package/dist/index.js +3307 -1392
  5. package/dist/index.js.map +1 -1
  6. package/dist/node/index.cjs +14 -5
  7. package/dist/node/index.cjs.map +1 -1
  8. package/dist/node/index.d.cts +1 -1
  9. package/dist/node/index.d.ts +1 -1
  10. package/dist/node/index.js +14 -5
  11. package/dist/node/index.js.map +1 -1
  12. package/dist/provider-LFJfEvkl.js +287 -0
  13. package/dist/provider-LFJfEvkl.js.map +1 -0
  14. package/dist/session/account.d.ts +4 -1
  15. package/dist/session.js +86 -77
  16. package/dist/session.js.map +1 -1
  17. package/dist/stats.html +1 -1
  18. package/dist/types.d.ts +1 -1
  19. package/dist/wallets/bridge.d.ts +2 -2
  20. package/dist/wallets/index.d.ts +5 -2
  21. package/dist/wallets/metamask/index.d.ts +1 -1
  22. package/dist/wallets/rabby/index.d.ts +18 -0
  23. package/dist/wallets/turnkey/index.d.ts +19 -0
  24. package/dist/wallets/types.d.ts +1 -1
  25. package/dist/wallets/wallet-connect/index.d.ts +18 -0
  26. package/package.json +9 -4
  27. package/src/icon.ts +1 -1
  28. package/src/iframe/base.ts +1 -0
  29. package/src/node/account.ts +9 -0
  30. package/src/node/provider.ts +3 -0
  31. package/src/session/account.ts +9 -0
  32. package/src/session/provider.ts +6 -0
  33. package/src/telegram/provider.ts +6 -0
  34. package/src/types.ts +1 -0
  35. package/src/wallets/bridge.ts +8 -6
  36. package/src/wallets/index.ts +5 -2
  37. package/src/wallets/metamask/index.ts +6 -5
  38. package/src/wallets/rabby/index.ts +231 -0
  39. package/src/wallets/turnkey/index.ts +191 -0
  40. package/src/wallets/types.ts +1 -1
  41. package/src/wallets/wallet-connect/index.ts +196 -0
  42. package/.turbo/turbo-format.log +0 -39
  43. package/dist/provider-BDCJkGu6.js +0 -287
  44. package/dist/provider-BDCJkGu6.js.map +0 -1
package/src/icon.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export const icon =
2
- "data:image/png;base64,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";
2
+ "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNTExMl83ODIpIj4KPHBhdGggZD0iTTQ2OS4yMzYgNzBDNDgyLjM5IDcwIDQ5My4wNTMgODAuNjYzIDQ5My4wNTMgOTMuODE2NFYxNDcuMTQ3TDUxNS4zMzggMTQ3LjE0N0w1MTUuNDI4IDE0Ny4xNDdMNTE1LjU1NCAxNDcuMTQ3TDUxNS44MjYgMTQ3LjE0OUM1MTYuMDE2IDE0Ny4xNTEgNTE2LjIyNSAxNDcuMTUzIDUxNi40NTEgMTQ3LjE1N0M1MTYuOTA0IDE0Ny4xNjQgNTE3LjQyOCAxNDcuMTc2IDUxOC4wMiAxNDcuMTk1QzUxOS4yMDEgMTQ3LjIzNCA1MjAuNjYgMTQ3LjMwNCA1MjIuMzYxIDE0Ny40MjRDNTI1Ljc0MSAxNDcuNjYzIDUzMC4xODUgMTQ4LjExNCA1MzUuMzYzIDE0OC45NjlDNTQ1LjAwMSAxNTAuNTYyIDU1OC41NTYgMTUzLjc4IDU3Mi45MTggMTYwLjYwM0w3MzAuNDIgMjI2LjY3MUw3MzIuMTAxIDIyNy41MDVDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3ODkuOTkzIDU4Ni4wNTQgNzg5Ljk5NCA1ODYuMjU0IDc4OS45OTQgNTg2LjQ2M0w3ODkuOTk2IDU4Ni45MTNDNzkwLjAzOCA1OTcuMDk2IDc5MC4xNjEgNjI2Ljk5NiA3NjQuMjMxIDY1Mi44MjNMNzE0Ljc2IDcwMi4wOTVMNzE0LjY0MSA3MDIuMjE1QzcwNC42MDEgNzEyLjI3NSA2OTIuMTIzIDcyMC42NTIgNjc2LjI4NCA3MjQuODc5QzY2NC4zOSA3MjguMDU0IDY1Mi44MjcgNzI3Ljk2NiA2NDguNjM3IDcyNy45MzRMNjQ4LjYxOSA3MjcuOTMzQzY0OC40MDkgNzI3LjkzMiA2NDguMjE5IDcyNy45MyA2NDguMDQ3IDcyNy45M0w2NDcuNzUyIDcyNy45MjlINDgwLjcyMUM0NzQuMDk0IDcyNy45MjkgNDY4LjcyMSA3MjIuNTU2IDQ2OC43MjEgNzE1LjkyOVY2NjguMzg4SDMyOC41ODZDMzI4LjU4NiA2NzIuNjI5IDMyOC41NzIgNjk4LjA1MiAzMjguNTYxIDcxNS45NDRDMzI4LjU1NyA3MjIuNTY5IDMyMy4xODYgNzI3LjkyOSAzMTYuNTYxIDcyNy45MjlIMTUyLjI0NkMxNTIuMTA0IDcyNy45MjkgMTUxLjk0MiA3MjcuOTI5IDE1MS43NjIgNzI3LjkzMUwxNTEuMzYyIDcyNy45MzRDMTQ3LjE3MiA3MjcuOTY2IDEzNS42MDkgNzI4LjA1NCAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUw4NS4yMzg2IDcwMi4wOTVMMzUuNjcgNjUyLjcyNUwzNS41NzIzIDY1Mi42MjdDOS44NjI0MiA2MjYuNzggOS45NjY3IDU5Ny4xODUgMTAuMDAzIDU4Ni44NzRDMTAuMDA0MyA1ODYuNTEzIDEwLjAwNTUgNTg2LjE3NyAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDY5LjU3OSAyMjYuNjcxTDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNTQuOTk4IDE1MC41NjIgMjY0LjYzNiAxNDguOTY5QzI2OS44MTQgMTQ4LjExNCAyNzQuMjU4IDE0Ny42NjMgMjc3LjYzOCAxNDcuNDI0QzI3OS4zMzggMTQ3LjMwNCAyODAuNzk4IDE0Ny4yMzQgMjgxLjk3OSAxNDcuMTk1QzI4Mi41NzEgMTQ3LjE3NiAyODMuMDk1IDE0Ny4xNjQgMjgzLjU0NyAxNDcuMTU3TDI4My45MTcgMTQ3LjE1MkwyODQuMTczIDE0Ny4xNDlMMjg0LjQ0NSAxNDcuMTQ3TDI4NC41NzEgMTQ3LjE0N0wyODQuNjYgMTQ3LjE0N0wzMDYuOTQyIDE0Ny4xNDdWOTMuODE2NEMzMDYuOTQyIDgwLjY2MyAzMTcuNjA1IDcwIDMzMC43NTggNzBINDY5LjIzNloiIGZpbGw9IiMxOTFBMUEiLz4KPHBhdGggZD0iTTM2Ni40ODMgMTI5LjU0SDQzMy41MTJWMjA2LjY4N0gzNjYuNDgzVjEyOS41NFoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMSA2MDIuNDI5SDE0NC4wMDhDMTM1Ljc2OCA2MDIuNDI5IDEzNS43NjggNTk0LjE0NiAxMzUuNzY4IDU5NC4xNDZWMjgwLjg1QzEzNS43NjggMjgwLjg1IDEzNS43NjggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M0wzNjYuNDgzIDIwNi42ODdIMjg0LjY5QzI4NC42OSAyMDYuNjg3IDI2OC4xMzQgMjA2LjY4NyAyNTEuNTc5IDIxNC44OTNMOTQuMzQxNCAyODAuODVDNzcuNzg2MSAyODkuMDU3IDY5LjU0NjkgMzA1LjYyMyA2OS41NDY5IDMyMi4wMzVWNTg1Ljg2M0M2OS41NDY5IDU5NC4xNDcgNjkuNTQ2OSA2MDIuMzUzIDc3Ljc4NjEgNjEwLjYzNkwxMjcuNDUyIDY2MC4xMDRDMTM1LjY5MSA2NjguMzg3IDE0MS45MjggNjY4LjM4NyAxNTIuMjQ3IDY2OC4zODdIMjY5LjAyOUMyNjkuMDM3IDY0OC4zNCAyNjkuMDQ2IDYyNC42NTUgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY1OC4wNzEgNjY4LjM4NyA2NjQuMzA4IDY2OC4zODcgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1OTQuMTQ3IDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MjIuMjEzIDI4OS4wNTcgNzA1LjY1OCAyODAuODVMNTQ4LjQyMSAyMTQuODkzQzUzMS44NjUgMjA2LjY4NyA1MTUuMzEgMjA2LjY4NyA1MTUuMzEgMjA2LjY4N0g0MzMuNTEyTDQzMy41MTIgMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNTk0LjE0NiA2NjQuMzA4IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wNzUgNTQzLjcwNyAyNjkuMDE3IDU5Ni45MTIgMjY5LjAxIDYwMi40MjlaIiBmaWxsPSIjRkJDQjRBIi8+CjxwYXRoIGQ9Ik0yNjkuMDA5IDQzNi4xNzJINTI4LjI2MlYzNzAuNjgxSDI2OS4wNzVDMjY5LjA3NSAzNzcuMzczIDI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzJaIiBmaWxsPSIjRkJDQjRBIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF81MTEyXzc4MiIgeD0iLTQiIHk9IjAiIHdpZHRoPSI4MDgiIGhlaWdodD0iODA4IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQgZHk9IjQiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K";
@@ -45,6 +45,7 @@ export class IFrame<CallSender extends {}> implements Modal {
45
45
  iframe.style.border = "none";
46
46
  iframe.sandbox.add("allow-forms");
47
47
  iframe.sandbox.add("allow-popups");
48
+ iframe.sandbox.add("allow-popups-to-escape-sandbox");
48
49
  iframe.sandbox.add("allow-scripts");
49
50
  iframe.sandbox.add("allow-same-origin");
50
51
  iframe.allow =
@@ -21,6 +21,9 @@ export default class SessionAccount extends WalletAccount {
21
21
  chainId,
22
22
  expiresAt,
23
23
  policies,
24
+ guardianKeyGuid,
25
+ metadataHash,
26
+ sessionKeyGuid,
24
27
  }: {
25
28
  rpcUrl: string;
26
29
  privateKey: string;
@@ -29,6 +32,9 @@ export default class SessionAccount extends WalletAccount {
29
32
  chainId: string;
30
33
  expiresAt: number;
31
34
  policies: Policy[];
35
+ guardianKeyGuid: string;
36
+ metadataHash: string;
37
+ sessionKeyGuid: string;
32
38
  },
33
39
  ) {
34
40
  super({ nodeUrl: rpcUrl }, provider);
@@ -43,6 +49,9 @@ export default class SessionAccount extends WalletAccount {
43
49
  {
44
50
  expiresAt,
45
51
  policies,
52
+ guardianKeyGuid,
53
+ metadataHash,
54
+ sessionKeyGuid,
46
55
  },
47
56
  );
48
57
  }
@@ -107,6 +107,9 @@ export default class SessionProvider extends BaseProvider {
107
107
  chainId: this._chainId,
108
108
  expiresAt: parseInt(session.expiresAt),
109
109
  policies: toWasmPolicies(this._policies),
110
+ guardianKeyGuid: session.guardianKeyGuid,
111
+ metadataHash: session.metadataHash,
112
+ sessionKeyGuid: session.sessionKeyGuid,
110
113
  });
111
114
 
112
115
  return this.account;
@@ -21,6 +21,9 @@ export default class SessionAccount extends WalletAccount {
21
21
  chainId,
22
22
  expiresAt,
23
23
  policies,
24
+ guardianKeyGuid,
25
+ metadataHash,
26
+ sessionKeyGuid,
24
27
  }: {
25
28
  rpcUrl: string;
26
29
  privateKey: string;
@@ -29,6 +32,9 @@ export default class SessionAccount extends WalletAccount {
29
32
  chainId: string;
30
33
  expiresAt: number;
31
34
  policies: Policy[];
35
+ guardianKeyGuid: string;
36
+ metadataHash: string;
37
+ sessionKeyGuid: string;
32
38
  },
33
39
  ) {
34
40
  super({ nodeUrl: rpcUrl }, provider);
@@ -43,6 +49,9 @@ export default class SessionAccount extends WalletAccount {
43
49
  {
44
50
  expiresAt,
45
51
  policies,
52
+ guardianKeyGuid,
53
+ metadataHash,
54
+ sessionKeyGuid,
46
55
  },
47
56
  );
48
57
  }
@@ -14,6 +14,9 @@ interface SessionRegistration {
14
14
  ownerGuid: string;
15
15
  transactionHash?: string;
16
16
  expiresAt: string;
17
+ guardianKeyGuid: string;
18
+ metadataHash: string;
19
+ sessionKeyGuid: string;
17
20
  }
18
21
 
19
22
  export type SessionOptions = {
@@ -251,6 +254,9 @@ export default class SessionProvider extends BaseProvider {
251
254
  chainId: this._chainId,
252
255
  expiresAt: parseInt(sessionRegistration.expiresAt),
253
256
  policies: toWasmPolicies(this._policies),
257
+ guardianKeyGuid: sessionRegistration.guardianKeyGuid,
258
+ metadataHash: sessionRegistration.metadataHash,
259
+ sessionKeyGuid: sessionRegistration.sessionKeyGuid,
254
260
  });
255
261
 
256
262
  return this.account;
@@ -20,6 +20,9 @@ interface SessionRegistration {
20
20
  ownerGuid: string;
21
21
  transactionHash?: string;
22
22
  expiresAt: string;
23
+ guardianKeyGuid: string;
24
+ metadataHash: string;
25
+ sessionKeyGuid: string;
23
26
  }
24
27
 
25
28
  export default class TelegramProvider extends BaseProvider {
@@ -135,6 +138,9 @@ export default class TelegramProvider extends BaseProvider {
135
138
  chainId: this._chainId,
136
139
  expiresAt: parseInt(sessionRegistration.expiresAt),
137
140
  policies: toWasmPolicies(this._policies),
141
+ guardianKeyGuid: sessionRegistration.guardianKeyGuid,
142
+ metadataHash: sessionRegistration.metadataHash,
143
+ sessionKeyGuid: sessionRegistration.sessionKeyGuid,
138
144
  });
139
145
 
140
146
  return this.account;
package/src/types.ts CHANGED
@@ -223,6 +223,7 @@ export type ProfileContextTypeVariant =
223
223
  | "inventory"
224
224
  | "trophies"
225
225
  | "achievements"
226
+ | "leaderboard"
226
227
  | "activity";
227
228
 
228
229
  export type Tokens = {
@@ -1,12 +1,13 @@
1
+ import { ArgentWallet } from "./argent";
2
+ import { MetaMaskWallet } from "./metamask";
3
+ import { PhantomWallet } from "./phantom";
4
+ import { RabbyWallet } from "./rabby";
1
5
  import {
2
- ExternalWalletType,
3
- WalletAdapter,
4
6
  ExternalWallet,
5
7
  ExternalWalletResponse,
8
+ ExternalWalletType,
9
+ WalletAdapter,
6
10
  } from "./types";
7
- import { MetaMaskWallet } from "./metamask";
8
- import { PhantomWallet } from "./phantom";
9
- import { ArgentWallet } from "./argent";
10
11
 
11
12
  export class WalletBridge {
12
13
  private readonly walletAdapters: Map<ExternalWalletType, WalletAdapter>;
@@ -22,6 +23,7 @@ export class WalletBridge {
22
23
  this.walletAdapters.set("metamask", new MetaMaskWallet());
23
24
  this.walletAdapters.set("phantom", new PhantomWallet());
24
25
  this.walletAdapters.set("argent", new ArgentWallet());
26
+ this.walletAdapters.set("rabby", new RabbyWallet());
25
27
 
26
28
  if (typeof window !== "undefined") {
27
29
  window.wallet_bridge = this;
@@ -239,8 +241,8 @@ declare global {
239
241
  }
240
242
 
241
243
  export type {
242
- ExternalWalletType,
243
244
  ExternalWallet,
244
245
  ExternalWalletResponse,
246
+ ExternalWalletType,
245
247
  WalletAdapter,
246
248
  } from "./types";
@@ -1,5 +1,8 @@
1
- export * from "./types";
1
+ export * from "./argent";
2
2
  export * from "./bridge";
3
3
  export * from "./metamask";
4
4
  export * from "./phantom";
5
- export * from "./argent";
5
+ export * from "./rabby";
6
+ export * from "./turnkey";
7
+ export * from "./types";
8
+ export * from "./wallet-connect";
@@ -1,11 +1,11 @@
1
+ import { MetaMaskSDK } from "@metamask/sdk";
1
2
  import {
2
- WalletAdapter,
3
+ ExternalPlatform,
3
4
  ExternalWallet,
4
5
  ExternalWalletResponse,
5
6
  ExternalWalletType,
6
- ExternalPlatform,
7
+ WalletAdapter,
7
8
  } from "../types";
8
- import { MetaMaskSDK } from "@metamask/sdk";
9
9
 
10
10
  export class MetaMaskWallet implements WalletAdapter {
11
11
  readonly type: ExternalWalletType = "metamask";
@@ -101,8 +101,9 @@ export class MetaMaskWallet implements WalletAdapter {
101
101
  throw new Error("MetaMask is not connected");
102
102
  }
103
103
 
104
- const result = await this.MMSDK.connectAndSign({
105
- msg: message,
104
+ const result = await this.MMSDK.getProvider()?.request({
105
+ method: "personal_sign",
106
+ params: [this.account!, message],
106
107
  });
107
108
 
108
109
  return { success: true, wallet: this.type, result };
@@ -0,0 +1,231 @@
1
+ import { createStore, EIP6963ProviderDetail } from "mipd";
2
+ import {
3
+ ExternalPlatform,
4
+ ExternalWallet,
5
+ ExternalWalletResponse,
6
+ ExternalWalletType,
7
+ WalletAdapter,
8
+ } from "../types";
9
+
10
+ const RABBY_RDNS = "io.rabby";
11
+
12
+ export class RabbyWallet implements WalletAdapter {
13
+ readonly type: ExternalWalletType = "rabby";
14
+ readonly platform: ExternalPlatform = "ethereum";
15
+ private account: string | undefined = undefined;
16
+ private store = createStore();
17
+ private provider: EIP6963ProviderDetail | undefined;
18
+
19
+ constructor() {
20
+ this.provider = this.store
21
+ .getProviders()
22
+ .find((provider) => provider.info.rdns === RABBY_RDNS);
23
+ this.store.subscribe((providerDetails) => {
24
+ const rabbyProvider = providerDetails.find(
25
+ (provider) => provider.info.rdns === RABBY_RDNS,
26
+ );
27
+ if (rabbyProvider) {
28
+ this.provider = rabbyProvider;
29
+ }
30
+ });
31
+ }
32
+
33
+ isAvailable(): boolean {
34
+ return !!this.provider;
35
+ }
36
+
37
+ getInfo(): ExternalWallet {
38
+ const available = this.isAvailable();
39
+
40
+ return {
41
+ type: this.type,
42
+ available,
43
+ version: available ? window.ethereum?.version || "Unknown" : undefined,
44
+ chainId: available ? window.ethereum?.chainId : undefined,
45
+ name: "Rabby",
46
+ platform: this.platform,
47
+ };
48
+ }
49
+
50
+ async connect(): Promise<ExternalWalletResponse<any>> {
51
+ if (this.account) {
52
+ return { success: true, wallet: this.type, account: this.account };
53
+ }
54
+
55
+ try {
56
+ if (!this.isAvailable()) {
57
+ throw new Error("Rabby is not available");
58
+ }
59
+
60
+ const accounts = await this.provider?.provider.request({
61
+ method: "eth_requestAccounts",
62
+ });
63
+ if (accounts && accounts.length > 0) {
64
+ this.account = accounts[0];
65
+ return { success: true, wallet: this.type, account: this.account };
66
+ }
67
+
68
+ throw new Error("No accounts found");
69
+ } catch (error) {
70
+ console.error(`Error connecting to Rabby:`, error);
71
+ return {
72
+ success: false,
73
+ wallet: this.type,
74
+ error: (error as Error).message || "Unknown error",
75
+ };
76
+ }
77
+ }
78
+
79
+ async signTransaction(
80
+ transaction: any,
81
+ ): Promise<ExternalWalletResponse<any>> {
82
+ try {
83
+ if (!this.isAvailable() || !this.account) {
84
+ throw new Error("Rabby is not connected");
85
+ }
86
+
87
+ const ethereum = this.provider?.provider;
88
+ if (!ethereum) {
89
+ throw new Error("Rabby is not connected");
90
+ }
91
+
92
+ const result = await ethereum.request({
93
+ method: "eth_sendTransaction",
94
+ params: [transaction],
95
+ });
96
+
97
+ return { success: true, wallet: this.type, result };
98
+ } catch (error) {
99
+ console.error(`Error signing transaction with Rabby:`, error);
100
+ return {
101
+ success: false,
102
+ wallet: this.type,
103
+ error: (error as Error).message || "Unknown error",
104
+ };
105
+ }
106
+ }
107
+
108
+ async signMessage(
109
+ message: `0x${string}`,
110
+ ): Promise<ExternalWalletResponse<any>> {
111
+ try {
112
+ if (!this.isAvailable() || !this.account) {
113
+ throw new Error("Rabby is not connected");
114
+ }
115
+
116
+ const result = await this.provider?.provider.request({
117
+ method: "personal_sign",
118
+ params: [this.account!, message] as any,
119
+ });
120
+
121
+ return { success: true, wallet: this.type, result };
122
+ } catch (error) {
123
+ console.error(`Error signing message with Rabby:`, error);
124
+ return {
125
+ success: false,
126
+ wallet: this.type,
127
+ error: (error as Error).message || "Unknown error",
128
+ };
129
+ }
130
+ }
131
+
132
+ async signTypedData(data: any): Promise<ExternalWalletResponse<any>> {
133
+ try {
134
+ if (!this.isAvailable() || !this.account) {
135
+ throw new Error("Rabby is not connected");
136
+ }
137
+
138
+ const provider = this.provider?.provider;
139
+ if (!provider) {
140
+ throw new Error("Rabby is not connected");
141
+ }
142
+
143
+ const result = await provider.request({
144
+ method: "eth_signTypedData_v4",
145
+ params: [this.account, JSON.stringify(data)] as any,
146
+ });
147
+
148
+ return { success: true, wallet: this.type, result };
149
+ } catch (error) {
150
+ console.error(`Error signing typed data with Rabby:`, error);
151
+ return {
152
+ success: false,
153
+ wallet: this.type,
154
+ error: (error as Error).message || "Unknown error",
155
+ };
156
+ }
157
+ }
158
+
159
+ async sendTransaction(_txn: any): Promise<ExternalWalletResponse<any>> {
160
+ return {
161
+ success: false,
162
+ wallet: this.type,
163
+ error: "Not implemented",
164
+ };
165
+ }
166
+
167
+ async switchChain(chainId: string): Promise<boolean> {
168
+ try {
169
+ if (!this.isAvailable()) {
170
+ throw new Error("Rabby is not available");
171
+ }
172
+
173
+ const provider = this.provider?.provider;
174
+ if (!provider) {
175
+ throw new Error("Rabby is not connected");
176
+ }
177
+
178
+ try {
179
+ await provider.request({
180
+ method: "wallet_switchEthereumChain",
181
+ params: [{ chainId }],
182
+ });
183
+ return true;
184
+ } catch (error) {
185
+ if ((error as any).code === 4902) {
186
+ console.warn("Chain not added to Rabby");
187
+ }
188
+ throw error;
189
+ }
190
+ } catch (error) {
191
+ console.error(`Error switching chain for Rabby:`, error);
192
+ return false;
193
+ }
194
+ }
195
+
196
+ async getBalance(
197
+ tokenAddress?: string,
198
+ ): Promise<ExternalWalletResponse<any>> {
199
+ try {
200
+ if (!this.isAvailable() || !this.account) {
201
+ throw new Error("Rabby is not connected");
202
+ }
203
+
204
+ if (tokenAddress) {
205
+ return {
206
+ success: false,
207
+ wallet: this.type,
208
+ error: "Not implemented for ERC20",
209
+ };
210
+ } else {
211
+ const provider = this.provider?.provider;
212
+ if (!provider) {
213
+ throw new Error("Rabby is not connected");
214
+ }
215
+
216
+ const balance = await provider.request({
217
+ method: "eth_getBalance",
218
+ params: [this.account, "latest"] as any,
219
+ });
220
+ return { success: true, wallet: this.type, result: balance };
221
+ }
222
+ } catch (error) {
223
+ console.error(`Error getting balance from Rabby:`, error);
224
+ return {
225
+ success: false,
226
+ wallet: this.type,
227
+ error: (error as Error).message || "Unknown error",
228
+ };
229
+ }
230
+ }
231
+ }
@@ -0,0 +1,191 @@
1
+ import { TurnkeyIframeClient } from "@turnkey/sdk-browser";
2
+ import { ethers, getBytes, Signature } from "ethers";
3
+ import {
4
+ ExternalPlatform,
5
+ ExternalWallet,
6
+ ExternalWalletResponse,
7
+ ExternalWalletType,
8
+ WalletAdapter,
9
+ } from "../types";
10
+
11
+ export class TurnkeyWallet implements WalletAdapter {
12
+ readonly type: ExternalWalletType = "turnkey" as ExternalWalletType;
13
+ readonly platform: ExternalPlatform = "ethereum";
14
+ private account: string | undefined = undefined;
15
+ private organizationId: string | undefined = undefined;
16
+
17
+ constructor(
18
+ private turnkeyIframeClient: TurnkeyIframeClient,
19
+ address?: string,
20
+ organizationId?: string,
21
+ ) {
22
+ this.account = address;
23
+ this.organizationId = organizationId;
24
+ }
25
+
26
+ isAvailable(): boolean {
27
+ return typeof window !== "undefined";
28
+ }
29
+
30
+ getInfo(): ExternalWallet {
31
+ const available = this.isAvailable();
32
+
33
+ return {
34
+ type: this.type,
35
+ available,
36
+ name: "Turnkey",
37
+ platform: this.platform,
38
+ };
39
+ }
40
+
41
+ async connect(): Promise<ExternalWalletResponse<any>> {
42
+ if (this.account) {
43
+ return { success: true, wallet: this.type, account: this.account };
44
+ }
45
+
46
+ try {
47
+ if (!this.isAvailable()) {
48
+ throw new Error("Turnkey is not available");
49
+ }
50
+
51
+ const accounts = await this.turnkeyIframeClient.getWallets();
52
+ if (accounts && accounts.wallets.length > 0) {
53
+ const walletAccount = await this.turnkeyIframeClient.getWalletAccount({
54
+ walletId: accounts.wallets[0].walletId,
55
+ });
56
+ this.account = walletAccount.account.address;
57
+ return { success: true, wallet: this.type, account: this.account };
58
+ }
59
+
60
+ throw new Error("No accounts found");
61
+ } catch (error) {
62
+ console.error(`Error connecting to Turnkey:`, error);
63
+ return {
64
+ success: false,
65
+ wallet: this.type,
66
+ error: (error as Error).message || "Unknown error",
67
+ };
68
+ }
69
+ }
70
+
71
+ async signTransaction(
72
+ transaction: any,
73
+ ): Promise<ExternalWalletResponse<any>> {
74
+ try {
75
+ if (!this.isAvailable() || !this.account) {
76
+ throw new Error("Turnkey is not connected");
77
+ }
78
+
79
+ const result = (
80
+ await this.turnkeyIframeClient.signTransaction({
81
+ organizationId: this.organizationId,
82
+ signWith: this.account,
83
+ unsignedTransaction: transaction,
84
+ type: "TRANSACTION_TYPE_ETHEREUM",
85
+ })
86
+ ).signedTransaction;
87
+
88
+ return { success: true, wallet: this.type, result };
89
+ } catch (error) {
90
+ console.error(`Error signing transaction with Turnkey:`, error);
91
+ return {
92
+ success: false,
93
+ wallet: this.type,
94
+ error: (error as Error).message || "Unknown error",
95
+ };
96
+ }
97
+ }
98
+
99
+ async signMessage(message: string): Promise<ExternalWalletResponse<any>> {
100
+ try {
101
+ if (!this.isAvailable() || !this.account) {
102
+ throw new Error("Turnkey is not connected");
103
+ }
104
+
105
+ const paddedMessage = `0x${message.replace("0x", "").padStart(64, "0")}`;
106
+ const messageBytes = getBytes(paddedMessage);
107
+ const messageHash = ethers.hashMessage(messageBytes);
108
+
109
+ const { r, s, v } = await this.turnkeyIframeClient.signRawPayload({
110
+ organizationId: this.organizationId,
111
+ signWith: this.account,
112
+ payload: messageHash,
113
+ encoding: "PAYLOAD_ENCODING_HEXADECIMAL",
114
+ hashFunction: "HASH_FUNCTION_NO_OP",
115
+ });
116
+
117
+ const rHex = r.startsWith("0x") ? r : "0x" + r;
118
+ const sHex = s.startsWith("0x") ? s : "0x" + s;
119
+
120
+ const vNumber = parseInt(v, 16);
121
+
122
+ if (isNaN(vNumber)) {
123
+ console.error(`Invalid recovery ID (v) received from Turnkey: ${v}`);
124
+ throw new Error(`Invalid recovery ID (v) received: ${v}`);
125
+ }
126
+
127
+ const signature = Signature.from({
128
+ r: rHex,
129
+ s: sHex,
130
+ v: vNumber,
131
+ });
132
+
133
+ return {
134
+ success: true,
135
+ wallet: this.type,
136
+ result: signature.serialized,
137
+ account: this.account,
138
+ };
139
+ } catch (error) {
140
+ console.error(`Error signing message with Turnkey:`, error);
141
+ return {
142
+ success: false,
143
+ wallet: this.type,
144
+ error: (error as Error).message || "Unknown error",
145
+ };
146
+ }
147
+ }
148
+
149
+ async signTypedData(data: any): Promise<ExternalWalletResponse<any>> {
150
+ return this.signMessage(data);
151
+ }
152
+
153
+ async sendTransaction(_txn: any): Promise<ExternalWalletResponse<any>> {
154
+ return {
155
+ success: false,
156
+ wallet: this.type,
157
+ error: "Not implemented",
158
+ };
159
+ }
160
+
161
+ async switchChain(_chainId: string): Promise<boolean> {
162
+ return false;
163
+ }
164
+
165
+ async getBalance(
166
+ tokenAddress?: string,
167
+ ): Promise<ExternalWalletResponse<any>> {
168
+ try {
169
+ if (!this.isAvailable() || !this.account) {
170
+ throw new Error("Turnkey is not connected");
171
+ }
172
+
173
+ if (tokenAddress) {
174
+ return {
175
+ success: false,
176
+ wallet: this.type,
177
+ error: "Not implemented for ERC20",
178
+ };
179
+ } else {
180
+ return { success: true, wallet: this.type, result: "0" };
181
+ }
182
+ } catch (error) {
183
+ console.error(`Error getting balance from Turnkey:`, error);
184
+ return {
185
+ success: false,
186
+ wallet: this.type,
187
+ error: (error as Error).message || "Unknown error",
188
+ };
189
+ }
190
+ }
191
+ }
@@ -1,4 +1,4 @@
1
- export type ExternalWalletType = "argent" | "metamask" | "phantom";
1
+ export type ExternalWalletType = "argent" | "metamask" | "phantom" | "rabby";
2
2
  export type ExternalPlatform = "starknet" | "ethereum" | "solana";
3
3
 
4
4
  export interface ExternalWallet {