@cartridge/controller 0.8.0 → 0.9.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/.turbo/turbo-build$colon$deps.log +51 -49
- package/.turbo/turbo-build.log +47 -45
- package/dist/account.d.ts +2 -3
- package/dist/controller.d.ts +2 -3
- package/dist/iframe/base.d.ts +1 -0
- package/dist/iframe/index.d.ts +0 -1
- package/dist/iframe/keychain.d.ts +4 -2
- package/dist/index.js +466 -518
- package/dist/index.js.map +1 -1
- package/dist/node/index.cjs +2 -2
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +2 -2
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +2 -2
- package/dist/node/index.js.map +1 -1
- package/dist/{provider-ClUbos7A.js → provider-iltRv2Q1.js} +21 -22
- package/dist/provider-iltRv2Q1.js.map +1 -0
- package/dist/provider.d.ts +1 -1
- package/dist/session.js +10 -10
- package/dist/session.js.map +1 -1
- package/dist/stats.html +1 -1
- package/dist/types.d.ts +4 -8
- package/dist/wallets/bridge.d.ts +2 -2
- package/dist/wallets/metamask/index.d.ts +2 -2
- package/dist/wallets/rabby/index.d.ts +1 -1
- package/dist/wallets/types.d.ts +2 -2
- package/package.json +7 -6
- package/src/account.ts +5 -8
- package/src/controller.ts +32 -74
- package/src/iframe/base.ts +6 -24
- package/src/iframe/index.ts +0 -1
- package/src/iframe/keychain.ts +32 -2
- package/src/node/account.ts +1 -1
- package/src/provider.ts +9 -9
- package/src/session/account.ts +1 -2
- package/src/types.ts +3 -11
- package/src/wallets/bridge.ts +5 -18
- package/src/wallets/metamask/index.ts +9 -13
- package/src/wallets/rabby/index.ts +9 -4
- package/src/wallets/types.ts +5 -2
- package/.turbo/turbo-format$colon$check.log +0 -7
- package/.turbo/turbo-format.log +0 -44
- package/dist/iframe/profile.d.ts +0 -12
- package/dist/provider-ClUbos7A.js.map +0 -1
- package/src/iframe/profile.ts +0 -59
package/src/types.ts
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
constants,
|
|
13
13
|
InvocationsDetails,
|
|
14
14
|
} from "starknet";
|
|
15
|
-
import { KeychainIFrame
|
|
15
|
+
import { KeychainIFrame } from "./iframe";
|
|
16
16
|
import {
|
|
17
17
|
ExternalWallet,
|
|
18
18
|
ExternalWalletResponse,
|
|
@@ -85,7 +85,6 @@ export type DeployReply = {
|
|
|
85
85
|
|
|
86
86
|
export type IFrames = {
|
|
87
87
|
keychain: KeychainIFrame;
|
|
88
|
-
profile?: ProfileIFrame;
|
|
89
88
|
version?: number;
|
|
90
89
|
};
|
|
91
90
|
|
|
@@ -118,7 +117,6 @@ export interface Keychain {
|
|
|
118
117
|
policies: SessionPolicies,
|
|
119
118
|
rpcUrl: string,
|
|
120
119
|
signupOptions?: AuthOptions,
|
|
121
|
-
version?: string,
|
|
122
120
|
): Promise<ConnectReply | ConnectError>;
|
|
123
121
|
disconnect(): void;
|
|
124
122
|
|
|
@@ -150,6 +148,7 @@ export interface Keychain {
|
|
|
150
148
|
openExecute(calls: Call[]): Promise<void>;
|
|
151
149
|
switchChain(rpcUrl: string): Promise<void>;
|
|
152
150
|
openStarterPack(starterpackId: string): void;
|
|
151
|
+
navigate(path: string): Promise<void>;
|
|
153
152
|
|
|
154
153
|
// External wallet methods
|
|
155
154
|
externalDetectWallets(): Promise<ExternalWallet[]>;
|
|
@@ -185,9 +184,7 @@ export interface Modal {
|
|
|
185
184
|
/**
|
|
186
185
|
* Options for configuring the controller
|
|
187
186
|
*/
|
|
188
|
-
export type ControllerOptions = ProviderOptions &
|
|
189
|
-
KeychainOptions &
|
|
190
|
-
ProfileOptions;
|
|
187
|
+
export type ControllerOptions = ProviderOptions & KeychainOptions;
|
|
191
188
|
|
|
192
189
|
export type IFrameOptions = {
|
|
193
190
|
/** The ID of the starter pack to use */
|
|
@@ -219,11 +216,6 @@ export type KeychainOptions = IFrameOptions & {
|
|
|
219
216
|
signupOptions?: AuthOptions;
|
|
220
217
|
/** When true, manually provided policies will override preset policies. Default is false. */
|
|
221
218
|
shouldOverridePresetPolicies?: boolean;
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
export type ProfileOptions = IFrameOptions & {
|
|
225
|
-
/** The URL of profile. Mainly for internal development purpose */
|
|
226
|
-
profileUrl?: string;
|
|
227
219
|
/** The project name of Slot instance. */
|
|
228
220
|
slot?: string;
|
|
229
221
|
/** The namespace to use to fetch trophies data from indexer. Will be mandatory once profile page is in production */
|
package/src/wallets/bridge.ts
CHANGED
|
@@ -38,9 +38,8 @@ export class WalletBridge {
|
|
|
38
38
|
getIFrameMethods() {
|
|
39
39
|
return {
|
|
40
40
|
externalDetectWallets: (_origin: string) => () => this.detectWallets(),
|
|
41
|
-
externalConnectWallet:
|
|
42
|
-
(
|
|
43
|
-
this.connectWallet(type, address),
|
|
41
|
+
externalConnectWallet: (_origin: string) => (type: ExternalWalletType) =>
|
|
42
|
+
this.connectWallet(type),
|
|
44
43
|
externalSignMessage:
|
|
45
44
|
(_origin: string) =>
|
|
46
45
|
(identifier: ExternalWalletType | string, message: string) =>
|
|
@@ -102,11 +101,10 @@ export class WalletBridge {
|
|
|
102
101
|
|
|
103
102
|
async connectWallet(
|
|
104
103
|
type: ExternalWalletType,
|
|
105
|
-
address?: string,
|
|
106
104
|
): Promise<ExternalWalletResponse> {
|
|
107
105
|
try {
|
|
108
106
|
const wallet = this.getWalletAdapterByType(type);
|
|
109
|
-
const response = await wallet.connect(
|
|
107
|
+
const response = await wallet.connect();
|
|
110
108
|
|
|
111
109
|
if (response.success && response.account) {
|
|
112
110
|
console.log(
|
|
@@ -138,23 +136,12 @@ export class WalletBridge {
|
|
|
138
136
|
const checkSummedAddress = getAddress(identifier);
|
|
139
137
|
|
|
140
138
|
wallet = this.walletAdapters.values().find((adapter) => {
|
|
141
|
-
return (
|
|
142
|
-
adapter.getConnectedAccounts().includes(checkSummedAddress) ||
|
|
143
|
-
adapter.type === checkSummedAddress
|
|
144
|
-
);
|
|
139
|
+
return adapter.getConnectedAccounts().includes(checkSummedAddress);
|
|
145
140
|
});
|
|
146
141
|
} else {
|
|
147
142
|
wallet = this.walletAdapters.get(identifier);
|
|
148
143
|
}
|
|
149
144
|
|
|
150
|
-
if (!wallet && typeof identifier === "string") {
|
|
151
|
-
wallet = this.walletAdapters
|
|
152
|
-
.values()
|
|
153
|
-
.find((adapter) =>
|
|
154
|
-
adapter.getConnectedAccounts().includes(getAddress(identifier)),
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
145
|
if (!wallet) {
|
|
159
146
|
throw new Error(
|
|
160
147
|
`Wallet with identifier ${identifier} is not connected or supported`,
|
|
@@ -175,7 +162,7 @@ export class WalletBridge {
|
|
|
175
162
|
`Wallet type ${wallet.type} (identifier: ${identifier}) does not support signing messages`,
|
|
176
163
|
);
|
|
177
164
|
}
|
|
178
|
-
return await wallet.signMessage(message);
|
|
165
|
+
return await wallet.signMessage(message, identifier);
|
|
179
166
|
} catch (error) {
|
|
180
167
|
return this.handleError(
|
|
181
168
|
identifier,
|
|
@@ -33,19 +33,15 @@ export class MetaMaskWallet implements WalletAdapter {
|
|
|
33
33
|
.then((accounts: any) => {
|
|
34
34
|
if (accounts && accounts.length > 0) {
|
|
35
35
|
this.account = getAddress(accounts[0]);
|
|
36
|
-
this.connectedAccounts = accounts.map(
|
|
37
|
-
getAddress(account),
|
|
38
|
-
);
|
|
36
|
+
this.connectedAccounts = accounts.map(getAddress);
|
|
39
37
|
}
|
|
40
38
|
});
|
|
41
39
|
this.MMSDK.getProvider()?.on("accountsChanged", (accounts: any) => {
|
|
42
40
|
if (Array.isArray(accounts)) {
|
|
43
41
|
if (accounts.length > 0) {
|
|
44
42
|
this.account = getAddress(accounts?.[0]);
|
|
43
|
+
this.connectedAccounts = accounts.map(getAddress);
|
|
45
44
|
}
|
|
46
|
-
this.connectedAccounts = accounts.map((account: string) =>
|
|
47
|
-
getAddress(account),
|
|
48
|
-
);
|
|
49
45
|
}
|
|
50
46
|
});
|
|
51
47
|
});
|
|
@@ -75,11 +71,7 @@ export class MetaMaskWallet implements WalletAdapter {
|
|
|
75
71
|
};
|
|
76
72
|
}
|
|
77
73
|
|
|
78
|
-
async connect(
|
|
79
|
-
if (address && this.connectedAccounts.includes(getAddress(address))) {
|
|
80
|
-
this.account = getAddress(address);
|
|
81
|
-
}
|
|
82
|
-
|
|
74
|
+
async connect(): Promise<ExternalWalletResponse<any>> {
|
|
83
75
|
if (this.account) {
|
|
84
76
|
return { success: true, wallet: this.type, account: this.account };
|
|
85
77
|
}
|
|
@@ -95,6 +87,7 @@ export class MetaMaskWallet implements WalletAdapter {
|
|
|
95
87
|
this.connectedAccounts = accounts.map((account: string) =>
|
|
96
88
|
getAddress(account),
|
|
97
89
|
);
|
|
90
|
+
|
|
98
91
|
return { success: true, wallet: this.type, account: this.account };
|
|
99
92
|
}
|
|
100
93
|
|
|
@@ -142,7 +135,10 @@ export class MetaMaskWallet implements WalletAdapter {
|
|
|
142
135
|
}
|
|
143
136
|
}
|
|
144
137
|
|
|
145
|
-
async signMessage(
|
|
138
|
+
async signMessage(
|
|
139
|
+
message: string,
|
|
140
|
+
address?: string,
|
|
141
|
+
): Promise<ExternalWalletResponse<any>> {
|
|
146
142
|
try {
|
|
147
143
|
if (!this.isAvailable() || !this.account) {
|
|
148
144
|
throw new Error("MetaMask is not connected");
|
|
@@ -150,7 +146,7 @@ export class MetaMaskWallet implements WalletAdapter {
|
|
|
150
146
|
|
|
151
147
|
const result = await this.MMSDK.getProvider()?.request({
|
|
152
148
|
method: "personal_sign",
|
|
153
|
-
params: [this.account, message],
|
|
149
|
+
params: [address || this.account, message],
|
|
154
150
|
});
|
|
155
151
|
|
|
156
152
|
return { success: true, wallet: this.type, result };
|
|
@@ -27,7 +27,10 @@ export class RabbyWallet implements WalletAdapter {
|
|
|
27
27
|
method: "eth_accounts",
|
|
28
28
|
})
|
|
29
29
|
.then((accounts) => {
|
|
30
|
-
this.connectedAccounts = accounts;
|
|
30
|
+
this.connectedAccounts = accounts.map(getAddress);
|
|
31
|
+
if (accounts.length > 0) {
|
|
32
|
+
this.account = getAddress(accounts?.[0]);
|
|
33
|
+
}
|
|
31
34
|
});
|
|
32
35
|
this.provider?.provider?.on("accountsChanged", (accounts: string[]) => {
|
|
33
36
|
if (accounts) {
|
|
@@ -74,8 +77,8 @@ export class RabbyWallet implements WalletAdapter {
|
|
|
74
77
|
method: "eth_requestAccounts",
|
|
75
78
|
});
|
|
76
79
|
if (accounts && accounts.length > 0) {
|
|
77
|
-
this.account = accounts[0];
|
|
78
|
-
this.connectedAccounts = accounts;
|
|
80
|
+
this.account = getAddress(accounts[0]);
|
|
81
|
+
this.connectedAccounts = accounts.map(getAddress);
|
|
79
82
|
return { success: true, wallet: this.type, account: this.account };
|
|
80
83
|
}
|
|
81
84
|
|
|
@@ -125,14 +128,16 @@ export class RabbyWallet implements WalletAdapter {
|
|
|
125
128
|
|
|
126
129
|
async signMessage(
|
|
127
130
|
message: `0x${string}`,
|
|
131
|
+
address?: string,
|
|
128
132
|
): Promise<ExternalWalletResponse<any>> {
|
|
129
133
|
try {
|
|
130
134
|
if (!this.isAvailable() || !this.account) {
|
|
131
135
|
throw new Error("Rabby is not connected");
|
|
132
136
|
}
|
|
137
|
+
|
|
133
138
|
const result = await this.provider?.provider.request({
|
|
134
139
|
method: "personal_sign",
|
|
135
|
-
params: [this.account
|
|
140
|
+
params: [address || this.account, message] as any,
|
|
136
141
|
});
|
|
137
142
|
|
|
138
143
|
return { success: true, wallet: this.type, result };
|
package/src/wallets/types.ts
CHANGED
|
@@ -27,8 +27,11 @@ export interface WalletAdapter {
|
|
|
27
27
|
isAvailable(): boolean;
|
|
28
28
|
getInfo(): ExternalWallet;
|
|
29
29
|
getConnectedAccounts(): string[];
|
|
30
|
-
connect(
|
|
31
|
-
signMessage?(
|
|
30
|
+
connect(): Promise<ExternalWalletResponse<any>>;
|
|
31
|
+
signMessage?(
|
|
32
|
+
message: string,
|
|
33
|
+
address?: string,
|
|
34
|
+
): Promise<ExternalWalletResponse<any>>;
|
|
32
35
|
signTypedData?(data: any): Promise<ExternalWalletResponse<any>>;
|
|
33
36
|
sendTransaction(tx: any): Promise<ExternalWalletResponse<any>>;
|
|
34
37
|
getBalance(tokenAddress?: string): Promise<ExternalWalletResponse<any>>;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
> @cartridge/controller@0.8.0 format:check /Users/tarrencevanas/code/c7e/controller/packages/controller
|
|
4
|
-
> prettier --check "src/**/*.ts"
|
|
5
|
-
|
|
6
|
-
Checking formatting...
|
|
7
|
-
src/__tests__/controllerDefaults.test.ts[2K[1Gsrc/__tests__/parseChainId.test.ts[2K[1Gsrc/__tests__/setup.ts[2K[1Gsrc/account.ts[2K[1Gsrc/constants.ts[2K[1Gsrc/controller.ts[2K[1Gsrc/errors.ts[2K[1Gsrc/icon.ts[2K[1Gsrc/iframe/base.ts[2K[1Gsrc/iframe/index.ts[2K[1Gsrc/iframe/keychain.ts[2K[1Gsrc/iframe/profile.ts[2K[1Gsrc/index.ts[2K[1Gsrc/lookup.ts[2K[1Gsrc/mutex.ts[2K[1Gsrc/node/account.ts[2K[1Gsrc/node/backend.ts[2K[1Gsrc/node/index.ts[2K[1Gsrc/node/provider.ts[2K[1Gsrc/node/server.ts[2K[1Gsrc/policies.ts[2K[1Gsrc/provider.ts[2K[1Gsrc/session/account.ts[2K[1Gsrc/session/backend.ts[2K[1Gsrc/session/index.ts[2K[1Gsrc/session/provider.ts[2K[1Gsrc/telegram/backend.ts[2K[1Gsrc/telegram/provider.ts[2K[1Gsrc/types.ts[2K[1Gsrc/utils.ts[2K[1Gsrc/wallets/argent/index.ts[2K[1Gsrc/wallets/bridge.ts[2K[1Gsrc/wallets/index.ts[2K[1Gsrc/wallets/metamask/index.ts[2K[1Gsrc/wallets/phantom/index.ts[2K[1Gsrc/wallets/rabby/index.ts[2K[1Gsrc/wallets/types.ts[2K[1GAll matched files use Prettier code style!
|
package/.turbo/turbo-format.log
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
> @cartridge/controller@0.7.14-alpha.3 format /Users/tarrencevanas/code/c7e/controller/packages/controller
|
|
4
|
-
> prettier --write "src/**/*.ts"
|
|
5
|
-
|
|
6
|
-
src/__tests__/controllerDefaults.test.ts[2K[1G[90msrc/__tests__/controllerDefaults.test.ts[39m 49ms (unchanged)
|
|
7
|
-
src/__tests__/parseChainId.test.ts[2K[1G[90msrc/__tests__/parseChainId.test.ts[39m 7ms (unchanged)
|
|
8
|
-
src/__tests__/setup.ts[2K[1Gsrc/__tests__/setup.ts 5ms
|
|
9
|
-
src/account.ts[2K[1G[90msrc/account.ts[39m 17ms (unchanged)
|
|
10
|
-
src/constants.ts[2K[1G[90msrc/constants.ts[39m 3ms (unchanged)
|
|
11
|
-
src/controller.ts[2K[1G[90msrc/controller.ts[39m 57ms (unchanged)
|
|
12
|
-
src/errors.ts[2K[1G[90msrc/errors.ts[39m 2ms (unchanged)
|
|
13
|
-
src/icon.ts[2K[1G[90msrc/icon.ts[39m 1ms (unchanged)
|
|
14
|
-
src/iframe/base.ts[2K[1G[90msrc/iframe/base.ts[39m 22ms (unchanged)
|
|
15
|
-
src/iframe/index.ts[2K[1G[90msrc/iframe/index.ts[39m 11ms (unchanged)
|
|
16
|
-
src/iframe/keychain.ts[2K[1G[90msrc/iframe/keychain.ts[39m 7ms (unchanged)
|
|
17
|
-
src/iframe/profile.ts[2K[1G[90msrc/iframe/profile.ts[39m 4ms (unchanged)
|
|
18
|
-
src/index.ts[2K[1G[90msrc/index.ts[39m 2ms (unchanged)
|
|
19
|
-
src/lookup.ts[2K[1G[90msrc/lookup.ts[39m 55ms (unchanged)
|
|
20
|
-
src/mutex.ts[2K[1G[90msrc/mutex.ts[39m 16ms (unchanged)
|
|
21
|
-
src/node/account.ts[2K[1G[90msrc/node/account.ts[39m 6ms (unchanged)
|
|
22
|
-
src/node/backend.ts[2K[1G[90msrc/node/backend.ts[39m 16ms (unchanged)
|
|
23
|
-
src/node/index.ts[2K[1G[90msrc/node/index.ts[39m 1ms (unchanged)
|
|
24
|
-
src/node/provider.ts[2K[1G[90msrc/node/provider.ts[39m 16ms (unchanged)
|
|
25
|
-
src/node/server.ts[2K[1G[90msrc/node/server.ts[39m 7ms (unchanged)
|
|
26
|
-
src/policies.ts[2K[1G[90msrc/policies.ts[39m 3ms (unchanged)
|
|
27
|
-
src/provider.ts[2K[1G[90msrc/provider.ts[39m 20ms (unchanged)
|
|
28
|
-
src/session/account.ts[2K[1G[90msrc/session/account.ts[39m 2ms (unchanged)
|
|
29
|
-
src/session/backend.ts[2K[1G[90msrc/session/backend.ts[39m 2ms (unchanged)
|
|
30
|
-
src/session/index.ts[2K[1G[90msrc/session/index.ts[39m 1ms (unchanged)
|
|
31
|
-
src/session/provider.ts[2K[1G[90msrc/session/provider.ts[39m 15ms (unchanged)
|
|
32
|
-
src/telegram/backend.ts[2K[1G[90msrc/telegram/backend.ts[39m 1ms (unchanged)
|
|
33
|
-
src/telegram/provider.ts[2K[1G[90msrc/telegram/provider.ts[39m 9ms (unchanged)
|
|
34
|
-
src/types.ts[2K[1G[90msrc/types.ts[39m 20ms (unchanged)
|
|
35
|
-
src/utils.ts[2K[1G[90msrc/utils.ts[39m 26ms (unchanged)
|
|
36
|
-
src/wallets/argent/index.ts[2K[1G[90msrc/wallets/argent/index.ts[39m 11ms (unchanged)
|
|
37
|
-
src/wallets/bridge.ts[2K[1G[90msrc/wallets/bridge.ts[39m 27ms (unchanged)
|
|
38
|
-
src/wallets/index.ts[2K[1G[90msrc/wallets/index.ts[39m 1ms (unchanged)
|
|
39
|
-
src/wallets/metamask/index.ts[2K[1G[90msrc/wallets/metamask/index.ts[39m 23ms (unchanged)
|
|
40
|
-
src/wallets/phantom/index.ts[2K[1G[90msrc/wallets/phantom/index.ts[39m 9ms (unchanged)
|
|
41
|
-
src/wallets/rabby/index.ts[2K[1G[90msrc/wallets/rabby/index.ts[39m 20ms (unchanged)
|
|
42
|
-
src/wallets/turnkey/index.ts[2K[1G[90msrc/wallets/turnkey/index.ts[39m 10ms (unchanged)
|
|
43
|
-
src/wallets/types.ts[2K[1G[90msrc/wallets/types.ts[39m 2ms (unchanged)
|
|
44
|
-
src/wallets/wallet-connect/index.ts[2K[1G[90msrc/wallets/wallet-connect/index.ts[39m 19ms (unchanged)
|
package/dist/iframe/profile.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Profile, ProfileOptions } from '../types';
|
|
2
|
-
import { IFrame, IFrameOptions } from './base';
|
|
3
|
-
export type ProfileIFrameOptions = IFrameOptions<Profile> & ProfileOptions & {
|
|
4
|
-
rpcUrl: string;
|
|
5
|
-
version?: string;
|
|
6
|
-
username: string;
|
|
7
|
-
slot?: string;
|
|
8
|
-
namespace?: string;
|
|
9
|
-
};
|
|
10
|
-
export declare class ProfileIFrame extends IFrame<Profile> {
|
|
11
|
-
constructor({ profileUrl, rpcUrl, version, username, slot, namespace, tokens, ...iframeOptions }: ProfileIFrameOptions);
|
|
12
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider-ClUbos7A.js","sources":["../src/types.ts","../src/utils.ts","../src/errors.ts","../src/constants.ts","../../../node_modules/.pnpm/@starknet-io+types-js@0.7.10/node_modules/@starknet-io/types-js/dist/esm/wallet-api/constants.js","../src/icon.ts","../src/mutex.ts","../src/provider.ts"],"sourcesContent":["import { Policy, SessionPolicies } from \"@cartridge/presets\";\nimport {\n AddInvokeTransactionResult,\n ChainId,\n Signature,\n TypedData,\n} from \"@starknet-io/types-js\";\nimport {\n Abi,\n BigNumberish,\n Call,\n constants,\n InvocationsDetails,\n} from \"starknet\";\nimport { KeychainIFrame, ProfileIFrame } from \"./iframe\";\nimport {\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n} from \"./wallets/types\";\n\nexport type Session = {\n chainId: constants.StarknetChainId;\n policies: Policy[];\n maxFee: BigNumberish;\n expiresAt: bigint;\n credentials: {\n authorization: string[];\n privateKey: string;\n };\n};\n\nexport type AuthOption =\n | \"webauthn\"\n | \"discord\"\n | \"walletconnect\"\n | ExternalWalletType;\n\nexport type AuthOptions = Omit<AuthOption, \"phantom\" | \"argent\">[];\n\nexport enum ResponseCodes {\n SUCCESS = \"SUCCESS\",\n NOT_CONNECTED = \"NOT_CONNECTED\",\n ERROR = \"ERROR\",\n CANCELED = \"CANCELED\",\n USER_INTERACTION_REQUIRED = \"USER_INTERACTION_REQUIRED\",\n}\n\nexport type ConnectError = {\n code: ResponseCodes;\n message: string;\n error?: ControllerError;\n};\n\nexport type ControllerError = {\n code: Number;\n message: string;\n data?: any;\n};\n\nexport type ConnectReply = {\n code: ResponseCodes.SUCCESS;\n address: string;\n policies?: SessionPolicies;\n};\n\nexport type ExecuteReply =\n | (AddInvokeTransactionResult & {\n code: ResponseCodes.SUCCESS;\n })\n | {\n code: ResponseCodes.USER_INTERACTION_REQUIRED;\n };\n\nexport type ProbeReply = {\n code: ResponseCodes.SUCCESS;\n address: string;\n rpcUrl?: string;\n};\n\nexport type DeployReply = {\n code: ResponseCodes.SUCCESS;\n transaction_hash: string;\n};\n\nexport type IFrames = {\n keychain: KeychainIFrame;\n profile?: ProfileIFrame;\n version?: number;\n};\n\nexport interface LookupRequest {\n usernames?: string[];\n addresses?: string[];\n}\n\nexport interface LookupResult {\n username: string;\n addresses: string[];\n}\n\nexport interface LookupResponse {\n results: LookupResult[];\n}\n\nexport enum FeeSource {\n PAYMASTER = \"PAYMASTER\",\n CREDITS = \"CREDITS\",\n}\n\ntype ContractAddress = string;\ntype CartridgeID = string;\nexport type ControllerAccounts = Record<ContractAddress, CartridgeID>;\n\nexport interface Keychain {\n probe(rpcUrl: string): Promise<ProbeReply | ConnectError>;\n connect(\n policies: SessionPolicies,\n rpcUrl: string,\n signupOptions?: AuthOptions,\n version?: string,\n ): Promise<ConnectReply | ConnectError>;\n disconnect(): void;\n\n reset(): void;\n revoke(origin: string): void;\n\n deploy(): Promise<DeployReply | ConnectError>;\n execute(\n calls: Call | Call[],\n abis?: Abi[],\n transactionsDetail?: InvocationsDetails,\n sync?: boolean,\n feeSource?: any,\n error?: ControllerError,\n ): Promise<ExecuteReply | ConnectError>;\n signMessage(\n typedData: TypedData,\n account: string,\n async?: boolean,\n ): Promise<Signature | ConnectError>;\n openSettings(): Promise<void | ConnectError>;\n session(): Promise<Session>;\n sessions(): Promise<{\n [key: string]: Session;\n }>;\n delegateAccount(): string;\n username(): string;\n openPurchaseCredits(): void;\n openExecute(calls: Call[]): Promise<void>;\n switchChain(rpcUrl: string): Promise<void>;\n openStarterPack(starterpackId: string): void;\n\n // External wallet methods\n externalDetectWallets(): Promise<ExternalWallet[]>;\n externalConnectWallet(\n type: ExternalWalletType,\n address?: string,\n ): Promise<ExternalWalletResponse>;\n externalSignMessage(\n type: ExternalWalletType,\n message: string,\n ): Promise<ExternalWalletResponse>;\n externalSignTypedData(\n type: ExternalWalletType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any,\n ): Promise<ExternalWalletResponse>;\n externalGetBalance(\n type: ExternalWalletType,\n tokenAddress?: string,\n ): Promise<ExternalWalletResponse>;\n}\n\nexport interface Profile {\n navigate(path: string): void;\n switchChain(rpcUrl: string): Promise<void>;\n}\n\nexport interface Modal {\n open: () => void;\n close: () => void;\n}\n\n/**\n * Options for configuring the controller\n */\nexport type ControllerOptions = ProviderOptions &\n KeychainOptions &\n ProfileOptions;\n\nexport type IFrameOptions = {\n /** The ID of the starter pack to use */\n starterPackId?: string;\n /** The preset to use */\n preset?: string;\n};\n\nexport type Chain = {\n rpcUrl: string;\n};\n\nexport type ProviderOptions = {\n defaultChainId?: ChainId;\n chains?: Chain[];\n};\n\nexport type KeychainOptions = IFrameOptions & {\n policies?: SessionPolicies;\n /** The URL of keychain */\n url?: string;\n /** The origin of keychain */\n origin?: string;\n /** Propagate transaction errors back to caller instead of showing modal */\n propagateSessionErrors?: boolean;\n /** The fee source to use for execute from outside */\n feeSource?: FeeSource;\n /** Signup options (the order of the options is reflected in the UI. It's recommended to group socials and wallets together ) */\n signupOptions?: AuthOptions;\n /** When true, manually provided policies will override preset policies. Default is false. */\n shouldOverridePresetPolicies?: boolean;\n};\n\nexport type ProfileOptions = IFrameOptions & {\n /** The URL of profile. Mainly for internal development purpose */\n profileUrl?: string;\n /** The project name of Slot instance. */\n slot?: string;\n /** The namespace to use to fetch trophies data from indexer. Will be mandatory once profile page is in production */\n namespace?: string;\n /** The tokens to be listed on Inventory modal */\n tokens?: Tokens;\n};\n\nexport type ProfileContextTypeVariant =\n | \"inventory\"\n | \"trophies\"\n | \"achievements\"\n | \"leaderboard\"\n | \"activity\";\n\nexport type Token = \"eth\" | \"strk\" | \"lords\" | \"usdc\" | \"usdt\";\n\nexport type Tokens = {\n erc20?: Token[];\n};\n","import {\n addAddressPadding,\n Call,\n CallData,\n constants,\n getChecksumAddress,\n hash,\n shortString,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport { Policy } from \"@cartridge/controller-wasm/controller\";\nimport { Policies, SessionPolicies } from \"@cartridge/presets\";\nimport { ChainId } from \"@starknet-io/types-js\";\nimport { ParsedSessionPolicies } from \"./policies\";\n\n// Whitelist of allowed property names to prevent prototype pollution\nconst ALLOWED_PROPERTIES = new Set([\n \"contracts\",\n \"messages\",\n \"target\",\n \"method\",\n \"name\",\n \"description\",\n \"types\",\n \"domain\",\n \"primaryType\",\n]);\n\nfunction validatePropertyName(prop: string): void {\n if (!ALLOWED_PROPERTIES.has(prop)) {\n throw new Error(`Invalid property name: ${prop}`);\n }\n}\n\nfunction safeObjectAccess<T>(obj: any, prop: string): T {\n validatePropertyName(prop);\n return obj[prop];\n}\n\nexport function normalizeCalls(calls: Call | Call[]) {\n return toArray(calls).map((call) => {\n return {\n entrypoint: call.entrypoint,\n contractAddress: addAddressPadding(call.contractAddress),\n calldata: CallData.toHex(call.calldata),\n };\n });\n}\n\nexport function toSessionPolicies(policies: Policies): SessionPolicies {\n return Array.isArray(policies)\n ? policies.reduce<SessionPolicies>(\n (prev, p) => {\n if (safeObjectAccess<string>(p, \"target\")) {\n const target = getChecksumAddress(\n safeObjectAccess<string>(p, \"target\"),\n );\n const entrypoint = safeObjectAccess<string>(p, \"method\");\n const contracts = safeObjectAccess<Record<string, any>>(\n prev,\n \"contracts\",\n );\n const item = {\n name: humanizeString(entrypoint),\n entrypoint: entrypoint,\n description: safeObjectAccess<string>(p, \"description\"),\n };\n\n if (target in contracts) {\n const methods = toArray(contracts[target].methods);\n contracts[target] = {\n methods: [...methods, item],\n };\n } else {\n contracts[target] = {\n methods: [item],\n };\n }\n } else {\n const messages = safeObjectAccess<any[]>(prev, \"messages\");\n messages.push(p);\n }\n\n return prev;\n },\n { contracts: {}, messages: [] },\n )\n : policies;\n}\n\nexport function toWasmPolicies(policies: ParsedSessionPolicies): Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {}).flatMap(\n ([target, { methods }]) =>\n toArray(methods).map((m) => ({\n target,\n method: m.entrypoint,\n authorized: m.authorized,\n })),\n ),\n ...(policies.messages ?? []).map((p) => {\n const domainHash = typedData.getStructHash(\n p.types,\n \"StarknetDomain\",\n p.domain,\n TypedDataRevision.ACTIVE,\n );\n const typeHash = typedData.getTypeHash(\n p.types,\n p.primaryType,\n TypedDataRevision.ACTIVE,\n );\n\n return {\n scope_hash: hash.computePoseidonHash(domainHash, typeHash),\n authorized: p.authorized,\n };\n }),\n ];\n}\n\nexport function toArray<T>(val: T | T[]): T[] {\n return Array.isArray(val) ? val : [val];\n}\n\nexport function humanizeString(str: string): string {\n return (\n str\n // Convert from camelCase or snake_case\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase to spaces\n .replace(/_/g, \" \") // snake_case to spaces\n .toLowerCase()\n // Capitalize first letter\n .replace(/^\\w/, (c) => c.toUpperCase())\n );\n}\n\nexport function parseChainId(url: URL): ChainId {\n const parts = url.pathname.split(\"/\");\n\n // Handle localhost URLs by making a synchronous call to getChainId\n if (\n url.hostname === \"localhost\" ||\n url.hostname === \"127.0.0.1\" ||\n url.hostname === \"0.0.0.0\"\n ) {\n // Check if we're in a browser environment\n if (typeof XMLHttpRequest === \"undefined\") {\n // In Node.js environment (like tests), we can't make synchronous HTTP calls\n // For now, we'll use a placeholder chainId for localhost in tests\n console.warn(\n `Cannot make synchronous HTTP call in Node.js environment for ${url.toString()}`,\n );\n return shortString.encodeShortString(\"LOCALHOST\") as ChainId;\n }\n\n // Use a synchronous XMLHttpRequest to get the chain ID\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url.toString(), false); // false makes it synchronous\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\n const requestBody = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"starknet_chainId\",\n params: [],\n id: 1,\n });\n\n try {\n xhr.send(requestBody);\n\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n if (response.result) {\n return response.result as ChainId;\n }\n }\n\n throw new Error(\n `Failed to get chain ID from ${url.toString()}: ${xhr.status} ${xhr.statusText}`,\n );\n } catch (error) {\n throw new Error(`Failed to connect to ${url.toString()}: ${error}`);\n }\n }\n\n if (parts.includes(\"starknet\")) {\n if (parts.includes(\"mainnet\")) {\n return constants.StarknetChainId.SN_MAIN;\n } else if (parts.includes(\"sepolia\")) {\n return constants.StarknetChainId.SN_SEPOLIA;\n }\n } else if (parts.length >= 3) {\n const projectName = parts[2];\n if (parts.includes(\"katana\")) {\n return shortString.encodeShortString(\n `WP_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n } else if (parts.includes(\"mainnet\")) {\n return shortString.encodeShortString(\n `GG_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n }\n }\n\n throw new Error(`Chain ${url.toString()} not supported`);\n}\n","export class NotReadyToConnect extends Error {\n constructor() {\n super(\"Not ready to connect\");\n\n Object.setPrototypeOf(this, NotReadyToConnect.prototype);\n }\n}\n","export const KEYCHAIN_URL = \"https://x.cartridge.gg\";\nexport const PROFILE_URL = \"https://profile.cartridge.gg\";\nexport const API_URL = \"https://api.cartridge.gg\";\n","export const Permission = {\n ACCOUNTS: 'accounts',\n};\n//# sourceMappingURL=constants.js.map","export const icon =\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNTExMl83ODIpIj4KPHBhdGggZD0iTTQ2OS4yMzYgNzBDNDgyLjM5IDcwIDQ5My4wNTMgODAuNjYzIDQ5My4wNTMgOTMuODE2NFYxNDcuMTQ3TDUxNS4zMzggMTQ3LjE0N0w1MTUuNDI4IDE0Ny4xNDdMNTE1LjU1NCAxNDcuMTQ3TDUxNS44MjYgMTQ3LjE0OUM1MTYuMDE2IDE0Ny4xNTEgNTE2LjIyNSAxNDcuMTUzIDUxNi40NTEgMTQ3LjE1N0M1MTYuOTA0IDE0Ny4xNjQgNTE3LjQyOCAxNDcuMTc2IDUxOC4wMiAxNDcuMTk1QzUxOS4yMDEgMTQ3LjIzNCA1MjAuNjYgMTQ3LjMwNCA1MjIuMzYxIDE0Ny40MjRDNTI1Ljc0MSAxNDcuNjYzIDUzMC4xODUgMTQ4LjExNCA1MzUuMzYzIDE0OC45NjlDNTQ1LjAwMSAxNTAuNTYyIDU1OC41NTYgMTUzLjc4IDU3Mi45MTggMTYwLjYwM0w3MzAuNDIgMjI2LjY3MUw3MzIuMTAxIDIyNy41MDVDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3ODkuOTkzIDU4Ni4wNTQgNzg5Ljk5NCA1ODYuMjU0IDc4OS45OTQgNTg2LjQ2M0w3ODkuOTk2IDU4Ni45MTNDNzkwLjAzOCA1OTcuMDk2IDc5MC4xNjEgNjI2Ljk5NiA3NjQuMjMxIDY1Mi44MjNMNzE0Ljc2IDcwMi4wOTVMNzE0LjY0MSA3MDIuMjE1QzcwNC42MDEgNzEyLjI3NSA2OTIuMTIzIDcyMC42NTIgNjc2LjI4NCA3MjQuODc5QzY2NC4zOSA3MjguMDU0IDY1Mi44MjcgNzI3Ljk2NiA2NDguNjM3IDcyNy45MzRMNjQ4LjYxOSA3MjcuOTMzQzY0OC40MDkgNzI3LjkzMiA2NDguMjE5IDcyNy45MyA2NDguMDQ3IDcyNy45M0w2NDcuNzUyIDcyNy45MjlINDgwLjcyMUM0NzQuMDk0IDcyNy45MjkgNDY4LjcyMSA3MjIuNTU2IDQ2OC43MjEgNzE1LjkyOVY2NjguMzg4SDMyOC41ODZDMzI4LjU4NiA2NzIuNjI5IDMyOC41NzIgNjk4LjA1MiAzMjguNTYxIDcxNS45NDRDMzI4LjU1NyA3MjIuNTY5IDMyMy4xODYgNzI3LjkyOSAzMTYuNTYxIDcyNy45MjlIMTUyLjI0NkMxNTIuMTA0IDcyNy45MjkgMTUxLjk0MiA3MjcuOTI5IDE1MS43NjIgNzI3LjkzMUwxNTEuMzYyIDcyNy45MzRDMTQ3LjE3MiA3MjcuOTY2IDEzNS42MDkgNzI4LjA1NCAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUw4NS4yMzg2IDcwMi4wOTVMMzUuNjcgNjUyLjcyNUwzNS41NzIzIDY1Mi42MjdDOS44NjI0MiA2MjYuNzggOS45NjY3IDU5Ny4xODUgMTAuMDAzIDU4Ni44NzRDMTAuMDA0MyA1ODYuNTEzIDEwLjAwNTUgNTg2LjE3NyAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDY5LjU3OSAyMjYuNjcxTDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNTQuOTk4IDE1MC41NjIgMjY0LjYzNiAxNDguOTY5QzI2OS44MTQgMTQ4LjExNCAyNzQuMjU4IDE0Ny42NjMgMjc3LjYzOCAxNDcuNDI0QzI3OS4zMzggMTQ3LjMwNCAyODAuNzk4IDE0Ny4yMzQgMjgxLjk3OSAxNDcuMTk1QzI4Mi41NzEgMTQ3LjE3NiAyODMuMDk1IDE0Ny4xNjQgMjgzLjU0NyAxNDcuMTU3TDI4My45MTcgMTQ3LjE1MkwyODQuMTczIDE0Ny4xNDlMMjg0LjQ0NSAxNDcuMTQ3TDI4NC41NzEgMTQ3LjE0N0wyODQuNjYgMTQ3LjE0N0wzMDYuOTQyIDE0Ny4xNDdWOTMuODE2NEMzMDYuOTQyIDgwLjY2MyAzMTcuNjA1IDcwIDMzMC43NTggNzBINDY5LjIzNloiIGZpbGw9IiMxOTFBMUEiLz4KPHBhdGggZD0iTTM2Ni40ODMgMTI5LjU0SDQzMy41MTJWMjA2LjY4N0gzNjYuNDgzVjEyOS41NFoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMSA2MDIuNDI5SDE0NC4wMDhDMTM1Ljc2OCA2MDIuNDI5IDEzNS43NjggNTk0LjE0NiAxMzUuNzY4IDU5NC4xNDZWMjgwLjg1QzEzNS43NjggMjgwLjg1IDEzNS43NjggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M0wzNjYuNDgzIDIwNi42ODdIMjg0LjY5QzI4NC42OSAyMDYuNjg3IDI2OC4xMzQgMjA2LjY4NyAyNTEuNTc5IDIxNC44OTNMOTQuMzQxNCAyODAuODVDNzcuNzg2MSAyODkuMDU3IDY5LjU0NjkgMzA1LjYyMyA2OS41NDY5IDMyMi4wMzVWNTg1Ljg2M0M2OS41NDY5IDU5NC4xNDcgNjkuNTQ2OSA2MDIuMzUzIDc3Ljc4NjEgNjEwLjYzNkwxMjcuNDUyIDY2MC4xMDRDMTM1LjY5MSA2NjguMzg3IDE0MS45MjggNjY4LjM4NyAxNTIuMjQ3IDY2OC4zODdIMjY5LjAyOUMyNjkuMDM3IDY0OC4zNCAyNjkuMDQ2IDYyNC42NTUgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY1OC4wNzEgNjY4LjM4NyA2NjQuMzA4IDY2OC4zODcgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1OTQuMTQ3IDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MjIuMjEzIDI4OS4wNTcgNzA1LjY1OCAyODAuODVMNTQ4LjQyMSAyMTQuODkzQzUzMS44NjUgMjA2LjY4NyA1MTUuMzEgMjA2LjY4NyA1MTUuMzEgMjA2LjY4N0g0MzMuNTEyTDQzMy41MTIgMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNTk0LjE0NiA2NjQuMzA4IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wNzUgNTQzLjcwNyAyNjkuMDE3IDU5Ni45MTIgMjY5LjAxIDYwMi40MjlaIiBmaWxsPSIjRkJDQjRBIi8+CjxwYXRoIGQ9Ik0yNjkuMDA5IDQzNi4xNzJINTI4LjI2MlYzNzAuNjgxSDI2OS4wNzVDMjY5LjA3NSAzNzcuMzczIDI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzJaIiBmaWxsPSIjRkJDQjRBIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF81MTEyXzc4MiIgeD0iLTQiIHk9IjAiIHdpZHRoPSI4MDgiIGhlaWdodD0iODA4IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQgZHk9IjQiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K\";\n","function releaseStub() {}\n\n/**\n * A simple mutual exclusion lock. It allows you to obtain and release a lock,\n * ensuring that only one task can access a critical section at a time.\n */\nexport class Mutex {\n private m_lastPromise: Promise<void> = Promise.resolve();\n\n /**\n * Acquire lock\n * @param [bypass=false] option to skip lock acquisition\n */\n public async obtain(bypass = false): Promise<() => void> {\n let release = releaseStub;\n if (bypass) return release;\n const lastPromise = this.m_lastPromise;\n this.m_lastPromise = new Promise<void>((resolve) => (release = resolve));\n await lastPromise;\n return release;\n }\n}\n","import { WalletAccount } from \"starknet\";\nimport {\n AddInvokeTransactionParameters,\n AddStarknetChainParameters,\n Errors,\n Permission,\n RequestAccountsParameters,\n RequestFn,\n StarknetWindowObject,\n SwitchStarknetChainParameters,\n TypedData,\n WalletEventHandlers,\n WalletEventListener,\n WalletEvents,\n} from \"@starknet-io/types-js\";\nimport manifest from \"../package.json\";\n\nimport { icon } from \"./icon\";\nimport { Mutex } from \"./mutex\";\n\nconst mutex = new Mutex();\n\nexport default abstract class BaseProvider implements StarknetWindowObject {\n public id = \"controller\";\n public name = \"Controller\";\n public version = manifest.version;\n public icon = icon;\n\n public account?: WalletAccount;\n public subscriptions: WalletEvents[] = [];\n\n private _probePromise: Promise<WalletAccount | undefined> | null = null;\n\n protected async safeProbe(): Promise<WalletAccount | undefined> {\n // If we already have an account, return it\n if (this.account) {\n return this.account;\n }\n\n // If we're already probing, wait for the existing probe\n if (this._probePromise) {\n return this._probePromise;\n }\n\n const release = await mutex.obtain();\n return await new Promise<WalletAccount | undefined>(async (resolve) => {\n try {\n this._probePromise = this.probe();\n const result = await this._probePromise;\n resolve(result);\n } finally {\n this._probePromise = null;\n }\n }).finally(() => {\n release();\n });\n }\n\n request: RequestFn = async (call) => {\n switch (call.type) {\n case \"wallet_getPermissions\":\n await this.safeProbe();\n\n if (this.account) {\n return [Permission.ACCOUNTS];\n }\n\n return [];\n\n case \"wallet_requestAccounts\": {\n if (this.account) {\n return [this.account.address];\n }\n\n const silentMode =\n call.params && (call.params as RequestAccountsParameters).silent_mode;\n\n this.account = await this.safeProbe();\n\n if (!this.account && !silentMode) {\n this.account = await this.connect();\n }\n\n if (this.account) {\n return [this.account.address];\n }\n\n return [];\n }\n\n case \"wallet_watchAsset\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_watchAsset not implemented\",\n } as Errors.UNEXPECTED_ERROR;\n\n case \"wallet_addStarknetChain\": {\n let params = call.params as AddStarknetChainParameters;\n return this.addStarknetChain(params);\n }\n\n case \"wallet_switchStarknetChain\": {\n let params = call.params as SwitchStarknetChainParameters;\n return this.switchStarknetChain(params.chainId);\n }\n\n case \"wallet_requestChainId\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as Errors.UNEXPECTED_ERROR;\n }\n\n return await this.account.getChainId();\n\n case \"wallet_deploymentData\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_deploymentData not implemented\",\n } as Errors.UNEXPECTED_ERROR;\n\n case \"wallet_addInvokeTransaction\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as Errors.UNEXPECTED_ERROR;\n }\n\n let params = call.params as AddInvokeTransactionParameters;\n return await this.account.execute(\n params.calls.map((call) => ({\n contractAddress: call.contract_address,\n entrypoint: call.entry_point,\n calldata: call.calldata,\n })),\n );\n\n case \"wallet_addDeclareTransaction\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_addDeclareTransaction not implemented\",\n } as Errors.UNEXPECTED_ERROR;\n\n case \"wallet_signTypedData\": {\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as Errors.UNEXPECTED_ERROR;\n }\n\n return await this.account.signMessage(call.params as TypedData);\n }\n\n case \"wallet_supportedSpecs\":\n return [];\n case \"wallet_supportedWalletApi\":\n return [];\n default:\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: `Unknown RPC call type: ${call.type}`,\n } as Errors.UNEXPECTED_ERROR;\n }\n };\n\n on: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n this.subscriptions.push({ type: event, handler } as WalletEvents);\n };\n\n off: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n const idx = this.subscriptions.findIndex(\n (sub) => sub.type === event && sub.handler === handler,\n );\n if (idx >= 0) {\n this.subscriptions.splice(idx, 1);\n }\n };\n\n protected emitNetworkChanged(chainId: string) {\n this.subscriptions\n .filter((sub) => sub.type === \"networkChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"networkChanged\"])(chainId);\n });\n }\n\n protected emitAccountsChanged(accounts: string[]) {\n this.subscriptions\n .filter((sub) => sub.type === \"accountsChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"accountsChanged\"])(accounts);\n });\n }\n\n abstract probe(): Promise<WalletAccount | undefined>;\n abstract connect(): Promise<WalletAccount | undefined>;\n abstract switchStarknetChain(chainId: string): Promise<boolean>;\n abstract addStarknetChain(\n chain: AddStarknetChainParameters,\n ): Promise<boolean>;\n}\n"],"names":["ResponseCodes","FeeSource","ALLOWED_PROPERTIES","validatePropertyName","prop","safeObjectAccess","obj","normalizeCalls","calls","toArray","call","addAddressPadding","CallData","toSessionPolicies","policies","prev","p","target","getChecksumAddress","entrypoint","contracts","item","humanizeString","methods","toWasmPolicies","m","domainHash","typedData","TypedDataRevision","typeHash","hash","val","str","c","parseChainId","url","parts","shortString","xhr","requestBody","response","error","constants","projectName","NotReadyToConnect","KEYCHAIN_URL","PROFILE_URL","API_URL","Permission","icon","releaseStub","Mutex","bypass","release","lastPromise","resolve","mutex","BaseProvider","manifest","result","silentMode","params","event","handler","idx","sub","chainId","accounts"],"mappings":"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","x_google_ignoreList":[4]}
|
package/src/iframe/profile.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { PROFILE_URL } from "../constants";
|
|
2
|
-
import { Profile, ProfileOptions } from "../types";
|
|
3
|
-
import { IFrame, IFrameOptions } from "./base";
|
|
4
|
-
|
|
5
|
-
export type ProfileIFrameOptions = IFrameOptions<Profile> &
|
|
6
|
-
ProfileOptions & {
|
|
7
|
-
rpcUrl: string;
|
|
8
|
-
version?: string;
|
|
9
|
-
username: string;
|
|
10
|
-
slot?: string;
|
|
11
|
-
namespace?: string;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export class ProfileIFrame extends IFrame<Profile> {
|
|
15
|
-
constructor({
|
|
16
|
-
profileUrl,
|
|
17
|
-
rpcUrl,
|
|
18
|
-
version,
|
|
19
|
-
username,
|
|
20
|
-
slot,
|
|
21
|
-
namespace,
|
|
22
|
-
tokens,
|
|
23
|
-
...iframeOptions
|
|
24
|
-
}: ProfileIFrameOptions) {
|
|
25
|
-
const _profileUrl = (profileUrl || PROFILE_URL).replace(/\/$/, "");
|
|
26
|
-
let _url = new URL(
|
|
27
|
-
slot
|
|
28
|
-
? `${_profileUrl}/account/${username}/slot/${slot}`
|
|
29
|
-
: `${_profileUrl}/account/${username}`,
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
if (slot) {
|
|
33
|
-
_url.searchParams.set("ps", encodeURIComponent(slot));
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (namespace) {
|
|
37
|
-
_url.searchParams.set("ns", encodeURIComponent(namespace));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (version) {
|
|
41
|
-
_url.searchParams.set("v", encodeURIComponent(version));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
_url.searchParams.set("rpcUrl", encodeURIComponent(rpcUrl));
|
|
45
|
-
|
|
46
|
-
if (tokens?.erc20) {
|
|
47
|
-
_url.searchParams.set(
|
|
48
|
-
"erc20",
|
|
49
|
-
encodeURIComponent(tokens.erc20.toString()),
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
super({
|
|
54
|
-
...iframeOptions,
|
|
55
|
-
id: "controller-profile",
|
|
56
|
-
url: _url,
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
}
|