@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.
- package/.turbo/turbo-build$colon$deps.log +51 -49
- package/.turbo/turbo-build.log +47 -45
- package/dist/icon.d.ts +1 -1
- package/dist/index.js +3307 -1392
- package/dist/index.js.map +1 -1
- package/dist/node/index.cjs +14 -5
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +1 -1
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.js +14 -5
- package/dist/node/index.js.map +1 -1
- package/dist/provider-LFJfEvkl.js +287 -0
- package/dist/provider-LFJfEvkl.js.map +1 -0
- package/dist/session/account.d.ts +4 -1
- package/dist/session.js +86 -77
- package/dist/session.js.map +1 -1
- package/dist/stats.html +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/wallets/bridge.d.ts +2 -2
- package/dist/wallets/index.d.ts +5 -2
- package/dist/wallets/metamask/index.d.ts +1 -1
- package/dist/wallets/rabby/index.d.ts +18 -0
- package/dist/wallets/turnkey/index.d.ts +19 -0
- package/dist/wallets/types.d.ts +1 -1
- package/dist/wallets/wallet-connect/index.d.ts +18 -0
- package/package.json +9 -4
- package/src/icon.ts +1 -1
- package/src/iframe/base.ts +1 -0
- package/src/node/account.ts +9 -0
- package/src/node/provider.ts +3 -0
- package/src/session/account.ts +9 -0
- package/src/session/provider.ts +6 -0
- package/src/telegram/provider.ts +6 -0
- package/src/types.ts +1 -0
- package/src/wallets/bridge.ts +8 -6
- package/src/wallets/index.ts +5 -2
- package/src/wallets/metamask/index.ts +6 -5
- package/src/wallets/rabby/index.ts +231 -0
- package/src/wallets/turnkey/index.ts +191 -0
- package/src/wallets/types.ts +1 -1
- package/src/wallets/wallet-connect/index.ts +196 -0
- package/.turbo/turbo-format.log +0 -39
- package/dist/provider-BDCJkGu6.js +0 -287
- 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";
|
package/src/iframe/base.ts
CHANGED
|
@@ -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 =
|
package/src/node/account.ts
CHANGED
|
@@ -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
|
}
|
package/src/node/provider.ts
CHANGED
|
@@ -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;
|
package/src/session/account.ts
CHANGED
|
@@ -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
|
}
|
package/src/session/provider.ts
CHANGED
|
@@ -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;
|
package/src/telegram/provider.ts
CHANGED
|
@@ -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
package/src/wallets/bridge.ts
CHANGED
|
@@ -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";
|
package/src/wallets/index.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
export * from "./
|
|
1
|
+
export * from "./argent";
|
|
2
2
|
export * from "./bridge";
|
|
3
3
|
export * from "./metamask";
|
|
4
4
|
export * from "./phantom";
|
|
5
|
-
export * from "./
|
|
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
|
-
|
|
3
|
+
ExternalPlatform,
|
|
3
4
|
ExternalWallet,
|
|
4
5
|
ExternalWalletResponse,
|
|
5
6
|
ExternalWalletType,
|
|
6
|
-
|
|
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.
|
|
105
|
-
|
|
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
|
+
}
|
package/src/wallets/types.ts
CHANGED