@gala-chain/launchpad-sdk 7.0.0-beta.5 → 7.0.0-beta.6
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/README.md +1 -1
- package/dist/LaunchpadSDK.d.ts +344 -1
- package/dist/LaunchpadSDK.d.ts.map +1 -1
- package/dist/api/dto/BondingCurveDTOs.d.ts +1 -1
- package/dist/bridge/BridgeService.d.ts.map +1 -1
- package/dist/bridge/constants/tokens.d.ts.map +1 -1
- package/dist/bridge/types/bridgeable-token.dto.d.ts +6 -2
- package/dist/bridge/types/bridgeable-token.dto.d.ts.map +1 -1
- package/dist/bridge/utils/tokenMetadataResolver.d.ts +2 -2
- package/dist/bridge/utils/tokenMetadataResolver.d.ts.map +1 -1
- package/dist/constants/version.generated.d.ts +1 -1
- package/dist/index.browser.d.ts +1 -2
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.esm.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/launchpad/strings-instructions.d.ts.map +1 -1
- package/dist/native.cjs +1 -1
- package/dist/native.esm.js +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.esm.js +1 -1
- package/dist/services/BridgeableTokenService.d.ts.map +1 -1
- package/dist/services/DexService.d.ts +8 -1
- package/dist/services/DexService.d.ts.map +1 -1
- package/dist/services/LaunchpadService.d.ts +7 -0
- package/dist/services/LaunchpadService.d.ts.map +1 -1
- package/dist/services/PoolService.d.ts +22 -0
- package/dist/services/PoolService.d.ts.map +1 -1
- package/dist/services/StreamWebSocketService.d.ts +10 -0
- package/dist/services/StreamWebSocketService.d.ts.map +1 -1
- package/dist/services/TokenClassKeyService.d.ts +0 -22
- package/dist/services/TokenClassKeyService.d.ts.map +1 -1
- package/dist/tokens/transfers.d.ts +6 -2
- package/dist/tokens/transfers.d.ts.map +1 -1
- package/dist/utils/data-transform-patterns.d.ts +1 -1
- package/dist/utils/data-transform-patterns.d.ts.map +1 -1
- package/dist/utils/delimiter-parser.d.ts +3 -2
- package/dist/utils/delimiter-parser.d.ts.map +1 -1
- package/dist/utils/token-format-converter.d.ts +15 -130
- package/dist/utils/token-format-converter.d.ts.map +1 -1
- package/dist/utils/token-instance-resolver.d.ts +5 -3
- package/dist/utils/token-instance-resolver.d.ts.map +1 -1
- package/dist/utils/token-parser.d.ts +2 -2
- package/dist/utils/token-parser.d.ts.map +1 -1
- package/dist/utils/tokenNormalizer.d.ts +2 -1
- package/dist/utils/tokenNormalizer.d.ts.map +1 -1
- package/dist/utils/validation.d.ts +0 -16
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/wallet/detection.d.ts.map +1 -1
- package/dist/wallet/index.d.ts +3 -4
- package/dist/wallet/index.d.ts.map +1 -1
- package/dist/wallet/types.d.ts +2 -2
- package/dist/wallet.cjs +1 -1
- package/dist/wallet.esm.js +1 -1
- package/package.json +160 -164
- package/LICENSE +0 -21
- package/dist/services/TokenMetadataService.d.ts +0 -509
- package/dist/services/TokenMetadataService.d.ts.map +0 -1
- package/dist/wallet/GalaChainConnectProvider.d.ts +0 -125
- package/dist/wallet/GalaChainConnectProvider.d.ts.map +0 -1
|
@@ -1,114 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Token delimiter conversion helpers (pipe <-> dollar) and sort-order conversion.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* ⚠️ CRITICAL ARCHITECTURAL NOTE:
|
|
9
|
-
* This utility is for FORMAT CONVERSION ONLY (pipe-delimited ↔ object/string).
|
|
10
|
-
* Do NOT use for symbol extraction or metadata inference!
|
|
11
|
-
*
|
|
12
|
-
* ⚠️ BREAKING CHANGE (v5.0.0):
|
|
13
|
-
* Bare token symbols (e.g., "GALA") are NO LONGER accepted.
|
|
14
|
-
* You MUST use full tokenId format: "GALA|Unit|none|none"
|
|
15
|
-
* For launchpad bonding curve tokens, use tokenName: "anime"
|
|
16
|
-
*
|
|
17
|
-
* For symbol/metadata resolution:
|
|
18
|
-
* - Use GalaChainService.fetchTokenClassFromChain() to query real blockchain data
|
|
19
|
-
* - Use DexService.fetchTokenDetails() for complete token metadata
|
|
20
|
-
* - Use data from GSwap SDK responses directly (already contains correct symbols)
|
|
21
|
-
*
|
|
22
|
-
* Launchpad SDK uses: { collection, category, type, additionalKey }
|
|
23
|
-
* GSwap SDK uses: "GALA|Unit|none|none" (pipe-delimited string)
|
|
4
|
+
* These convert FORMATS ONLY. A token class key carries no symbol and a symbol carries no class
|
|
5
|
+
* key, so nothing here infers one from the other: a bare symbol is never expanded into a key.
|
|
6
|
+
* For symbol/metadata use GalaChainService.fetchTokenClassFromChain() or DexService.fetchTokenDetails().
|
|
24
7
|
*
|
|
25
8
|
* @packageDocumentation
|
|
26
9
|
*/
|
|
27
|
-
import type { TokenClassKey } from '../types/common';
|
|
28
|
-
import type { TokenClassKey as TokenClass } from '../types/common';
|
|
29
|
-
export declare class TokenFormatConverter {
|
|
30
|
-
/**
|
|
31
|
-
* Convert Launchpad token format to GSwap format (pipe-delimited string)
|
|
32
|
-
*
|
|
33
|
-
* ⚠️ BREAKING CHANGE (v5.0.0):
|
|
34
|
-
* Bare token symbols (e.g., "GALA") are NO LONGER accepted.
|
|
35
|
-
* You MUST use full tokenId format: "GALA|Unit|none|none"
|
|
36
|
-
*
|
|
37
|
-
* Input examples:
|
|
38
|
-
* - "GALA|Unit|none|none" → "GALA|Unit|none|none" (valid)
|
|
39
|
-
* - "Token|Unit|BENE|client:xxx" → "Token|Unit|BENE|client:xxx" (valid)
|
|
40
|
-
* - { collection: "GALA", category: "Unit", type: "none", additionalKey: "none" } → "GALA|Unit|none|none" (valid)
|
|
41
|
-
* - "GALA" → throws ValidationError (INVALID - use pipe-delimited format)
|
|
42
|
-
* Output: "GALA|Unit|none|none"
|
|
43
|
-
*
|
|
44
|
-
* @throws ValidationError if bare symbol is provided without pipe-delimited format
|
|
45
|
-
*/
|
|
46
|
-
toLaunchpadFormat(token: unknown): string;
|
|
47
|
-
/**
|
|
48
|
-
* Convert GSwap format (pipe-delimited) to TokenClass object
|
|
49
|
-
*
|
|
50
|
-
* ⚠️ WARNING: For API format conversion ONLY
|
|
51
|
-
* This does NOT provide real symbol/metadata - it's structural only.
|
|
52
|
-
* USE parseToken() utility instead for proper token format handling (src/utils/token-parser.ts)
|
|
53
|
-
* For actual token data, use GalaChainService.fetchTokenClassFromChain()
|
|
54
|
-
*
|
|
55
|
-
* Input examples:
|
|
56
|
-
* - "GALA|Unit|none|none" → { collection: "GALA", category: "Unit", type: "none", additionalKey: "none" }
|
|
57
|
-
* - { type: "GALA", ... } → proper TokenClassKey
|
|
58
|
-
* Output: TokenClassKey with collection, category, type, additionalKey
|
|
59
|
-
*/
|
|
60
|
-
toTokenClass(token: unknown): TokenClass;
|
|
61
|
-
/**
|
|
62
|
-
* INTERNAL USE ONLY: Normalize API response data that may contain bare symbols.
|
|
63
|
-
*
|
|
64
|
-
* This is specifically for normalizing data from GSwap API responses where
|
|
65
|
-
* tokens may come back as bare symbols or pipe-delimited format.
|
|
66
|
-
*
|
|
67
|
-
* ⚠️ DO NOT use this for user-facing input validation!
|
|
68
|
-
* For user input, use toLaunchpadFormat() which enforces proper format.
|
|
69
|
-
*
|
|
70
|
-
* Input: "GALA" → "GALA|Unit|none|none"
|
|
71
|
-
* Input: "GALA|Unit|none|none" → "GALA|Unit|none|none" (unchanged)
|
|
72
|
-
*/
|
|
73
|
-
normalizeInternalApiResponse(token: string): string;
|
|
74
|
-
/**
|
|
75
|
-
* Normalize any token format to pipe-delimited GSwap format
|
|
76
|
-
*
|
|
77
|
-
* ⚠️ BREAKING CHANGE (v5.0.0):
|
|
78
|
-
* Bare token symbols (e.g., "GALA") are NO LONGER accepted.
|
|
79
|
-
* You MUST use full tokenId format: "GALA|Unit|none|none"
|
|
80
|
-
*
|
|
81
|
-
* Input: "GALA|Unit|none|none" or { collection: "GALA", category: "Unit", type: "none", additionalKey: "none" }
|
|
82
|
-
* Output: "GALA|Unit|none|none"
|
|
83
|
-
*
|
|
84
|
-
* @throws ValidationError if bare symbol is provided without pipe-delimited format
|
|
85
|
-
*/
|
|
86
|
-
normalize(token: string | TokenClass): string;
|
|
87
|
-
}
|
|
88
10
|
/**
|
|
89
11
|
* Convert pipe-delimited token ID to dollar-delimited format for API
|
|
90
12
|
*
|
|
13
|
+
* Only the delimiter changes; the fields are left untouched.
|
|
14
|
+
*
|
|
91
15
|
* @param pipeToken Pipe-delimited format: "GUSDC|Unit|none|eth:0x..."
|
|
92
|
-
* @returns Dollar-delimited format: "
|
|
16
|
+
* @returns Dollar-delimited format: "GUSDC$Unit$none$eth:0x..."
|
|
93
17
|
* @throws Error if token is null or empty
|
|
94
18
|
*
|
|
95
19
|
* @example
|
|
96
20
|
* ```typescript
|
|
97
21
|
* pipeFormatToDollarFormat("GUSDC|Unit|none|eth:0x123")
|
|
98
|
-
* // Returns: "
|
|
22
|
+
* // Returns: "GUSDC$Unit$none$eth:0x123"
|
|
99
23
|
* ```
|
|
100
24
|
*/
|
|
101
25
|
export declare function pipeFormatToDollarFormat(pipeToken: string): string;
|
|
102
26
|
/**
|
|
103
27
|
* Convert dollar-delimited API response to pipe-delimited format
|
|
104
28
|
*
|
|
105
|
-
*
|
|
29
|
+
* The `$` form is parsed from the RIGHT (category, type, additionalKey are the last three
|
|
30
|
+
* segments), because real collections contain `$` themselves: `$GMUSIC$Unit$none$none` becomes
|
|
31
|
+
* `$GMUSIC|Unit|none|none`, never `|GMUSIC|Unit|none|none`.
|
|
32
|
+
*
|
|
33
|
+
* @param dollarToken Dollar-delimited format: "GUSDC$Unit$none$eth:0x..."
|
|
106
34
|
* @returns Pipe-delimited format: "GUSDC|Unit|none|eth:0x..."
|
|
107
|
-
* @throws
|
|
35
|
+
* @throws ValidationError if the token is not a valid class key
|
|
108
36
|
*
|
|
109
37
|
* @example
|
|
110
38
|
* ```typescript
|
|
111
|
-
* dollarFormatToPipeFormat("
|
|
39
|
+
* dollarFormatToPipeFormat("GUSDC$Unit$none$eth:0x123")
|
|
112
40
|
* // Returns: "GUSDC|Unit|none|eth:0x123"
|
|
113
41
|
* ```
|
|
114
42
|
*/
|
|
@@ -129,47 +57,4 @@ export declare function dollarFormatToPipeFormat(dollarToken: string): string;
|
|
|
129
57
|
* ```
|
|
130
58
|
*/
|
|
131
59
|
export declare function convertSortOrderToApi(sortOrder?: 'ASC' | 'DESC'): 'asc' | 'desc' | undefined;
|
|
132
|
-
/**
|
|
133
|
-
* Parse dollar-delimited token string into TokenClassKey components (LEFT-TO-RIGHT)
|
|
134
|
-
*
|
|
135
|
-
* Dollar-delimited format: "Token$Unit$SYMBOL$additionalKey"
|
|
136
|
-
* Handles additionalKey that may contain $ characters by treating everything after the third $
|
|
137
|
-
* as part of additionalKey and rejoining with $.
|
|
138
|
-
*
|
|
139
|
-
* **WARNING:** This function parses LEFT-TO-RIGHT which does NOT handle the edge case
|
|
140
|
-
* where the collection name contains $ (e.g., "$MUSIC$Unit$none$none").
|
|
141
|
-
* For tokens that may have $ in the collection, use `parseDollarDelimitedTokenSafe`
|
|
142
|
-
* from `./token-parser.ts` which parses RIGHT-TO-LEFT.
|
|
143
|
-
*
|
|
144
|
-
* ## When to use which function:
|
|
145
|
-
*
|
|
146
|
-
* - **parseDollarDelimitedToken** (this function): When you're certain the collection
|
|
147
|
-
* does NOT contain $ characters. Slightly simpler, parses left-to-right.
|
|
148
|
-
*
|
|
149
|
-
* - **parseDollarDelimitedTokenSafe** (from token-parser.ts): When you need to handle
|
|
150
|
-
* the "$MUSIC" edge case where collection name starts with $. Parses right-to-left.
|
|
151
|
-
*
|
|
152
|
-
* @param dollarToken Dollar-delimited token string to parse
|
|
153
|
-
* @returns TokenClassKey object with collection, category, type, additionalKey
|
|
154
|
-
* @throws ValidationError if the token format is invalid
|
|
155
|
-
*
|
|
156
|
-
* @example
|
|
157
|
-
* ```typescript
|
|
158
|
-
* const tokenClass = parseDollarDelimitedToken('GUSDC$Unit$none$eth:0x...');
|
|
159
|
-
* // → { collection: "GUSDC", category: "Unit", type: "none", additionalKey: "eth:0x..." }
|
|
160
|
-
*
|
|
161
|
-
* // Handles additionalKey with $ characters
|
|
162
|
-
* const complex = parseDollarDelimitedToken('SYMBOL$Unit$none$eth:0x$1234$5678');
|
|
163
|
-
* // → { collection: "SYMBOL", category: "Unit", type: "none", additionalKey: "eth:0x$1234$5678" }
|
|
164
|
-
*
|
|
165
|
-
* // WARNING: Does NOT handle $ in collection correctly!
|
|
166
|
-
* // parseDollarDelimitedToken('$MUSIC$Unit$none$none')
|
|
167
|
-
* // → { collection: "", category: "MUSIC", type: "Unit", additionalKey: "none$none" } // WRONG!
|
|
168
|
-
* // Use parseDollarDelimitedTokenSafe for this case.
|
|
169
|
-
* ```
|
|
170
|
-
*
|
|
171
|
-
* @see parseDollarDelimitedTokenSafe - Handles $ in collection name (RIGHT-TO-LEFT parsing)
|
|
172
|
-
* @since 3.32.0
|
|
173
|
-
*/
|
|
174
|
-
export declare function parseDollarDelimitedToken(dollarToken: string): TokenClassKey;
|
|
175
60
|
//# sourceMappingURL=token-format-converter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-format-converter.d.ts","sourceRoot":"","sources":["../../src/utils/token-format-converter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"token-format-converter.d.ts","sourceRoot":"","sources":["../../src/utils/token-format-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMlE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAM5F"}
|
|
@@ -10,18 +10,20 @@ interface TokenResolver {
|
|
|
10
10
|
resolveTokenToVault(tokenName: string): Promise<string | null>;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* Resolve a token name
|
|
13
|
+
* Resolve a launchpad token name to its token instance via its vault address. Throws when the
|
|
14
|
+
* name has no launchpad pool: a class key is never guessed from a name.
|
|
14
15
|
*
|
|
15
16
|
* @param tokenName - Token name to resolve.
|
|
16
17
|
* @param resolver - Token resolver service.
|
|
17
18
|
* @param logger - Logger receiving resolution diagnostics.
|
|
18
19
|
* @param launchpadLog - Optional launchpad resolution log label.
|
|
19
20
|
* @returns Parsed token instance key.
|
|
21
|
+
* @throws ValidationError if the name has no launchpad vault.
|
|
20
22
|
*
|
|
21
23
|
* @example
|
|
22
24
|
* ```typescript
|
|
23
|
-
* const key = await resolveTokenInstanceFromName('
|
|
24
|
-
* console.log(key.collection); // "
|
|
25
|
+
* const key = await resolveTokenInstanceFromName('anime', resolver, logger);
|
|
26
|
+
* console.log(key.collection); // "Token"
|
|
25
27
|
* ```
|
|
26
28
|
*/
|
|
27
29
|
export declare function resolveTokenInstanceFromName(tokenName: string, resolver: TokenResolver, logger: Logger, launchpadLog?: string): Promise<TokenInstanceShape>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-instance-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/token-instance-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIvC,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,aAAa;IACrB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAChE;AAED
|
|
1
|
+
{"version":3,"file":"token-instance-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/token-instance-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIvC,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,aAAa;IACrB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAChE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,YAAY,SAAyC,GACpD,OAAO,CAAC,kBAAkB,CAAC,CA0B7B"}
|
|
@@ -32,7 +32,7 @@ import type { TokenClassKey } from '../types/common';
|
|
|
32
32
|
* if (isPipeDelimited(token)) {
|
|
33
33
|
* return parsePipeDelimitedToken(token); // Fastest path
|
|
34
34
|
* } else if (isDollarDelimited(token)) {
|
|
35
|
-
* return
|
|
35
|
+
* return parseDollarDelimitedToken(token); // Fast path
|
|
36
36
|
* }
|
|
37
37
|
* ```
|
|
38
38
|
*/
|
|
@@ -143,7 +143,7 @@ export declare function parsePipeDelimitedToken(token: string): TokenClassKey;
|
|
|
143
143
|
* @internal Used by parseToken()
|
|
144
144
|
* @throws ValidationError if format is invalid
|
|
145
145
|
*/
|
|
146
|
-
export declare function
|
|
146
|
+
export declare function parseDollarDelimitedToken(token: string): TokenClassKey;
|
|
147
147
|
/**
|
|
148
148
|
* Check if token string is in pipe-delimited format
|
|
149
149
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-parser.d.ts","sourceRoot":"","sources":["../../src/utils/token-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,IAAI,GAC/C,aAAa,CAyCf;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAGpE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,
|
|
1
|
+
{"version":3,"file":"token-parser.d.ts","sourceRoot":"","sources":["../../src/utils/token-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,IAAI,GAC/C,aAAa,CAyCf;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAGpE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAGtE;AAGD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAe1D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE1D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAqBtE"}
|
|
@@ -117,7 +117,8 @@ export declare function parseVaultAddressToTokenClassKey(vaultAddress: string):
|
|
|
117
117
|
*/
|
|
118
118
|
export declare function parseVaultAddressToTokenInstance(vaultAddress: string): TokenInstanceKey;
|
|
119
119
|
/**
|
|
120
|
-
* Extracts the token symbol
|
|
120
|
+
* Extracts the launchpad token symbol (carried in `type` of the shared `Token` collection) from a
|
|
121
|
+
* launchpad vault address. Throws for any other collection: a symbol cannot be derived from a class key.
|
|
121
122
|
*
|
|
122
123
|
* Vault address format: "service|Token$Unit$SYMBOL$eth:address$launchpad"
|
|
123
124
|
* The symbol is the 3rd component (index 2) after splitting the token part by $.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenNormalizer.d.ts","sourceRoot":"","sources":["../../src/utils/tokenNormalizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIhF,OAAO,EAEL,eAAe,IAAI,qBAAqB,EAEzC,MAAM,gBAAgB,CAAC;AAGxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAsE9E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,gBAAgB,CAOhF;AAED;;;;;;;;GAQG;AACH,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAEjC;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,MAAM,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CActD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gCAAgC,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAGpF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gCAAgC,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAMvF;AAED
|
|
1
|
+
{"version":3,"file":"tokenNormalizer.d.ts","sourceRoot":"","sources":["../../src/utils/tokenNormalizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIhF,OAAO,EAEL,eAAe,IAAI,qBAAqB,EAEzC,MAAM,gBAAgB,CAAC;AAGxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAsE9E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,gBAAgB,CAOhF;AAED;;;;;;;;GAQG;AACH,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAEjC;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,MAAM,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CActD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gCAAgC,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAGpF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gCAAgC,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAMvF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAYxE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAMjE"}
|
|
@@ -105,22 +105,6 @@ export declare function isValidAddressFormat(address: string): address is Addres
|
|
|
105
105
|
* ```
|
|
106
106
|
*/
|
|
107
107
|
export declare function validateNumericString(value: string, fieldName: string, allowZero?: boolean): void;
|
|
108
|
-
/**
|
|
109
|
-
* Generates a vault address for token operations
|
|
110
|
-
*
|
|
111
|
-
* Format: service|Token$Unit$[SYMBOL]$eth:[CREATOR_ADDRESS]$launchpad
|
|
112
|
-
*
|
|
113
|
-
* @param tokenSymbol Token symbol (e.g., "BOBA", "CMPASY")
|
|
114
|
-
* @param creatorAddress Creator's wallet address (without 0x prefix)
|
|
115
|
-
* @returns Vault address string for token operations
|
|
116
|
-
*
|
|
117
|
-
* @example
|
|
118
|
-
* ```typescript
|
|
119
|
-
* const vaultAddress = generateTokenVaultAddress("BOBA", "9401b171307be656f00f9e18df756643fd3a91de");
|
|
120
|
-
* // Returns: "service|Token$Unit$BOBA$eth:9401b171307be656f00f9e18df756643fd3a91de$launchpad"
|
|
121
|
-
* ```
|
|
122
|
-
*/
|
|
123
|
-
export declare function generateTokenVaultAddress(tokenSymbol: string, creatorAddress: string): string;
|
|
124
108
|
/**
|
|
125
109
|
* Extracts token symbol and creator address from a vault address
|
|
126
110
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,SAAS,EACV,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,SAAS,EACV,MAAM,2BAA2B,CAAC;AAiBnC;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAKzD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAKlE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAkB,GAC5B,IAAI,CAKN;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAKxD;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAKxE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAKxE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAKtE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAW1D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAK3D;AAGD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG/D;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,GACd,OAAO,IAAI,aAAa,CAO1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,OAAc,GACxB,IAAI,CAGN;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,GACnB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoBxD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detection.d.ts","sourceRoot":"","sources":["../../src/wallet/detection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,cAAc,EAGd,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;CAcpB,CAAC;
|
|
1
|
+
{"version":3,"file":"detection.d.ts","sourceRoot":"","sources":["../../src/wallet/detection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,cAAc,EAGd,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;CAcpB,CAAC;AAiEX;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,MAAY,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAsHzF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,GAChD,MAAM,IAAI,CAyDZ;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAGpG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGxF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
|
package/dist/wallet/index.d.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides a unified interface for working with different wallet types:
|
|
5
5
|
* - Private key wallets (ethers.js)
|
|
6
|
-
* - Browser extension wallets (MetaMask, Coinbase, etc.)
|
|
7
|
-
* -
|
|
6
|
+
* - Browser extension wallets (MetaMask, Coinbase, Trust, etc.)
|
|
7
|
+
* - Gala Wallet (window.gala)
|
|
8
8
|
*
|
|
9
9
|
* @example
|
|
10
10
|
* ```typescript
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
* // Use with SDK
|
|
36
36
|
* const sdk = new LaunchpadSDK({
|
|
37
37
|
* walletProvider: provider,
|
|
38
|
-
*
|
|
38
|
+
* env: 'prod'
|
|
39
39
|
* });
|
|
40
40
|
* ```
|
|
41
41
|
*
|
|
@@ -44,7 +44,6 @@
|
|
|
44
44
|
export type { DetectedWallet, Eip1193Provider, Eip6963AnnounceProviderEvent, Eip6963ProviderDetail, Eip6963ProviderInfo, TypedDataDomain, TypedDataField, WalletConnectionState, WalletDetectionResult, WalletProvider, WalletProviderConfig, WalletProviderType, } from './types';
|
|
45
45
|
export { WalletProviderError, WalletProviderErrorCode, } from './types';
|
|
46
46
|
export { ExternalWalletProvider } from './ExternalWalletProvider';
|
|
47
|
-
export { type GalaChainConnectClient, GalaChainConnectProvider, } from './GalaChainConnectProvider';
|
|
48
47
|
export { GalaWalletProvider } from './GalaWalletProvider';
|
|
49
48
|
export { PrivateKeyProvider } from './PrivateKeyProvider';
|
|
50
49
|
export { detectWallets, getWalletByRdns, hasAnyWallet, isWalletAvailable, KNOWN_WALLET_RDNS, subscribeToWalletChanges, } from './detection';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wallet/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAGH,YAAY,EACV,cAAc,EACd,eAAe,EACf,4BAA4B,EAC5B,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wallet/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAGH,YAAY,EACV,cAAc,EACd,eAAe,EACf,4BAA4B,EAC5B,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EACL,aAAa,EACb,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC1B,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
|
package/dist/wallet/types.d.ts
CHANGED
|
@@ -32,8 +32,8 @@ export type WalletProviderType = 'privateKey' | 'external';
|
|
|
32
32
|
*
|
|
33
33
|
* This interface abstracts wallet operations to support multiple wallet backends:
|
|
34
34
|
* - Private key wallets (ethers.js Wallet)
|
|
35
|
-
* - Browser extension wallets (MetaMask, Coinbase, etc. via EIP-1193)
|
|
36
|
-
* -
|
|
35
|
+
* - Browser extension wallets (MetaMask, Coinbase, Trust, etc. via EIP-1193)
|
|
36
|
+
* - Gala Wallet (window.gala)
|
|
37
37
|
*
|
|
38
38
|
* @example
|
|
39
39
|
* ```typescript
|
package/dist/wallet.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e,r=require("ethers");class t extends Error{constructor(e,r,t){super(e),this.code=r,this.originalError=t,this.name="WalletProviderError"}}function n(e,r,t){return{types:{EIP712Domain:s(e),...r},primaryType:Object.keys(r)[0],domain:o(e),message:t}}function s(e){const r=[];return void 0!==e.name&&r.push({name:"name",type:"string"}),void 0!==e.version&&r.push({name:"version",type:"string"}),void 0!==e.chainId&&r.push({name:"chainId",type:"uint256"}),void 0!==e.verifyingContract&&r.push({name:"verifyingContract",type:"address"}),void 0!==e.salt&&r.push({name:"salt",type:"bytes32"}),r}function o(e){const r={};return void 0!==e.name&&(r.name=e.name),void 0!==e.version&&(r.version=e.version),void 0!==e.chainId&&(r.chainId="bigint"==typeof e.chainId||"number"==typeof e.chainId?`0x${e.chainId.toString(16)}`:e.chainId),void 0!==e.verifyingContract&&(r.verifyingContract=e.verifyingContract),void 0!==e.salt&&(r.salt=e.salt),r}function i(e){return`0x${Buffer.from(e,"utf8").toString("hex")}`}async function a(e,r,t){return e.request({method:"personal_sign",params:[i(t),r]})}async function d(e,r,t,s,o){return e.request({method:"eth_signTypedData_v4",params:[r,JSON.stringify(n(t,s,o))]})}exports.WalletProviderErrorCode=void 0,(e=exports.WalletProviderErrorCode||(exports.WalletProviderErrorCode={})).USER_REJECTED="USER_REJECTED",e.NOT_CONNECTED="NOT_CONNECTED",e.CONNECTION_FAILED="CONNECTION_FAILED",e.SIGNING_FAILED="SIGNING_FAILED",e.PROVIDER_NOT_AVAILABLE="PROVIDER_NOT_AVAILABLE",e.PRIVATE_KEY_NOT_ACCESSIBLE="PRIVATE_KEY_NOT_ACCESSIBLE",e.INVALID_CONFIG="INVALID_CONFIG",e.CHAIN_MISMATCH="CHAIN_MISMATCH",e.UNKNOWN="UNKNOWN";class c{constructor(e){this.connectedAddress=null,this.provider=e,this.eventHandlers=function(e,t,n){if(null==e||"function"!=typeof e.on)return{accountsChanged:null,disconnect:null};const s=e=>{const n=e[0];t(void 0===n?null:r.getAddress(n))},o=()=>n();return e.on("accountsChanged",s),e.on("disconnect",o),{accountsChanged:s,disconnect:o}}(e,e=>{this.connectedAddress=e},()=>{this.connectedAddress=null})}removeEventListeners(){!function(e,r){if("function"!=typeof e.removeListener)return;null!==r.accountsChanged&&e.removeListener("accountsChanged",r.accountsChanged);null!==r.disconnect&&e.removeListener("disconnect",r.disconnect)}(this.provider,this.eventHandlers)}}async function l(e,r,n){try{return await e()}catch(e){if(e instanceof t)throw e;return r(e,n)}}const u=4001,h=4100,v=4900,A=4901;class p extends c{constructor(e){if(super(e),this.providerType="external",null==e)throw new t("EIP-1193 provider is required",exports.WalletProviderErrorCode.INVALID_CONFIG)}handleProviderError(e,r){const n=e;if(n.code===u)throw new t(`User rejected ${r}`,exports.WalletProviderErrorCode.USER_REJECTED,e instanceof Error?e:void 0);if(n.code===h)throw new t("Wallet is not authorized",exports.WalletProviderErrorCode.NOT_CONNECTED,e instanceof Error?e:void 0);if(n.code===v||n.code===A)throw this.connectedAddress=null,new t("Wallet disconnected",exports.WalletProviderErrorCode.NOT_CONNECTED,e instanceof Error?e:void 0);throw new t(n.message??`${r} failed`,r.includes("sign")?exports.WalletProviderErrorCode.SIGNING_FAILED:exports.WalletProviderErrorCode.UNKNOWN,e instanceof Error?e:void 0)}ensureConnected(){if(!this.connectedAddress)throw new t("Wallet is not connected. Call connect() first.",exports.WalletProviderErrorCode.NOT_CONNECTED)}async connect(){try{const e=await this.provider.request({method:"eth_requestAccounts"});if(null==e||0===e.length)throw new t("No accounts returned from wallet",exports.WalletProviderErrorCode.CONNECTION_FAILED);const n=e[0];if(void 0===n)throw new t("No accounts returned from wallet",exports.WalletProviderErrorCode.CONNECTION_FAILED);return this.connectedAddress=r.getAddress(n),this.connectedAddress}catch(e){if(e instanceof t)throw e;return this.handleProviderError(e,"connect")}}async disconnect(){this.connectedAddress=null,this.removeEventListeners();try{await this.provider.request({method:"wallet_revokePermissions",params:[{eth_accounts:{}}]})}catch{}}isConnected(){return null!==this.connectedAddress}async signMessage(e){return this.ensureConnected(),l(()=>a(this.provider,this.connectedAddress,e),(e,r)=>this.handleProviderError(e,r),"sign message")}async signTypedData(e,r,t){return this.ensureConnected(),l(()=>d(this.provider,this.connectedAddress,e,r,t),(e,r)=>this.handleProviderError(e,r),"sign typed data")}async getAddress(){await Promise.resolve(),this.ensureConnected();const e=this.connectedAddress;if(null==e)throw new t("Wallet is not connected",exports.WalletProviderErrorCode.NOT_CONNECTED);return e}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}async getPrivateKey(){return Promise.reject(new t("Private key is not accessible with external wallet providers. Use PrivateKeyProvider if you need private key access for @gala-chain operations.",exports.WalletProviderErrorCode.PRIVATE_KEY_NOT_ACCESSIBLE))}getProvider(){return this.provider}}let E=null;async function w(){if(!1===E)return null;try{const e=["@gala-chain","connect"].join("/"),r=await import(e);return E=!0,r}catch{return E=!1,null}}class g{constructor(e){if(this.providerType="external",this.connectedAddress=null,!e)throw new t("@gala-chain/connect client is required",exports.WalletProviderErrorCode.INVALID_CONFIG);if("function"!=typeof e.signMessage)throw new t("Invalid @gala-chain/connect client: signMessage method is required",exports.WalletProviderErrorCode.INVALID_CONFIG);this.client=e}static async createBrowserClient(e){const r=await w();if(null==r)throw new t("Failed to create BrowserConnectClient: @gala-chain/connect is not installed. Install it with: npm install @gala-chain/connect",exports.WalletProviderErrorCode.PROVIDER_NOT_AVAILABLE);const{BrowserConnectClient:n}=r,s=n,o=e?new s(e):new s;return new g(o)}static async createTrustWalletClient(){const e=await w();if(null==e)throw new t("Failed to create TrustWalletConnectClient: @gala-chain/connect is not installed. Install it with: npm install @gala-chain/connect",exports.WalletProviderErrorCode.PROVIDER_NOT_AVAILABLE);const{TrustWalletConnectClient:r}=e,n=new r;return new g(n)}static async isAvailable(){return null!==await w()}ensureConnected(){if(null===this.connectedAddress||void 0===this.connectedAddress)throw new t("Wallet is not connected. Call connect() first.",exports.WalletProviderErrorCode.NOT_CONNECTED);return this.connectedAddress}async connect(){try{if("function"==typeof this.client.connect){const e=await this.client.connect();if(null!=e&&e.length>0)return this.connectedAddress=r.getAddress(e),this.connectedAddress}if("function"==typeof this.client.getAccount){const e=await this.client.getAccount();if(null!=e&&e.length>0)return this.connectedAddress=r.getAddress(e),this.connectedAddress}throw new t("Failed to connect: no account returned",exports.WalletProviderErrorCode.CONNECTION_FAILED)}catch(e){if(e instanceof t)throw e;const r=e instanceof Error?e.message:String(e);if(r.length>0&&(r.includes("rejected")||r.includes("denied")))throw new t("User rejected connection",exports.WalletProviderErrorCode.USER_REJECTED,e instanceof Error?e:void 0);throw new t("Failed to connect to wallet",exports.WalletProviderErrorCode.CONNECTION_FAILED,e instanceof Error?e:void 0)}}async disconnect(){"function"==typeof this.client.disconnect&&await this.client.disconnect(),this.connectedAddress=null}isConnected(){return null!==this.connectedAddress}async signMessage(e){this.ensureConnected();try{return await this.client.signMessage(e)}catch(e){const r=e instanceof Error?e.message:String(e);if(r.includes("rejected")||r.includes("denied"))throw new t("User rejected signing",exports.WalletProviderErrorCode.USER_REJECTED,e instanceof Error?e:void 0);throw new t("Failed to sign message",exports.WalletProviderErrorCode.SIGNING_FAILED,e instanceof Error?e:void 0)}}signTypedData(e,r,n){return Promise.reject(new t("signTypedData is not supported by GalaChainConnectProvider. Use ExternalWalletProvider with the underlying EIP-1193 provider instead.",exports.WalletProviderErrorCode.SIGNING_FAILED))}async getAddress(){return await Promise.resolve(),this.ensureConnected()}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}getPrivateKey(){return Promise.reject(new t("Private key is not accessible with @gala-chain/connect. Use PrivateKeyProvider if you need private key access.",exports.WalletProviderErrorCode.PRIVATE_KEY_NOT_ACCESSIBLE))}getClient(){return this.client}}class C{constructor(e){this.providerType="privateKey",this.connected=!0;try{this.wallet=new r.Wallet(e)}catch(e){throw new t("Invalid private key provided",exports.WalletProviderErrorCode.INVALID_CONFIG,e instanceof Error?e:void 0)}}static fromWallet(e){return new C(e.privateKey)}async signMessage(e){try{return await this.wallet.signMessage(e)}catch(e){throw new t("Failed to sign message",exports.WalletProviderErrorCode.SIGNING_FAILED,e instanceof Error?e:void 0)}}async signTypedData(e,r,n){try{return await this.wallet.signTypedData(e,r,n)}catch(e){throw new t("Failed to sign typed data",exports.WalletProviderErrorCode.SIGNING_FAILED,e instanceof Error?e:void 0)}}getAddress(){return Promise.resolve(r.getAddress(this.wallet.address))}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}async connect(){return this.connected=!0,this.getAddress()}disconnect(){return this.connected=!1,Promise.resolve()}isConnected(){return this.connected}getPrivateKey(){return Promise.resolve(this.wallet.privateKey)}getWallet(){return this.wallet}}const f={METAMASK:"io.metamask",METAMASK_FLASK:"io.metamask.flask",COINBASE:"com.coinbase.wallet",TRUST_WALLET:"com.trustwallet.app",PHANTOM:"app.phantom",RAINBOW:"me.rainbow",OKX:"com.okex.wallet",RABBY:"io.rabby",BRAVE:"com.brave.wallet",FRAME:"sh.frame",LEDGER:"com.ledger",ZERION:"io.zerion.wallet",GALA:"com.gala.wallet"},y={[f.METAMASK]:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIxLjU0IDQuMjJsLTguMzQgNi4yMSAxLjU0LTMuNjUtLTUuNTMtMi41MXoiIGZpbGw9IiNFMjc2MUIiLz48L3N2Zz4=",[f.GALA]:"data:image/png;base64,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"};function I(){return"undefined"!=typeof window&&"function"==typeof window.dispatchEvent}function N(){if(!I())return null;return window.ethereum??null}async function P(e=500){const r=[],t=new Map;return I()?new Promise(n=>{const s=new Set,o=e=>{const n=e,{info:o,provider:i}=n.detail;if(s.has(o.uuid))return;s.add(o.uuid);const a={id:o.rdns||o.uuid,name:o.name,rdns:o.rdns||o.uuid,icon:o.icon??y[o.rdns||""]??"",provider:i,isInjected:!1};r.push(a),t.set(a.id,a)};window.addEventListener("eip6963:announceProvider",o),window.dispatchEvent(new Event("eip6963:requestProvider")),setTimeout(()=>{if(window.removeEventListener("eip6963:announceProvider",o),0===r.length){const e=N();if(e){const n=window;let s="Browser Wallet",o="injected";n.ethereum?.isMetaMask?(s="MetaMask",o=f.METAMASK):n.ethereum?.isCoinbaseWallet?(s="Coinbase Wallet",o=f.COINBASE):n.ethereum?.isTrust&&(s="Trust Wallet",o=f.TRUST_WALLET);const i={id:o,name:s,rdns:o,icon:y[o]??"",provider:e,isInjected:!0};r.push(i),t.set(i.id,i)}}const e=window;if(e.gala?.request&&!t.has(f.GALA)){const n={id:f.GALA,name:"Gala Wallet",rdns:f.GALA,icon:y[f.GALA]??"",provider:e.gala,isInjected:!0};r.push(n),t.set(n.id,n)}n({wallets:r,byId:t,hasWallets:r.length>0,...void 0===r[0]?{}:{primary:r[0]}})},e)}):{wallets:r,byId:t,hasWallets:!1}}async function m(e,r){return(await P(r)).byId.get(e)??null}function W(e){return"privateKey"===e.providerType}function L(e){return"object"==typeof e&&null!==e&&"request"in e&&"function"==typeof e.request}exports.ExternalWalletProvider=p,exports.GalaChainConnectProvider=g,exports.GalaWalletProvider=class extends c{constructor(e){if(super(e),this.providerType="external",this.galaRawAddress=null,!e)throw new t("Gala Wallet provider is required",exports.WalletProviderErrorCode.PROVIDER_NOT_AVAILABLE)}parseGalaError(e){if(e instanceof Error)try{const r=JSON.parse(e.message);if("object"==typeof r&&null!==r){const t=r,n={message:"string"==typeof t.message?t.message:e.message};return"number"==typeof t.code&&(n.code=t.code),n}return{message:e.message}}catch{return{message:e.message}}return{message:String(e)}}handleProviderError(e,r){const n=this.parseGalaError(e);if(4001===n.code)throw new t(`User rejected ${r}`,exports.WalletProviderErrorCode.USER_REJECTED,e instanceof Error?e:void 0);if(4900===n.code)throw this.connectedAddress=null,new t("Wallet disconnected",exports.WalletProviderErrorCode.NOT_CONNECTED,e instanceof Error?e:void 0);const s=n.message?n.message:`${r} failed`;throw new t(s,r.includes("sign")?exports.WalletProviderErrorCode.SIGNING_FAILED:exports.WalletProviderErrorCode.UNKNOWN,e instanceof Error?e:void 0)}ensureConnected(){if(null===this.connectedAddress||void 0===this.connectedAddress)throw new t("Wallet is not connected. Call connect() first.",exports.WalletProviderErrorCode.NOT_CONNECTED)}async connect(){try{const e=await this.provider.request({method:"eth_requestAccounts"});if(null==e||0===e.length)throw new t("No accounts returned from Gala Wallet",exports.WalletProviderErrorCode.CONNECTION_FAILED);const n=e[0];if(void 0===n)throw new t("No accounts returned from Gala Wallet",exports.WalletProviderErrorCode.CONNECTION_FAILED);this.galaRawAddress=n;let s=n;return s.startsWith("eth|")?s=`0x${s.slice(4)}`:s.startsWith("0x")||(s=`0x${s}`),this.connectedAddress=r.getAddress(s),this.connectedAddress}catch(e){if(e instanceof t)throw e;return this.handleProviderError(e,"connect")}}async disconnect(){this.connectedAddress=null,this.galaRawAddress=null,this.removeEventListeners();try{await this.provider.disconnect()}catch{}}isConnected(){return null!==this.connectedAddress}async signMessage(e){return this.ensureConnected(),l(async()=>(await this.provider.setAddress(this.galaRawAddress??this.connectedAddress),a(this.provider,this.connectedAddress,e)),(e,r)=>this.handleProviderError(e,r),"sign message")}async signTypedData(e,r,t){return this.ensureConnected(),l(async()=>(await this.provider.setAddress(this.galaRawAddress??this.connectedAddress),d(this.provider,this.connectedAddress,e,r,t)),(e,r)=>this.handleProviderError(e,r),"sign typed data")}getAddress(){return this.ensureConnected(),Promise.resolve(this.connectedAddress)}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}getPrivateKey(){throw new t("Private key is not accessible with Gala Wallet. Use PrivateKeyProvider if you need private key access for @gala-chain operations.",exports.WalletProviderErrorCode.PRIVATE_KEY_NOT_ACCESSIBLE)}getProvider(){return this.provider}},exports.KNOWN_WALLET_RDNS=f,exports.PrivateKeyProvider=C,exports.WalletProviderError=t,exports.createProviderFromEip1193=function(e){return new p(e)},exports.createProviderFromWallet=function(e){return C.fromWallet(e)},exports.createWalletProvider=function(e){if(null!==e.privateKey&&void 0!==e.privateKey&&e.privateKey.length>0)return new C(e.privateKey);if(null!==e.eip1193Provider&&void 0!==e.eip1193Provider)return new p(e.eip1193Provider);throw new t("Invalid wallet provider config: must provide either privateKey or eip1193Provider",exports.WalletProviderErrorCode.INVALID_CONFIG)},exports.detectWallets=P,exports.ensureConnected=async function(e){return e.isConnected()?e.getAddress():e.connect()},exports.getInjectedEip1193Provider=function(){if("undefined"==typeof window)return null;const e=window.ethereum;return L(e)?e:null},exports.getPrivateKeyIfAvailable=async function(e){if(W(e))try{return await e.getPrivateKey()}catch{return}},exports.getWalletByRdns=m,exports.hasAnyWallet=function(){return null!==N()},exports.isEip1193Provider=L,exports.isExternalProvider=function(e){return"external"===e.providerType},exports.isPrivateKeyProvider=W,exports.isWalletAvailable=async function(e,r){return null!==await m(e,r)},exports.providerToWallet=function(e){if(e&&W(e))return e.getWallet()},exports.subscribeToWalletChanges=function(e){if(!I())return()=>{};let r=!0,t={wallets:[],byId:new Map,hasWallets:!1};const n=n=>{if(!r)return;const s=n,{info:o,provider:i}=s.detail,a=o.rdns||o.uuid;if(t.byId.has(a))return;const d={id:a,name:o.name,rdns:a,icon:o.icon??"",provider:i,isInjected:!1},c=[...t.wallets,d],l=new Map(t.byId);l.set(d.id,d),t={wallets:c,byId:l,hasWallets:!0,...void 0===c[0]?{}:{primary:c[0]}},e(t)};return window.addEventListener("eip6963:announceProvider",n),P().then(n=>{r&&(t=n,e(n))}),()=>{r=!1,window.removeEventListener("eip6963:announceProvider",n)}},exports.walletToProvider=function(e){if(e)return C.fromWallet(e)};
|
|
1
|
+
"use strict";var e,r=require("ethers");class t extends Error{constructor(e,r,t){super(e),this.code=r,this.originalError=t,this.name="WalletProviderError"}}function n(e,r,t){return{types:{EIP712Domain:s(e),...r},primaryType:Object.keys(r)[0],domain:o(e),message:t}}function s(e){const r=[];return void 0!==e.name&&r.push({name:"name",type:"string"}),void 0!==e.version&&r.push({name:"version",type:"string"}),void 0!==e.chainId&&r.push({name:"chainId",type:"uint256"}),void 0!==e.verifyingContract&&r.push({name:"verifyingContract",type:"address"}),void 0!==e.salt&&r.push({name:"salt",type:"bytes32"}),r}function o(e){const r={};return void 0!==e.name&&(r.name=e.name),void 0!==e.version&&(r.version=e.version),void 0!==e.chainId&&(r.chainId="bigint"==typeof e.chainId||"number"==typeof e.chainId?`0x${e.chainId.toString(16)}`:e.chainId),void 0!==e.verifyingContract&&(r.verifyingContract=e.verifyingContract),void 0!==e.salt&&(r.salt=e.salt),r}function i(e){return`0x${Buffer.from(e,"utf8").toString("hex")}`}async function a(e,r,t){return e.request({method:"personal_sign",params:[i(t),r]})}async function d(e,r,t,s,o){return e.request({method:"eth_signTypedData_v4",params:[r,JSON.stringify(n(t,s,o))]})}exports.WalletProviderErrorCode=void 0,(e=exports.WalletProviderErrorCode||(exports.WalletProviderErrorCode={})).USER_REJECTED="USER_REJECTED",e.NOT_CONNECTED="NOT_CONNECTED",e.CONNECTION_FAILED="CONNECTION_FAILED",e.SIGNING_FAILED="SIGNING_FAILED",e.PROVIDER_NOT_AVAILABLE="PROVIDER_NOT_AVAILABLE",e.PRIVATE_KEY_NOT_ACCESSIBLE="PRIVATE_KEY_NOT_ACCESSIBLE",e.INVALID_CONFIG="INVALID_CONFIG",e.CHAIN_MISMATCH="CHAIN_MISMATCH",e.UNKNOWN="UNKNOWN";class c{constructor(e){this.connectedAddress=null,this.provider=e,this.eventHandlers=function(e,t,n){if(null==e||"function"!=typeof e.on)return{accountsChanged:null,disconnect:null};const s=e=>{const n=e[0];t(void 0===n?null:r.getAddress(n))},o=()=>n();return e.on("accountsChanged",s),e.on("disconnect",o),{accountsChanged:s,disconnect:o}}(e,e=>{this.connectedAddress=e},()=>{this.connectedAddress=null})}removeEventListeners(){!function(e,r){if("function"!=typeof e.removeListener)return;null!==r.accountsChanged&&e.removeListener("accountsChanged",r.accountsChanged);null!==r.disconnect&&e.removeListener("disconnect",r.disconnect)}(this.provider,this.eventHandlers)}}async function l(e,r,n){try{return await e()}catch(e){if(e instanceof t)throw e;return r(e,n)}}const u=4001,h=4100,v=4900,A=4901;class p extends c{constructor(e){if(super(e),this.providerType="external",null==e)throw new t("EIP-1193 provider is required",exports.WalletProviderErrorCode.INVALID_CONFIG)}handleProviderError(e,r){const n=e;if(n.code===u)throw new t(`User rejected ${r}`,exports.WalletProviderErrorCode.USER_REJECTED,e instanceof Error?e:void 0);if(n.code===h)throw new t("Wallet is not authorized",exports.WalletProviderErrorCode.NOT_CONNECTED,e instanceof Error?e:void 0);if(n.code===v||n.code===A)throw this.connectedAddress=null,new t("Wallet disconnected",exports.WalletProviderErrorCode.NOT_CONNECTED,e instanceof Error?e:void 0);throw new t(n.message??`${r} failed`,r.includes("sign")?exports.WalletProviderErrorCode.SIGNING_FAILED:exports.WalletProviderErrorCode.UNKNOWN,e instanceof Error?e:void 0)}ensureConnected(){if(!this.connectedAddress)throw new t("Wallet is not connected. Call connect() first.",exports.WalletProviderErrorCode.NOT_CONNECTED)}async connect(){try{const e=await this.provider.request({method:"eth_requestAccounts"});if(null==e||0===e.length)throw new t("No accounts returned from wallet",exports.WalletProviderErrorCode.CONNECTION_FAILED);const n=e[0];if(void 0===n)throw new t("No accounts returned from wallet",exports.WalletProviderErrorCode.CONNECTION_FAILED);return this.connectedAddress=r.getAddress(n),this.connectedAddress}catch(e){if(e instanceof t)throw e;return this.handleProviderError(e,"connect")}}async disconnect(){this.connectedAddress=null,this.removeEventListeners();try{await this.provider.request({method:"wallet_revokePermissions",params:[{eth_accounts:{}}]})}catch{}}isConnected(){return null!==this.connectedAddress}async signMessage(e){return this.ensureConnected(),l(()=>a(this.provider,this.connectedAddress,e),(e,r)=>this.handleProviderError(e,r),"sign message")}async signTypedData(e,r,t){return this.ensureConnected(),l(()=>d(this.provider,this.connectedAddress,e,r,t),(e,r)=>this.handleProviderError(e,r),"sign typed data")}async getAddress(){await Promise.resolve(),this.ensureConnected();const e=this.connectedAddress;if(null==e)throw new t("Wallet is not connected",exports.WalletProviderErrorCode.NOT_CONNECTED);return e}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}async getPrivateKey(){return Promise.reject(new t("Private key is not accessible with external wallet providers. Use PrivateKeyProvider if you need private key access for @gala-chain operations.",exports.WalletProviderErrorCode.PRIVATE_KEY_NOT_ACCESSIBLE))}getProvider(){return this.provider}}class E{constructor(e){this.providerType="privateKey",this.connected=!0;try{this.wallet=new r.Wallet(e)}catch(e){throw new t("Invalid private key provided",exports.WalletProviderErrorCode.INVALID_CONFIG,e instanceof Error?e:void 0)}}static fromWallet(e){return new E(e.privateKey)}async signMessage(e){try{return await this.wallet.signMessage(e)}catch(e){throw new t("Failed to sign message",exports.WalletProviderErrorCode.SIGNING_FAILED,e instanceof Error?e:void 0)}}async signTypedData(e,r,n){try{return await this.wallet.signTypedData(e,r,n)}catch(e){throw new t("Failed to sign typed data",exports.WalletProviderErrorCode.SIGNING_FAILED,e instanceof Error?e:void 0)}}getAddress(){return Promise.resolve(r.getAddress(this.wallet.address))}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}async connect(){return this.connected=!0,this.getAddress()}disconnect(){return this.connected=!1,Promise.resolve()}isConnected(){return this.connected}getPrivateKey(){return Promise.resolve(this.wallet.privateKey)}getWallet(){return this.wallet}}const w={METAMASK:"io.metamask",METAMASK_FLASK:"io.metamask.flask",COINBASE:"com.coinbase.wallet",TRUST_WALLET:"com.trustwallet.app",PHANTOM:"app.phantom",RAINBOW:"me.rainbow",OKX:"com.okex.wallet",RABBY:"io.rabby",BRAVE:"com.brave.wallet",FRAME:"sh.frame",LEDGER:"com.ledger",ZERION:"io.zerion.wallet",GALA:"com.gala.wallet"},f={[w.METAMASK]:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIxLjU0IDQuMjJsLTguMzQgNi4yMSAxLjU0LTMuNjUtLTUuNTMtMi41MXoiIGZpbGw9IiNFMjc2MUIiLz48L3N2Zz4=",[w.GALA]:"data:image/png;base64,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"};function g(){return"undefined"!=typeof window&&"function"==typeof window.dispatchEvent}function y(){if(!g())return null;return window.ethereum??null}function N(e){return"object"==typeof e&&null!==e&&"function"==typeof e.request}async function m(e=500){const r=[],t=new Map;return g()?new Promise(n=>{const s=new Set,o=e=>{const n=e,{info:o,provider:i}=n.detail;if(s.has(o.uuid))return;s.add(o.uuid);const a={id:o.rdns||o.uuid,name:o.name,rdns:o.rdns||o.uuid,icon:o.icon??f[o.rdns||""]??"",provider:i,isInjected:!1};r.push(a),t.set(a.id,a)};window.addEventListener("eip6963:announceProvider",o),window.dispatchEvent(new Event("eip6963:requestProvider")),setTimeout(()=>{if(window.removeEventListener("eip6963:announceProvider",o),0===r.length){const e=y();if(e){const n=window;let s="Browser Wallet",o="injected";n.ethereum?.isMetaMask?(s="MetaMask",o=w.METAMASK):n.ethereum?.isCoinbaseWallet?(s="Coinbase Wallet",o=w.COINBASE):n.ethereum?.isTrust&&(s="Trust Wallet",o=w.TRUST_WALLET);const i={id:o,name:s,rdns:o,icon:f[o]??"",provider:e,isInjected:!0};r.push(i),t.set(i.id,i)}}if(!t.has(w.TRUST_WALLET)){const e=function(){if(!g())return null;const e=window;if(N(e.ethereum)&&e.ethereum.isTrust)return e.ethereum;const r=e.ethereum?.providers?.find(e=>N(e)&&!0===e.isTrust);return void 0!==r?r:N(e.trustwallet)?e.trustwallet:null}();if(null!==e&&!r.some(r=>r.provider===e)){const n={id:w.TRUST_WALLET,name:"Trust Wallet",rdns:w.TRUST_WALLET,icon:f[w.TRUST_WALLET]??"",provider:e,isInjected:!0};r.push(n),t.set(n.id,n)}}const e=window;if(e.gala?.request&&!t.has(w.GALA)){const n={id:w.GALA,name:"Gala Wallet",rdns:w.GALA,icon:f[w.GALA]??"",provider:e.gala,isInjected:!0};r.push(n),t.set(n.id,n)}n({wallets:r,byId:t,hasWallets:r.length>0,...void 0===r[0]?{}:{primary:r[0]}})},e)}):{wallets:r,byId:t,hasWallets:!1}}async function I(e,r){return(await m(r)).byId.get(e)??null}function C(e){return"privateKey"===e.providerType}function P(e){return"object"==typeof e&&null!==e&&"request"in e&&"function"==typeof e.request}exports.ExternalWalletProvider=p,exports.GalaWalletProvider=class extends c{constructor(e){if(super(e),this.providerType="external",this.galaRawAddress=null,!e)throw new t("Gala Wallet provider is required",exports.WalletProviderErrorCode.PROVIDER_NOT_AVAILABLE)}parseGalaError(e){if(e instanceof Error)try{const r=JSON.parse(e.message);if("object"==typeof r&&null!==r){const t=r,n={message:"string"==typeof t.message?t.message:e.message};return"number"==typeof t.code&&(n.code=t.code),n}return{message:e.message}}catch{return{message:e.message}}return{message:String(e)}}handleProviderError(e,r){const n=this.parseGalaError(e);if(4001===n.code)throw new t(`User rejected ${r}`,exports.WalletProviderErrorCode.USER_REJECTED,e instanceof Error?e:void 0);if(4900===n.code)throw this.connectedAddress=null,new t("Wallet disconnected",exports.WalletProviderErrorCode.NOT_CONNECTED,e instanceof Error?e:void 0);const s=n.message?n.message:`${r} failed`;throw new t(s,r.includes("sign")?exports.WalletProviderErrorCode.SIGNING_FAILED:exports.WalletProviderErrorCode.UNKNOWN,e instanceof Error?e:void 0)}ensureConnected(){if(null===this.connectedAddress||void 0===this.connectedAddress)throw new t("Wallet is not connected. Call connect() first.",exports.WalletProviderErrorCode.NOT_CONNECTED)}async connect(){try{const e=await this.provider.request({method:"eth_requestAccounts"});if(null==e||0===e.length)throw new t("No accounts returned from Gala Wallet",exports.WalletProviderErrorCode.CONNECTION_FAILED);const n=e[0];if(void 0===n)throw new t("No accounts returned from Gala Wallet",exports.WalletProviderErrorCode.CONNECTION_FAILED);this.galaRawAddress=n;let s=n;return s.startsWith("eth|")?s=`0x${s.slice(4)}`:s.startsWith("0x")||(s=`0x${s}`),this.connectedAddress=r.getAddress(s),this.connectedAddress}catch(e){if(e instanceof t)throw e;return this.handleProviderError(e,"connect")}}async disconnect(){this.connectedAddress=null,this.galaRawAddress=null,this.removeEventListeners();try{await this.provider.disconnect()}catch{}}isConnected(){return null!==this.connectedAddress}async signMessage(e){return this.ensureConnected(),l(async()=>(await this.provider.setAddress(this.galaRawAddress??this.connectedAddress),a(this.provider,this.connectedAddress,e)),(e,r)=>this.handleProviderError(e,r),"sign message")}async signTypedData(e,r,t){return this.ensureConnected(),l(async()=>(await this.provider.setAddress(this.galaRawAddress??this.connectedAddress),d(this.provider,this.connectedAddress,e,r,t)),(e,r)=>this.handleProviderError(e,r),"sign typed data")}getAddress(){return this.ensureConnected(),Promise.resolve(this.connectedAddress)}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}getPrivateKey(){throw new t("Private key is not accessible with Gala Wallet. Use PrivateKeyProvider if you need private key access for @gala-chain operations.",exports.WalletProviderErrorCode.PRIVATE_KEY_NOT_ACCESSIBLE)}getProvider(){return this.provider}},exports.KNOWN_WALLET_RDNS=w,exports.PrivateKeyProvider=E,exports.WalletProviderError=t,exports.createProviderFromEip1193=function(e){return new p(e)},exports.createProviderFromWallet=function(e){return E.fromWallet(e)},exports.createWalletProvider=function(e){if(null!==e.privateKey&&void 0!==e.privateKey&&e.privateKey.length>0)return new E(e.privateKey);if(null!==e.eip1193Provider&&void 0!==e.eip1193Provider)return new p(e.eip1193Provider);throw new t("Invalid wallet provider config: must provide either privateKey or eip1193Provider",exports.WalletProviderErrorCode.INVALID_CONFIG)},exports.detectWallets=m,exports.ensureConnected=async function(e){return e.isConnected()?e.getAddress():e.connect()},exports.getInjectedEip1193Provider=function(){if("undefined"==typeof window)return null;const e=window.ethereum;return P(e)?e:null},exports.getPrivateKeyIfAvailable=async function(e){if(C(e))try{return await e.getPrivateKey()}catch{return}},exports.getWalletByRdns=I,exports.hasAnyWallet=function(){return null!==y()},exports.isEip1193Provider=P,exports.isExternalProvider=function(e){return"external"===e.providerType},exports.isPrivateKeyProvider=C,exports.isWalletAvailable=async function(e,r){return null!==await I(e,r)},exports.providerToWallet=function(e){if(e&&C(e))return e.getWallet()},exports.subscribeToWalletChanges=function(e){if(!g())return()=>{};let r=!0,t={wallets:[],byId:new Map,hasWallets:!1};const n=n=>{if(!r)return;const s=n,{info:o,provider:i}=s.detail,a=o.rdns||o.uuid;if(t.byId.has(a))return;const d={id:a,name:o.name,rdns:a,icon:o.icon??"",provider:i,isInjected:!1},c=[...t.wallets,d],l=new Map(t.byId);l.set(d.id,d),t={wallets:c,byId:l,hasWallets:!0,...void 0===c[0]?{}:{primary:c[0]}},e(t)};return window.addEventListener("eip6963:announceProvider",n),m().then(n=>{r&&(t=n,e(n))}),()=>{r=!1,window.removeEventListener("eip6963:announceProvider",n)}},exports.walletToProvider=function(e){if(e)return E.fromWallet(e)};
|
package/dist/wallet.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getAddress as e,Wallet as n}from"ethers";class t extends Error{constructor(e,n,t){super(e),this.code=n,this.originalError=t,this.name="WalletProviderError"}}var r;function s(e,n,t){return{types:{EIP712Domain:i(e),...n},primaryType:Object.keys(n)[0],domain:o(e),message:t}}function i(e){const n=[];return void 0!==e.name&&n.push({name:"name",type:"string"}),void 0!==e.version&&n.push({name:"version",type:"string"}),void 0!==e.chainId&&n.push({name:"chainId",type:"uint256"}),void 0!==e.verifyingContract&&n.push({name:"verifyingContract",type:"address"}),void 0!==e.salt&&n.push({name:"salt",type:"bytes32"}),n}function o(e){const n={};return void 0!==e.name&&(n.name=e.name),void 0!==e.version&&(n.version=e.version),void 0!==e.chainId&&(n.chainId="bigint"==typeof e.chainId||"number"==typeof e.chainId?`0x${e.chainId.toString(16)}`:e.chainId),void 0!==e.verifyingContract&&(n.verifyingContract=e.verifyingContract),void 0!==e.salt&&(n.salt=e.salt),n}function a(e){return`0x${Buffer.from(e,"utf8").toString("hex")}`}async function c(e,n,t){return e.request({method:"personal_sign",params:[a(t),n]})}async function d(e,n,t,r,i){return e.request({method:"eth_signTypedData_v4",params:[n,JSON.stringify(s(t,r,i))]})}!function(e){e.USER_REJECTED="USER_REJECTED",e.NOT_CONNECTED="NOT_CONNECTED",e.CONNECTION_FAILED="CONNECTION_FAILED",e.SIGNING_FAILED="SIGNING_FAILED",e.PROVIDER_NOT_AVAILABLE="PROVIDER_NOT_AVAILABLE",e.PRIVATE_KEY_NOT_ACCESSIBLE="PRIVATE_KEY_NOT_ACCESSIBLE",e.INVALID_CONFIG="INVALID_CONFIG",e.CHAIN_MISMATCH="CHAIN_MISMATCH",e.UNKNOWN="UNKNOWN"}(r||(r={}));class l{constructor(n){this.connectedAddress=null,this.provider=n,this.eventHandlers=function(n,t,r){if(null==n||"function"!=typeof n.on)return{accountsChanged:null,disconnect:null};const s=n=>{const r=n[0];t(void 0===r?null:e(r))},i=()=>r();return n.on("accountsChanged",s),n.on("disconnect",i),{accountsChanged:s,disconnect:i}}(n,e=>{this.connectedAddress=e},()=>{this.connectedAddress=null})}removeEventListeners(){!function(e,n){if("function"!=typeof e.removeListener)return;null!==n.accountsChanged&&e.removeListener("accountsChanged",n.accountsChanged);null!==n.disconnect&&e.removeListener("disconnect",n.disconnect)}(this.provider,this.eventHandlers)}}async function u(e,n,r){try{return await e()}catch(e){if(e instanceof t)throw e;return n(e,r)}}const h=4001,A=4100,w=4900,v=4901;class g extends l{constructor(e){if(super(e),this.providerType="external",null==e)throw new t("EIP-1193 provider is required",r.INVALID_CONFIG)}handleProviderError(e,n){const s=e;if(s.code===h)throw new t(`User rejected ${n}`,r.USER_REJECTED,e instanceof Error?e:void 0);if(s.code===A)throw new t("Wallet is not authorized",r.NOT_CONNECTED,e instanceof Error?e:void 0);if(s.code===w||s.code===v)throw this.connectedAddress=null,new t("Wallet disconnected",r.NOT_CONNECTED,e instanceof Error?e:void 0);throw new t(s.message??`${n} failed`,n.includes("sign")?r.SIGNING_FAILED:r.UNKNOWN,e instanceof Error?e:void 0)}ensureConnected(){if(!this.connectedAddress)throw new t("Wallet is not connected. Call connect() first.",r.NOT_CONNECTED)}async connect(){try{const n=await this.provider.request({method:"eth_requestAccounts"});if(null==n||0===n.length)throw new t("No accounts returned from wallet",r.CONNECTION_FAILED);const s=n[0];if(void 0===s)throw new t("No accounts returned from wallet",r.CONNECTION_FAILED);return this.connectedAddress=e(s),this.connectedAddress}catch(e){if(e instanceof t)throw e;return this.handleProviderError(e,"connect")}}async disconnect(){this.connectedAddress=null,this.removeEventListeners();try{await this.provider.request({method:"wallet_revokePermissions",params:[{eth_accounts:{}}]})}catch{}}isConnected(){return null!==this.connectedAddress}async signMessage(e){return this.ensureConnected(),u(()=>c(this.provider,this.connectedAddress,e),(e,n)=>this.handleProviderError(e,n),"sign message")}async signTypedData(e,n,t){return this.ensureConnected(),u(()=>d(this.provider,this.connectedAddress,e,n,t),(e,n)=>this.handleProviderError(e,n),"sign typed data")}async getAddress(){await Promise.resolve(),this.ensureConnected();const e=this.connectedAddress;if(null==e)throw new t("Wallet is not connected",r.NOT_CONNECTED);return e}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}async getPrivateKey(){return Promise.reject(new t("Private key is not accessible with external wallet providers. Use PrivateKeyProvider if you need private key access for @gala-chain operations.",r.PRIVATE_KEY_NOT_ACCESSIBLE))}getProvider(){return this.provider}}let E=null;async function f(){if(!1===E)return null;try{const e=["@gala-chain","connect"].join("/"),n=await import(e);return E=!0,n}catch{return E=!1,null}}class y{constructor(e){if(this.providerType="external",this.connectedAddress=null,!e)throw new t("@gala-chain/connect client is required",r.INVALID_CONFIG);if("function"!=typeof e.signMessage)throw new t("Invalid @gala-chain/connect client: signMessage method is required",r.INVALID_CONFIG);this.client=e}static async createBrowserClient(e){const n=await f();if(null==n)throw new t("Failed to create BrowserConnectClient: @gala-chain/connect is not installed. Install it with: npm install @gala-chain/connect",r.PROVIDER_NOT_AVAILABLE);const{BrowserConnectClient:s}=n,i=s,o=e?new i(e):new i;return new y(o)}static async createTrustWalletClient(){const e=await f();if(null==e)throw new t("Failed to create TrustWalletConnectClient: @gala-chain/connect is not installed. Install it with: npm install @gala-chain/connect",r.PROVIDER_NOT_AVAILABLE);const{TrustWalletConnectClient:n}=e,s=new n;return new y(s)}static async isAvailable(){return null!==await f()}ensureConnected(){if(null===this.connectedAddress||void 0===this.connectedAddress)throw new t("Wallet is not connected. Call connect() first.",r.NOT_CONNECTED);return this.connectedAddress}async connect(){try{if("function"==typeof this.client.connect){const n=await this.client.connect();if(null!=n&&n.length>0)return this.connectedAddress=e(n),this.connectedAddress}if("function"==typeof this.client.getAccount){const n=await this.client.getAccount();if(null!=n&&n.length>0)return this.connectedAddress=e(n),this.connectedAddress}throw new t("Failed to connect: no account returned",r.CONNECTION_FAILED)}catch(e){if(e instanceof t)throw e;const n=e instanceof Error?e.message:String(e);if(n.length>0&&(n.includes("rejected")||n.includes("denied")))throw new t("User rejected connection",r.USER_REJECTED,e instanceof Error?e:void 0);throw new t("Failed to connect to wallet",r.CONNECTION_FAILED,e instanceof Error?e:void 0)}}async disconnect(){"function"==typeof this.client.disconnect&&await this.client.disconnect(),this.connectedAddress=null}isConnected(){return null!==this.connectedAddress}async signMessage(e){this.ensureConnected();try{return await this.client.signMessage(e)}catch(e){const n=e instanceof Error?e.message:String(e);if(n.includes("rejected")||n.includes("denied"))throw new t("User rejected signing",r.USER_REJECTED,e instanceof Error?e:void 0);throw new t("Failed to sign message",r.SIGNING_FAILED,e instanceof Error?e:void 0)}}signTypedData(e,n,s){return Promise.reject(new t("signTypedData is not supported by GalaChainConnectProvider. Use ExternalWalletProvider with the underlying EIP-1193 provider instead.",r.SIGNING_FAILED))}async getAddress(){return await Promise.resolve(),this.ensureConnected()}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}getPrivateKey(){return Promise.reject(new t("Private key is not accessible with @gala-chain/connect. Use PrivateKeyProvider if you need private key access.",r.PRIVATE_KEY_NOT_ACCESSIBLE))}getClient(){return this.client}}class p extends l{constructor(e){if(super(e),this.providerType="external",this.galaRawAddress=null,!e)throw new t("Gala Wallet provider is required",r.PROVIDER_NOT_AVAILABLE)}parseGalaError(e){if(e instanceof Error)try{const n=JSON.parse(e.message);if("object"==typeof n&&null!==n){const t=n,r={message:"string"==typeof t.message?t.message:e.message};return"number"==typeof t.code&&(r.code=t.code),r}return{message:e.message}}catch{return{message:e.message}}return{message:String(e)}}handleProviderError(e,n){const s=this.parseGalaError(e);if(4001===s.code)throw new t(`User rejected ${n}`,r.USER_REJECTED,e instanceof Error?e:void 0);if(4900===s.code)throw this.connectedAddress=null,new t("Wallet disconnected",r.NOT_CONNECTED,e instanceof Error?e:void 0);const i=s.message?s.message:`${n} failed`;throw new t(i,n.includes("sign")?r.SIGNING_FAILED:r.UNKNOWN,e instanceof Error?e:void 0)}ensureConnected(){if(null===this.connectedAddress||void 0===this.connectedAddress)throw new t("Wallet is not connected. Call connect() first.",r.NOT_CONNECTED)}async connect(){try{const n=await this.provider.request({method:"eth_requestAccounts"});if(null==n||0===n.length)throw new t("No accounts returned from Gala Wallet",r.CONNECTION_FAILED);const s=n[0];if(void 0===s)throw new t("No accounts returned from Gala Wallet",r.CONNECTION_FAILED);this.galaRawAddress=s;let i=s;return i.startsWith("eth|")?i=`0x${i.slice(4)}`:i.startsWith("0x")||(i=`0x${i}`),this.connectedAddress=e(i),this.connectedAddress}catch(e){if(e instanceof t)throw e;return this.handleProviderError(e,"connect")}}async disconnect(){this.connectedAddress=null,this.galaRawAddress=null,this.removeEventListeners();try{await this.provider.disconnect()}catch{}}isConnected(){return null!==this.connectedAddress}async signMessage(e){return this.ensureConnected(),u(async()=>(await this.provider.setAddress(this.galaRawAddress??this.connectedAddress),c(this.provider,this.connectedAddress,e)),(e,n)=>this.handleProviderError(e,n),"sign message")}async signTypedData(e,n,t){return this.ensureConnected(),u(async()=>(await this.provider.setAddress(this.galaRawAddress??this.connectedAddress),d(this.provider,this.connectedAddress,e,n,t)),(e,n)=>this.handleProviderError(e,n),"sign typed data")}getAddress(){return this.ensureConnected(),Promise.resolve(this.connectedAddress)}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}getPrivateKey(){throw new t("Private key is not accessible with Gala Wallet. Use PrivateKeyProvider if you need private key access for @gala-chain operations.",r.PRIVATE_KEY_NOT_ACCESSIBLE)}getProvider(){return this.provider}}class I{constructor(e){this.providerType="privateKey",this.connected=!0;try{this.wallet=new n(e)}catch(e){throw new t("Invalid private key provided",r.INVALID_CONFIG,e instanceof Error?e:void 0)}}static fromWallet(e){return new I(e.privateKey)}async signMessage(e){try{return await this.wallet.signMessage(e)}catch(e){throw new t("Failed to sign message",r.SIGNING_FAILED,e instanceof Error?e:void 0)}}async signTypedData(e,n,s){try{return await this.wallet.signTypedData(e,n,s)}catch(e){throw new t("Failed to sign typed data",r.SIGNING_FAILED,e instanceof Error?e:void 0)}}getAddress(){return Promise.resolve(e(this.wallet.address))}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}async connect(){return this.connected=!0,this.getAddress()}disconnect(){return this.connected=!1,Promise.resolve()}isConnected(){return this.connected}getPrivateKey(){return Promise.resolve(this.wallet.privateKey)}getWallet(){return this.wallet}}const N={METAMASK:"io.metamask",METAMASK_FLASK:"io.metamask.flask",COINBASE:"com.coinbase.wallet",TRUST_WALLET:"com.trustwallet.app",PHANTOM:"app.phantom",RAINBOW:"me.rainbow",OKX:"com.okex.wallet",RABBY:"io.rabby",BRAVE:"com.brave.wallet",FRAME:"sh.frame",LEDGER:"com.ledger",ZERION:"io.zerion.wallet",GALA:"com.gala.wallet"},m={[N.METAMASK]:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIxLjU0IDQuMjJsLTguMzQgNi4yMSAxLjU0LTMuNjUtLTUuNTMtMi41MXoiIGZpbGw9IiNFMjc2MUIiLz48L3N2Zz4=",[N.GALA]:"data:image/png;base64,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"};function C(){return"undefined"!=typeof window&&"function"==typeof window.dispatchEvent}function L(){if(!C())return null;return window.ethereum??null}async function O(e=500){const n=[],t=new Map;return C()?new Promise(r=>{const s=new Set,i=e=>{const r=e,{info:i,provider:o}=r.detail;if(s.has(i.uuid))return;s.add(i.uuid);const a={id:i.rdns||i.uuid,name:i.name,rdns:i.rdns||i.uuid,icon:i.icon??m[i.rdns||""]??"",provider:o,isInjected:!1};n.push(a),t.set(a.id,a)};window.addEventListener("eip6963:announceProvider",i),window.dispatchEvent(new Event("eip6963:requestProvider")),setTimeout(()=>{if(window.removeEventListener("eip6963:announceProvider",i),0===n.length){const e=L();if(e){const r=window;let s="Browser Wallet",i="injected";r.ethereum?.isMetaMask?(s="MetaMask",i=N.METAMASK):r.ethereum?.isCoinbaseWallet?(s="Coinbase Wallet",i=N.COINBASE):r.ethereum?.isTrust&&(s="Trust Wallet",i=N.TRUST_WALLET);const o={id:i,name:s,rdns:i,icon:m[i]??"",provider:e,isInjected:!0};n.push(o),t.set(o.id,o)}}const e=window;if(e.gala?.request&&!t.has(N.GALA)){const r={id:N.GALA,name:"Gala Wallet",rdns:N.GALA,icon:m[N.GALA]??"",provider:e.gala,isInjected:!0};n.push(r),t.set(r.id,r)}r({wallets:n,byId:t,hasWallets:n.length>0,...void 0===n[0]?{}:{primary:n[0]}})},e)}):{wallets:n,byId:t,hasWallets:!1}}function T(e){if(!C())return()=>{};let n=!0,t={wallets:[],byId:new Map,hasWallets:!1};const r=r=>{if(!n)return;const s=r,{info:i,provider:o}=s.detail,a=i.rdns||i.uuid;if(t.byId.has(a))return;const c={id:a,name:i.name,rdns:a,icon:i.icon??"",provider:o,isInjected:!1},d=[...t.wallets,c],l=new Map(t.byId);l.set(c.id,c),t={wallets:d,byId:l,hasWallets:!0,...void 0===d[0]?{}:{primary:d[0]}},e(t)};return window.addEventListener("eip6963:announceProvider",r),O().then(r=>{n&&(t=r,e(r))}),()=>{n=!1,window.removeEventListener("eip6963:announceProvider",r)}}async function D(e,n){return(await O(n)).byId.get(e)??null}async function P(e,n){return null!==await D(e,n)}function S(){return null!==L()}function M(e){if(null!==e.privateKey&&void 0!==e.privateKey&&e.privateKey.length>0)return new I(e.privateKey);if(null!==e.eip1193Provider&&void 0!==e.eip1193Provider)return new g(e.eip1193Provider);throw new t("Invalid wallet provider config: must provide either privateKey or eip1193Provider",r.INVALID_CONFIG)}function F(e){return I.fromWallet(e)}function G(e){return new g(e)}function R(e){return"privateKey"===e.providerType}function V(e){return"external"===e.providerType}async function W(e){if(R(e))try{return await e.getPrivateKey()}catch{return}}function B(e){if(e)return I.fromWallet(e)}function U(e){if(e&&R(e))return e.getWallet()}async function K(e){return e.isConnected()?e.getAddress():e.connect()}function b(e){return"object"==typeof e&&null!==e&&"request"in e&&"function"==typeof e.request}function _(){if("undefined"==typeof window)return null;const e=window.ethereum;return b(e)?e:null}export{g as ExternalWalletProvider,y as GalaChainConnectProvider,p as GalaWalletProvider,N as KNOWN_WALLET_RDNS,I as PrivateKeyProvider,t as WalletProviderError,r as WalletProviderErrorCode,G as createProviderFromEip1193,F as createProviderFromWallet,M as createWalletProvider,O as detectWallets,K as ensureConnected,_ as getInjectedEip1193Provider,W as getPrivateKeyIfAvailable,D as getWalletByRdns,S as hasAnyWallet,b as isEip1193Provider,V as isExternalProvider,R as isPrivateKeyProvider,P as isWalletAvailable,U as providerToWallet,T as subscribeToWalletChanges,B as walletToProvider};
|
|
1
|
+
import{getAddress as e,Wallet as t}from"ethers";class n extends Error{constructor(e,t,n){super(e),this.code=t,this.originalError=n,this.name="WalletProviderError"}}var r;function s(e,t,n){return{types:{EIP712Domain:i(e),...t},primaryType:Object.keys(t)[0],domain:o(e),message:n}}function i(e){const t=[];return void 0!==e.name&&t.push({name:"name",type:"string"}),void 0!==e.version&&t.push({name:"version",type:"string"}),void 0!==e.chainId&&t.push({name:"chainId",type:"uint256"}),void 0!==e.verifyingContract&&t.push({name:"verifyingContract",type:"address"}),void 0!==e.salt&&t.push({name:"salt",type:"bytes32"}),t}function o(e){const t={};return void 0!==e.name&&(t.name=e.name),void 0!==e.version&&(t.version=e.version),void 0!==e.chainId&&(t.chainId="bigint"==typeof e.chainId||"number"==typeof e.chainId?`0x${e.chainId.toString(16)}`:e.chainId),void 0!==e.verifyingContract&&(t.verifyingContract=e.verifyingContract),void 0!==e.salt&&(t.salt=e.salt),t}function a(e){return`0x${Buffer.from(e,"utf8").toString("hex")}`}async function d(e,t,n){return e.request({method:"personal_sign",params:[a(n),t]})}async function c(e,t,n,r,i){return e.request({method:"eth_signTypedData_v4",params:[t,JSON.stringify(s(n,r,i))]})}!function(e){e.USER_REJECTED="USER_REJECTED",e.NOT_CONNECTED="NOT_CONNECTED",e.CONNECTION_FAILED="CONNECTION_FAILED",e.SIGNING_FAILED="SIGNING_FAILED",e.PROVIDER_NOT_AVAILABLE="PROVIDER_NOT_AVAILABLE",e.PRIVATE_KEY_NOT_ACCESSIBLE="PRIVATE_KEY_NOT_ACCESSIBLE",e.INVALID_CONFIG="INVALID_CONFIG",e.CHAIN_MISMATCH="CHAIN_MISMATCH",e.UNKNOWN="UNKNOWN"}(r||(r={}));class l{constructor(t){this.connectedAddress=null,this.provider=t,this.eventHandlers=function(t,n,r){if(null==t||"function"!=typeof t.on)return{accountsChanged:null,disconnect:null};const s=t=>{const r=t[0];n(void 0===r?null:e(r))},i=()=>r();return t.on("accountsChanged",s),t.on("disconnect",i),{accountsChanged:s,disconnect:i}}(t,e=>{this.connectedAddress=e},()=>{this.connectedAddress=null})}removeEventListeners(){!function(e,t){if("function"!=typeof e.removeListener)return;null!==t.accountsChanged&&e.removeListener("accountsChanged",t.accountsChanged);null!==t.disconnect&&e.removeListener("disconnect",t.disconnect)}(this.provider,this.eventHandlers)}}async function u(e,t,r){try{return await e()}catch(e){if(e instanceof n)throw e;return t(e,r)}}const h=4001,A=4100,v=4900,w=4901;class f extends l{constructor(e){if(super(e),this.providerType="external",null==e)throw new n("EIP-1193 provider is required",r.INVALID_CONFIG)}handleProviderError(e,t){const s=e;if(s.code===h)throw new n(`User rejected ${t}`,r.USER_REJECTED,e instanceof Error?e:void 0);if(s.code===A)throw new n("Wallet is not authorized",r.NOT_CONNECTED,e instanceof Error?e:void 0);if(s.code===v||s.code===w)throw this.connectedAddress=null,new n("Wallet disconnected",r.NOT_CONNECTED,e instanceof Error?e:void 0);throw new n(s.message??`${t} failed`,t.includes("sign")?r.SIGNING_FAILED:r.UNKNOWN,e instanceof Error?e:void 0)}ensureConnected(){if(!this.connectedAddress)throw new n("Wallet is not connected. Call connect() first.",r.NOT_CONNECTED)}async connect(){try{const t=await this.provider.request({method:"eth_requestAccounts"});if(null==t||0===t.length)throw new n("No accounts returned from wallet",r.CONNECTION_FAILED);const s=t[0];if(void 0===s)throw new n("No accounts returned from wallet",r.CONNECTION_FAILED);return this.connectedAddress=e(s),this.connectedAddress}catch(e){if(e instanceof n)throw e;return this.handleProviderError(e,"connect")}}async disconnect(){this.connectedAddress=null,this.removeEventListeners();try{await this.provider.request({method:"wallet_revokePermissions",params:[{eth_accounts:{}}]})}catch{}}isConnected(){return null!==this.connectedAddress}async signMessage(e){return this.ensureConnected(),u(()=>d(this.provider,this.connectedAddress,e),(e,t)=>this.handleProviderError(e,t),"sign message")}async signTypedData(e,t,n){return this.ensureConnected(),u(()=>c(this.provider,this.connectedAddress,e,t,n),(e,t)=>this.handleProviderError(e,t),"sign typed data")}async getAddress(){await Promise.resolve(),this.ensureConnected();const e=this.connectedAddress;if(null==e)throw new n("Wallet is not connected",r.NOT_CONNECTED);return e}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}async getPrivateKey(){return Promise.reject(new n("Private key is not accessible with external wallet providers. Use PrivateKeyProvider if you need private key access for @gala-chain operations.",r.PRIVATE_KEY_NOT_ACCESSIBLE))}getProvider(){return this.provider}}class p extends l{constructor(e){if(super(e),this.providerType="external",this.galaRawAddress=null,!e)throw new n("Gala Wallet provider is required",r.PROVIDER_NOT_AVAILABLE)}parseGalaError(e){if(e instanceof Error)try{const t=JSON.parse(e.message);if("object"==typeof t&&null!==t){const n=t,r={message:"string"==typeof n.message?n.message:e.message};return"number"==typeof n.code&&(r.code=n.code),r}return{message:e.message}}catch{return{message:e.message}}return{message:String(e)}}handleProviderError(e,t){const s=this.parseGalaError(e);if(4001===s.code)throw new n(`User rejected ${t}`,r.USER_REJECTED,e instanceof Error?e:void 0);if(4900===s.code)throw this.connectedAddress=null,new n("Wallet disconnected",r.NOT_CONNECTED,e instanceof Error?e:void 0);const i=s.message?s.message:`${t} failed`;throw new n(i,t.includes("sign")?r.SIGNING_FAILED:r.UNKNOWN,e instanceof Error?e:void 0)}ensureConnected(){if(null===this.connectedAddress||void 0===this.connectedAddress)throw new n("Wallet is not connected. Call connect() first.",r.NOT_CONNECTED)}async connect(){try{const t=await this.provider.request({method:"eth_requestAccounts"});if(null==t||0===t.length)throw new n("No accounts returned from Gala Wallet",r.CONNECTION_FAILED);const s=t[0];if(void 0===s)throw new n("No accounts returned from Gala Wallet",r.CONNECTION_FAILED);this.galaRawAddress=s;let i=s;return i.startsWith("eth|")?i=`0x${i.slice(4)}`:i.startsWith("0x")||(i=`0x${i}`),this.connectedAddress=e(i),this.connectedAddress}catch(e){if(e instanceof n)throw e;return this.handleProviderError(e,"connect")}}async disconnect(){this.connectedAddress=null,this.galaRawAddress=null,this.removeEventListeners();try{await this.provider.disconnect()}catch{}}isConnected(){return null!==this.connectedAddress}async signMessage(e){return this.ensureConnected(),u(async()=>(await this.provider.setAddress(this.galaRawAddress??this.connectedAddress),d(this.provider,this.connectedAddress,e)),(e,t)=>this.handleProviderError(e,t),"sign message")}async signTypedData(e,t,n){return this.ensureConnected(),u(async()=>(await this.provider.setAddress(this.galaRawAddress??this.connectedAddress),c(this.provider,this.connectedAddress,e,t,n)),(e,t)=>this.handleProviderError(e,t),"sign typed data")}getAddress(){return this.ensureConnected(),Promise.resolve(this.connectedAddress)}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}getPrivateKey(){throw new n("Private key is not accessible with Gala Wallet. Use PrivateKeyProvider if you need private key access for @gala-chain operations.",r.PRIVATE_KEY_NOT_ACCESSIBLE)}getProvider(){return this.provider}}class E{constructor(e){this.providerType="privateKey",this.connected=!0;try{this.wallet=new t(e)}catch(e){throw new n("Invalid private key provided",r.INVALID_CONFIG,e instanceof Error?e:void 0)}}static fromWallet(e){return new E(e.privateKey)}async signMessage(e){try{return await this.wallet.signMessage(e)}catch(e){throw new n("Failed to sign message",r.SIGNING_FAILED,e instanceof Error?e:void 0)}}async signTypedData(e,t,s){try{return await this.wallet.signTypedData(e,t,s)}catch(e){throw new n("Failed to sign typed data",r.SIGNING_FAILED,e instanceof Error?e:void 0)}}getAddress(){return Promise.resolve(e(this.wallet.address))}async getGalaAddress(){return`eth|${(await this.getAddress()).slice(2)}`}async connect(){return this.connected=!0,this.getAddress()}disconnect(){return this.connected=!1,Promise.resolve()}isConnected(){return this.connected}getPrivateKey(){return Promise.resolve(this.wallet.privateKey)}getWallet(){return this.wallet}}const g={METAMASK:"io.metamask",METAMASK_FLASK:"io.metamask.flask",COINBASE:"com.coinbase.wallet",TRUST_WALLET:"com.trustwallet.app",PHANTOM:"app.phantom",RAINBOW:"me.rainbow",OKX:"com.okex.wallet",RABBY:"io.rabby",BRAVE:"com.brave.wallet",FRAME:"sh.frame",LEDGER:"com.ledger",ZERION:"io.zerion.wallet",GALA:"com.gala.wallet"},y={[g.METAMASK]:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIxLjU0IDQuMjJsLTguMzQgNi4yMSAxLjU0LTMuNjUtLTUuNTMtMi41MXoiIGZpbGw9IiNFMjc2MUIiLz48L3N2Zz4=",[g.GALA]:"data:image/png;base64,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"};function m(){return"undefined"!=typeof window&&"function"==typeof window.dispatchEvent}function N(){if(!m())return null;return window.ethereum??null}function I(e){return"object"==typeof e&&null!==e&&"function"==typeof e.request}async function L(e=500){const t=[],n=new Map;return m()?new Promise(r=>{const s=new Set,i=e=>{const r=e,{info:i,provider:o}=r.detail;if(s.has(i.uuid))return;s.add(i.uuid);const a={id:i.rdns||i.uuid,name:i.name,rdns:i.rdns||i.uuid,icon:i.icon??y[i.rdns||""]??"",provider:o,isInjected:!1};t.push(a),n.set(a.id,a)};window.addEventListener("eip6963:announceProvider",i),window.dispatchEvent(new Event("eip6963:requestProvider")),setTimeout(()=>{if(window.removeEventListener("eip6963:announceProvider",i),0===t.length){const e=N();if(e){const r=window;let s="Browser Wallet",i="injected";r.ethereum?.isMetaMask?(s="MetaMask",i=g.METAMASK):r.ethereum?.isCoinbaseWallet?(s="Coinbase Wallet",i=g.COINBASE):r.ethereum?.isTrust&&(s="Trust Wallet",i=g.TRUST_WALLET);const o={id:i,name:s,rdns:i,icon:y[i]??"",provider:e,isInjected:!0};t.push(o),n.set(o.id,o)}}if(!n.has(g.TRUST_WALLET)){const e=function(){if(!m())return null;const e=window;if(I(e.ethereum)&&e.ethereum.isTrust)return e.ethereum;const t=e.ethereum?.providers?.find(e=>I(e)&&!0===e.isTrust);return void 0!==t?t:I(e.trustwallet)?e.trustwallet:null}();if(null!==e&&!t.some(t=>t.provider===e)){const r={id:g.TRUST_WALLET,name:"Trust Wallet",rdns:g.TRUST_WALLET,icon:y[g.TRUST_WALLET]??"",provider:e,isInjected:!0};t.push(r),n.set(r.id,r)}}const e=window;if(e.gala?.request&&!n.has(g.GALA)){const r={id:g.GALA,name:"Gala Wallet",rdns:g.GALA,icon:y[g.GALA]??"",provider:e.gala,isInjected:!0};t.push(r),n.set(r.id,r)}r({wallets:t,byId:n,hasWallets:t.length>0,...void 0===t[0]?{}:{primary:t[0]}})},e)}):{wallets:t,byId:n,hasWallets:!1}}function C(e){if(!m())return()=>{};let t=!0,n={wallets:[],byId:new Map,hasWallets:!1};const r=r=>{if(!t)return;const s=r,{info:i,provider:o}=s.detail,a=i.rdns||i.uuid;if(n.byId.has(a))return;const d={id:a,name:i.name,rdns:a,icon:i.icon??"",provider:o,isInjected:!1},c=[...n.wallets,d],l=new Map(n.byId);l.set(d.id,d),n={wallets:c,byId:l,hasWallets:!0,...void 0===c[0]?{}:{primary:c[0]}},e(n)};return window.addEventListener("eip6963:announceProvider",r),L().then(r=>{t&&(n=r,e(r))}),()=>{t=!1,window.removeEventListener("eip6963:announceProvider",r)}}async function T(e,t){return(await L(t)).byId.get(e)??null}async function O(e,t){return null!==await T(e,t)}function D(){return null!==N()}function S(e){if(null!==e.privateKey&&void 0!==e.privateKey&&e.privateKey.length>0)return new E(e.privateKey);if(null!==e.eip1193Provider&&void 0!==e.eip1193Provider)return new f(e.eip1193Provider);throw new n("Invalid wallet provider config: must provide either privateKey or eip1193Provider",r.INVALID_CONFIG)}function M(e){return E.fromWallet(e)}function P(e){return new f(e)}function W(e){return"privateKey"===e.providerType}function G(e){return"external"===e.providerType}async function R(e){if(W(e))try{return await e.getPrivateKey()}catch{return}}function U(e){if(e)return E.fromWallet(e)}function F(e){if(e&&W(e))return e.getWallet()}async function V(e){return e.isConnected()?e.getAddress():e.connect()}function b(e){return"object"==typeof e&&null!==e&&"request"in e&&"function"==typeof e.request}function B(){if("undefined"==typeof window)return null;const e=window.ethereum;return b(e)?e:null}export{f as ExternalWalletProvider,p as GalaWalletProvider,g as KNOWN_WALLET_RDNS,E as PrivateKeyProvider,n as WalletProviderError,r as WalletProviderErrorCode,P as createProviderFromEip1193,M as createProviderFromWallet,S as createWalletProvider,L as detectWallets,V as ensureConnected,B as getInjectedEip1193Provider,R as getPrivateKeyIfAvailable,T as getWalletByRdns,D as hasAnyWallet,b as isEip1193Provider,G as isExternalProvider,W as isPrivateKeyProvider,O as isWalletAvailable,F as providerToWallet,C as subscribeToWalletChanges,U as walletToProvider};
|