@starknet-io/get-starknet-wallet-standard 5.0.0-beta.0
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/LICENSE +20 -0
- package/dist/chains.cjs +44 -0
- package/dist/chains.cjs.map +1 -0
- package/dist/chains.d.cts +15 -0
- package/dist/chains.d.mts +15 -0
- package/dist/chains.d.ts +15 -0
- package/dist/chains.mjs +37 -0
- package/dist/chains.mjs.map +1 -0
- package/dist/features.cjs +21 -0
- package/dist/features.cjs.map +1 -0
- package/dist/features.d.cts +21 -0
- package/dist/features.d.mts +21 -0
- package/dist/features.d.ts +21 -0
- package/dist/features.mjs +17 -0
- package/dist/features.mjs.map +1 -0
- package/dist/index.cjs +213 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +20 -0
- package/dist/index.d.mts +20 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.mjs +211 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +60 -0
- package/src/chains.ts +46 -0
- package/src/features.ts +45 -0
- package/src/index.ts +2 -0
- package/src/injected-wallet.ts +231 -0
- package/src/wallet.ts +3 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2022 avimak
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
7
|
+
the Software without restriction, including without limitation the rights to
|
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/dist/chains.cjs
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ox = require('ox');
|
|
4
|
+
|
|
5
|
+
const STARKNET_CHAIN_PREFIX = "starknet:";
|
|
6
|
+
class StarknetChainError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "StarknetChainError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const WELL_KNOWN_STARKNET_CHAINS = [
|
|
13
|
+
"starknet:0x534e5f4d41494e",
|
|
14
|
+
// mainnet
|
|
15
|
+
"starknet:0x534e5f5345504f4c4941"
|
|
16
|
+
// sepolia
|
|
17
|
+
];
|
|
18
|
+
function isStarknetChain(chain) {
|
|
19
|
+
const parts = chain.split(":");
|
|
20
|
+
if (parts.length !== 2 || parts[0] !== "starknet") {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return ox.Hex.validate(parts[1]);
|
|
24
|
+
}
|
|
25
|
+
function formatStarknetChainId(chainId) {
|
|
26
|
+
if (!ox.Hex.validate(chainId)) {
|
|
27
|
+
throw new StarknetChainError(`Invalid Starknet chain id: ${chainId}`);
|
|
28
|
+
}
|
|
29
|
+
return `${STARKNET_CHAIN_PREFIX}${chainId}`;
|
|
30
|
+
}
|
|
31
|
+
function getStarknetChainId(chain) {
|
|
32
|
+
if (!isStarknetChain(chain)) {
|
|
33
|
+
throw new StarknetChainError(`Invalid Starknet chain: ${chain}`);
|
|
34
|
+
}
|
|
35
|
+
return chain.slice(STARKNET_CHAIN_PREFIX.length);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
exports.STARKNET_CHAIN_PREFIX = STARKNET_CHAIN_PREFIX;
|
|
39
|
+
exports.StarknetChainError = StarknetChainError;
|
|
40
|
+
exports.WELL_KNOWN_STARKNET_CHAINS = WELL_KNOWN_STARKNET_CHAINS;
|
|
41
|
+
exports.formatStarknetChainId = formatStarknetChainId;
|
|
42
|
+
exports.getStarknetChainId = getStarknetChainId;
|
|
43
|
+
exports.isStarknetChain = isStarknetChain;
|
|
44
|
+
//# sourceMappingURL=chains.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains.cjs","sources":["../src/chains.ts"],"sourcesContent":["import type { IdentifierString } from \"@wallet-standard/base\";\nimport { Hex } from \"ox\";\n\nexport type ChainId = `0x${string}`;\n\nexport const STARKNET_CHAIN_PREFIX = \"starknet:\";\n\nexport type StarknetChain = `${typeof STARKNET_CHAIN_PREFIX}${ChainId}`;\n\nexport class StarknetChainError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StarknetChainError\";\n }\n}\n\nexport const WELL_KNOWN_STARKNET_CHAINS = [\n \"starknet:0x534e5f4d41494e\", // mainnet\n \"starknet:0x534e5f5345504f4c4941\", // sepolia\n] as const satisfies StarknetChain[];\n\n/** Check if a chain identifier is a Starknet chain. */\nexport function isStarknetChain(chain: string): chain is StarknetChain {\n const parts = chain.split(\":\");\n if (parts.length !== 2 || parts[0] !== \"starknet\") {\n return false;\n }\n\n return Hex.validate(parts[1]);\n}\n\n/** Returns a `StarknetChain` from a `ChainId`. */\nexport function formatStarknetChainId(chainId: string): StarknetChain {\n if (!Hex.validate(chainId)) {\n throw new StarknetChainError(`Invalid Starknet chain id: ${chainId}`);\n }\n return `${STARKNET_CHAIN_PREFIX}${chainId}`;\n}\n\n/** Returns the 0x prefixed chain id. */\nexport function getStarknetChainId(chain: string): ChainId {\n if (!isStarknetChain(chain)) {\n throw new StarknetChainError(`Invalid Starknet chain: ${chain}`);\n }\n return chain.slice(STARKNET_CHAIN_PREFIX.length) as ChainId;\n}\n"],"names":["Hex"],"mappings":";;;;AAKO,MAAM,qBAAwB,GAAA,YAAA;AAI9B,MAAM,2BAA2B,KAAM,CAAA;AAAA,EAC5C,YAAY,OAAiB,EAAA;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AACb,IAAA,IAAA,CAAK,IAAO,GAAA,oBAAA,CAAA;AAAA,GACd;AACF,CAAA;AAEO,MAAM,0BAA6B,GAAA;AAAA,EACxC,2BAAA;AAAA;AAAA,EACA,iCAAA;AAAA;AACF,EAAA;AAGO,SAAS,gBAAgB,KAAuC,EAAA;AACrE,EAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC7B,EAAA,IAAI,MAAM,MAAW,KAAA,CAAA,IAAK,KAAM,CAAA,CAAC,MAAM,UAAY,EAAA;AACjD,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,OAAOA,MAAI,CAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA,CAAA;AAC9B,CAAA;AAGO,SAAS,sBAAsB,OAAgC,EAAA;AACpE,EAAA,IAAI,CAACA,MAAA,CAAI,QAAS,CAAA,OAAO,CAAG,EAAA;AAC1B,IAAA,MAAM,IAAI,kBAAA,CAAmB,CAA8B,2BAAA,EAAA,OAAO,CAAE,CAAA,CAAA,CAAA;AAAA,GACtE;AACA,EAAO,OAAA,CAAA,EAAG,qBAAqB,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAC3C,CAAA;AAGO,SAAS,mBAAmB,KAAwB,EAAA;AACzD,EAAI,IAAA,CAAC,eAAgB,CAAA,KAAK,CAAG,EAAA;AAC3B,IAAA,MAAM,IAAI,kBAAA,CAAmB,CAA2B,wBAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAAA;AAAA,GACjE;AACA,EAAO,OAAA,KAAA,CAAM,KAAM,CAAA,qBAAA,CAAsB,MAAM,CAAA,CAAA;AACjD;;;;;;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type ChainId = `0x${string}`;
|
|
2
|
+
declare const STARKNET_CHAIN_PREFIX = "starknet:";
|
|
3
|
+
type StarknetChain = `${typeof STARKNET_CHAIN_PREFIX}${ChainId}`;
|
|
4
|
+
declare class StarknetChainError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
declare const WELL_KNOWN_STARKNET_CHAINS: ["starknet:0x534e5f4d41494e", "starknet:0x534e5f5345504f4c4941"];
|
|
8
|
+
/** Check if a chain identifier is a Starknet chain. */
|
|
9
|
+
declare function isStarknetChain(chain: string): chain is StarknetChain;
|
|
10
|
+
/** Returns a `StarknetChain` from a `ChainId`. */
|
|
11
|
+
declare function formatStarknetChainId(chainId: string): StarknetChain;
|
|
12
|
+
/** Returns the 0x prefixed chain id. */
|
|
13
|
+
declare function getStarknetChainId(chain: string): ChainId;
|
|
14
|
+
|
|
15
|
+
export { type ChainId, STARKNET_CHAIN_PREFIX, type StarknetChain, StarknetChainError, WELL_KNOWN_STARKNET_CHAINS, formatStarknetChainId, getStarknetChainId, isStarknetChain };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type ChainId = `0x${string}`;
|
|
2
|
+
declare const STARKNET_CHAIN_PREFIX = "starknet:";
|
|
3
|
+
type StarknetChain = `${typeof STARKNET_CHAIN_PREFIX}${ChainId}`;
|
|
4
|
+
declare class StarknetChainError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
declare const WELL_KNOWN_STARKNET_CHAINS: ["starknet:0x534e5f4d41494e", "starknet:0x534e5f5345504f4c4941"];
|
|
8
|
+
/** Check if a chain identifier is a Starknet chain. */
|
|
9
|
+
declare function isStarknetChain(chain: string): chain is StarknetChain;
|
|
10
|
+
/** Returns a `StarknetChain` from a `ChainId`. */
|
|
11
|
+
declare function formatStarknetChainId(chainId: string): StarknetChain;
|
|
12
|
+
/** Returns the 0x prefixed chain id. */
|
|
13
|
+
declare function getStarknetChainId(chain: string): ChainId;
|
|
14
|
+
|
|
15
|
+
export { type ChainId, STARKNET_CHAIN_PREFIX, type StarknetChain, StarknetChainError, WELL_KNOWN_STARKNET_CHAINS, formatStarknetChainId, getStarknetChainId, isStarknetChain };
|
package/dist/chains.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type ChainId = `0x${string}`;
|
|
2
|
+
declare const STARKNET_CHAIN_PREFIX = "starknet:";
|
|
3
|
+
type StarknetChain = `${typeof STARKNET_CHAIN_PREFIX}${ChainId}`;
|
|
4
|
+
declare class StarknetChainError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
declare const WELL_KNOWN_STARKNET_CHAINS: ["starknet:0x534e5f4d41494e", "starknet:0x534e5f5345504f4c4941"];
|
|
8
|
+
/** Check if a chain identifier is a Starknet chain. */
|
|
9
|
+
declare function isStarknetChain(chain: string): chain is StarknetChain;
|
|
10
|
+
/** Returns a `StarknetChain` from a `ChainId`. */
|
|
11
|
+
declare function formatStarknetChainId(chainId: string): StarknetChain;
|
|
12
|
+
/** Returns the 0x prefixed chain id. */
|
|
13
|
+
declare function getStarknetChainId(chain: string): ChainId;
|
|
14
|
+
|
|
15
|
+
export { type ChainId, STARKNET_CHAIN_PREFIX, type StarknetChain, StarknetChainError, WELL_KNOWN_STARKNET_CHAINS, formatStarknetChainId, getStarknetChainId, isStarknetChain };
|
package/dist/chains.mjs
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Hex } from 'ox';
|
|
2
|
+
|
|
3
|
+
const STARKNET_CHAIN_PREFIX = "starknet:";
|
|
4
|
+
class StarknetChainError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "StarknetChainError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const WELL_KNOWN_STARKNET_CHAINS = [
|
|
11
|
+
"starknet:0x534e5f4d41494e",
|
|
12
|
+
// mainnet
|
|
13
|
+
"starknet:0x534e5f5345504f4c4941"
|
|
14
|
+
// sepolia
|
|
15
|
+
];
|
|
16
|
+
function isStarknetChain(chain) {
|
|
17
|
+
const parts = chain.split(":");
|
|
18
|
+
if (parts.length !== 2 || parts[0] !== "starknet") {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return Hex.validate(parts[1]);
|
|
22
|
+
}
|
|
23
|
+
function formatStarknetChainId(chainId) {
|
|
24
|
+
if (!Hex.validate(chainId)) {
|
|
25
|
+
throw new StarknetChainError(`Invalid Starknet chain id: ${chainId}`);
|
|
26
|
+
}
|
|
27
|
+
return `${STARKNET_CHAIN_PREFIX}${chainId}`;
|
|
28
|
+
}
|
|
29
|
+
function getStarknetChainId(chain) {
|
|
30
|
+
if (!isStarknetChain(chain)) {
|
|
31
|
+
throw new StarknetChainError(`Invalid Starknet chain: ${chain}`);
|
|
32
|
+
}
|
|
33
|
+
return chain.slice(STARKNET_CHAIN_PREFIX.length);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { STARKNET_CHAIN_PREFIX, StarknetChainError, WELL_KNOWN_STARKNET_CHAINS, formatStarknetChainId, getStarknetChainId, isStarknetChain };
|
|
37
|
+
//# sourceMappingURL=chains.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains.mjs","sources":["../src/chains.ts"],"sourcesContent":["import type { IdentifierString } from \"@wallet-standard/base\";\nimport { Hex } from \"ox\";\n\nexport type ChainId = `0x${string}`;\n\nexport const STARKNET_CHAIN_PREFIX = \"starknet:\";\n\nexport type StarknetChain = `${typeof STARKNET_CHAIN_PREFIX}${ChainId}`;\n\nexport class StarknetChainError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StarknetChainError\";\n }\n}\n\nexport const WELL_KNOWN_STARKNET_CHAINS = [\n \"starknet:0x534e5f4d41494e\", // mainnet\n \"starknet:0x534e5f5345504f4c4941\", // sepolia\n] as const satisfies StarknetChain[];\n\n/** Check if a chain identifier is a Starknet chain. */\nexport function isStarknetChain(chain: string): chain is StarknetChain {\n const parts = chain.split(\":\");\n if (parts.length !== 2 || parts[0] !== \"starknet\") {\n return false;\n }\n\n return Hex.validate(parts[1]);\n}\n\n/** Returns a `StarknetChain` from a `ChainId`. */\nexport function formatStarknetChainId(chainId: string): StarknetChain {\n if (!Hex.validate(chainId)) {\n throw new StarknetChainError(`Invalid Starknet chain id: ${chainId}`);\n }\n return `${STARKNET_CHAIN_PREFIX}${chainId}`;\n}\n\n/** Returns the 0x prefixed chain id. */\nexport function getStarknetChainId(chain: string): ChainId {\n if (!isStarknetChain(chain)) {\n throw new StarknetChainError(`Invalid Starknet chain: ${chain}`);\n }\n return chain.slice(STARKNET_CHAIN_PREFIX.length) as ChainId;\n}\n"],"names":[],"mappings":";;AAKO,MAAM,qBAAwB,GAAA,YAAA;AAI9B,MAAM,2BAA2B,KAAM,CAAA;AAAA,EAC5C,YAAY,OAAiB,EAAA;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AACb,IAAA,IAAA,CAAK,IAAO,GAAA,oBAAA,CAAA;AAAA,GACd;AACF,CAAA;AAEO,MAAM,0BAA6B,GAAA;AAAA,EACxC,2BAAA;AAAA;AAAA,EACA,iCAAA;AAAA;AACF,EAAA;AAGO,SAAS,gBAAgB,KAAuC,EAAA;AACrE,EAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC7B,EAAA,IAAI,MAAM,MAAW,KAAA,CAAA,IAAK,KAAM,CAAA,CAAC,MAAM,UAAY,EAAA;AACjD,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,OAAO,GAAI,CAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA,CAAA;AAC9B,CAAA;AAGO,SAAS,sBAAsB,OAAgC,EAAA;AACpE,EAAA,IAAI,CAAC,GAAA,CAAI,QAAS,CAAA,OAAO,CAAG,EAAA;AAC1B,IAAA,MAAM,IAAI,kBAAA,CAAmB,CAA8B,2BAAA,EAAA,OAAO,CAAE,CAAA,CAAA,CAAA;AAAA,GACtE;AACA,EAAO,OAAA,CAAA,EAAG,qBAAqB,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAC3C,CAAA;AAGO,SAAS,mBAAmB,KAAwB,EAAA;AACzD,EAAI,IAAA,CAAC,eAAgB,CAAA,KAAK,CAAG,EAAA;AAC3B,IAAA,MAAM,IAAI,kBAAA,CAAmB,CAA2B,wBAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAAA;AAAA,GACjE;AACA,EAAO,OAAA,KAAA,CAAM,KAAM,CAAA,qBAAA,CAAsB,MAAM,CAAA,CAAA;AACjD;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const features = require('@wallet-standard/features');
|
|
4
|
+
|
|
5
|
+
const StarknetWalletApi = "starknet:walletApi";
|
|
6
|
+
const RequiredStarknetFeatures = [
|
|
7
|
+
StarknetWalletApi,
|
|
8
|
+
features.StandardConnect,
|
|
9
|
+
features.StandardDisconnect,
|
|
10
|
+
features.StandardEvents
|
|
11
|
+
];
|
|
12
|
+
function isStarknetWallet(wallet) {
|
|
13
|
+
return RequiredStarknetFeatures.every(
|
|
14
|
+
(feature) => feature in wallet.features
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
exports.RequiredStarknetFeatures = RequiredStarknetFeatures;
|
|
19
|
+
exports.StarknetWalletApi = StarknetWalletApi;
|
|
20
|
+
exports.isStarknetWallet = isStarknetWallet;
|
|
21
|
+
//# sourceMappingURL=features.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.cjs","sources":["../src/features.ts"],"sourcesContent":["import type { RequestFn } from \"@starknet-io/types-js\";\nimport type { Wallet, WalletWithFeatures } from \"@wallet-standard/base\";\nimport {\n StandardConnect,\n StandardDisconnect,\n type StandardEventsFeature,\n type StandardConnectFeature,\n type StandardDisconnectFeature,\n StandardEvents,\n} from \"@wallet-standard/features\";\n\nexport const StarknetWalletApi = \"starknet:walletApi\";\n\nexport type StarknetWalletApiVersion = \"1.0.0\";\n\n/** A Wallet Standard feature for wallets that implement Starknet's wallet API. */\nexport type StarknetWalletRequestFeature = {\n readonly [StarknetWalletApi]: {\n readonly version: StarknetWalletApiVersion;\n readonly request: RequestFn;\n readonly walletVersion: string;\n };\n};\n\nexport type StarknetFeatures = StarknetWalletRequestFeature &\n StandardConnectFeature &\n StandardDisconnectFeature &\n StandardEventsFeature;\nexport type WalletWithStarknetFeatures = WalletWithFeatures<StarknetFeatures>;\n\nexport const RequiredStarknetFeatures = [\n StarknetWalletApi,\n StandardConnect,\n StandardDisconnect,\n StandardEvents,\n] as const satisfies (keyof StarknetFeatures)[];\n\n/** Check if a wallet is a Starknet wallet. */\nexport function isStarknetWallet(\n wallet: Wallet,\n): wallet is WalletWithStarknetFeatures {\n return RequiredStarknetFeatures.every(\n (feature) => feature in wallet.features,\n );\n}\n"],"names":["StandardConnect","StandardDisconnect","StandardEvents"],"mappings":";;;;AAWO,MAAM,iBAAoB,GAAA,qBAAA;AAmB1B,MAAM,wBAA2B,GAAA;AAAA,EACtC,iBAAA;AAAA,EACAA,wBAAA;AAAA,EACAC,2BAAA;AAAA,EACAC,uBAAA;AACF,EAAA;AAGO,SAAS,iBACd,MACsC,EAAA;AACtC,EAAA,OAAO,wBAAyB,CAAA,KAAA;AAAA,IAC9B,CAAC,OAAY,KAAA,OAAA,IAAW,MAAO,CAAA,QAAA;AAAA,GACjC,CAAA;AACF;;;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RequestFn } from '@starknet-io/types-js';
|
|
2
|
+
import { WalletWithFeatures, Wallet } from '@wallet-standard/base';
|
|
3
|
+
import { StandardConnectFeature, StandardDisconnectFeature, StandardEventsFeature } from '@wallet-standard/features';
|
|
4
|
+
|
|
5
|
+
declare const StarknetWalletApi = "starknet:walletApi";
|
|
6
|
+
type StarknetWalletApiVersion = "1.0.0";
|
|
7
|
+
/** A Wallet Standard feature for wallets that implement Starknet's wallet API. */
|
|
8
|
+
type StarknetWalletRequestFeature = {
|
|
9
|
+
readonly [StarknetWalletApi]: {
|
|
10
|
+
readonly version: StarknetWalletApiVersion;
|
|
11
|
+
readonly request: RequestFn;
|
|
12
|
+
readonly walletVersion: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
type StarknetFeatures = StarknetWalletRequestFeature & StandardConnectFeature & StandardDisconnectFeature & StandardEventsFeature;
|
|
16
|
+
type WalletWithStarknetFeatures = WalletWithFeatures<StarknetFeatures>;
|
|
17
|
+
declare const RequiredStarknetFeatures: ["starknet:walletApi", "standard:connect", "standard:disconnect", "standard:events"];
|
|
18
|
+
/** Check if a wallet is a Starknet wallet. */
|
|
19
|
+
declare function isStarknetWallet(wallet: Wallet): wallet is WalletWithStarknetFeatures;
|
|
20
|
+
|
|
21
|
+
export { RequiredStarknetFeatures, type StarknetFeatures, StarknetWalletApi, type StarknetWalletApiVersion, type StarknetWalletRequestFeature, type WalletWithStarknetFeatures, isStarknetWallet };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RequestFn } from '@starknet-io/types-js';
|
|
2
|
+
import { WalletWithFeatures, Wallet } from '@wallet-standard/base';
|
|
3
|
+
import { StandardConnectFeature, StandardDisconnectFeature, StandardEventsFeature } from '@wallet-standard/features';
|
|
4
|
+
|
|
5
|
+
declare const StarknetWalletApi = "starknet:walletApi";
|
|
6
|
+
type StarknetWalletApiVersion = "1.0.0";
|
|
7
|
+
/** A Wallet Standard feature for wallets that implement Starknet's wallet API. */
|
|
8
|
+
type StarknetWalletRequestFeature = {
|
|
9
|
+
readonly [StarknetWalletApi]: {
|
|
10
|
+
readonly version: StarknetWalletApiVersion;
|
|
11
|
+
readonly request: RequestFn;
|
|
12
|
+
readonly walletVersion: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
type StarknetFeatures = StarknetWalletRequestFeature & StandardConnectFeature & StandardDisconnectFeature & StandardEventsFeature;
|
|
16
|
+
type WalletWithStarknetFeatures = WalletWithFeatures<StarknetFeatures>;
|
|
17
|
+
declare const RequiredStarknetFeatures: ["starknet:walletApi", "standard:connect", "standard:disconnect", "standard:events"];
|
|
18
|
+
/** Check if a wallet is a Starknet wallet. */
|
|
19
|
+
declare function isStarknetWallet(wallet: Wallet): wallet is WalletWithStarknetFeatures;
|
|
20
|
+
|
|
21
|
+
export { RequiredStarknetFeatures, type StarknetFeatures, StarknetWalletApi, type StarknetWalletApiVersion, type StarknetWalletRequestFeature, type WalletWithStarknetFeatures, isStarknetWallet };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RequestFn } from '@starknet-io/types-js';
|
|
2
|
+
import { WalletWithFeatures, Wallet } from '@wallet-standard/base';
|
|
3
|
+
import { StandardConnectFeature, StandardDisconnectFeature, StandardEventsFeature } from '@wallet-standard/features';
|
|
4
|
+
|
|
5
|
+
declare const StarknetWalletApi = "starknet:walletApi";
|
|
6
|
+
type StarknetWalletApiVersion = "1.0.0";
|
|
7
|
+
/** A Wallet Standard feature for wallets that implement Starknet's wallet API. */
|
|
8
|
+
type StarknetWalletRequestFeature = {
|
|
9
|
+
readonly [StarknetWalletApi]: {
|
|
10
|
+
readonly version: StarknetWalletApiVersion;
|
|
11
|
+
readonly request: RequestFn;
|
|
12
|
+
readonly walletVersion: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
type StarknetFeatures = StarknetWalletRequestFeature & StandardConnectFeature & StandardDisconnectFeature & StandardEventsFeature;
|
|
16
|
+
type WalletWithStarknetFeatures = WalletWithFeatures<StarknetFeatures>;
|
|
17
|
+
declare const RequiredStarknetFeatures: ["starknet:walletApi", "standard:connect", "standard:disconnect", "standard:events"];
|
|
18
|
+
/** Check if a wallet is a Starknet wallet. */
|
|
19
|
+
declare function isStarknetWallet(wallet: Wallet): wallet is WalletWithStarknetFeatures;
|
|
20
|
+
|
|
21
|
+
export { RequiredStarknetFeatures, type StarknetFeatures, StarknetWalletApi, type StarknetWalletApiVersion, type StarknetWalletRequestFeature, type WalletWithStarknetFeatures, isStarknetWallet };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { StandardConnect, StandardDisconnect, StandardEvents } from '@wallet-standard/features';
|
|
2
|
+
|
|
3
|
+
const StarknetWalletApi = "starknet:walletApi";
|
|
4
|
+
const RequiredStarknetFeatures = [
|
|
5
|
+
StarknetWalletApi,
|
|
6
|
+
StandardConnect,
|
|
7
|
+
StandardDisconnect,
|
|
8
|
+
StandardEvents
|
|
9
|
+
];
|
|
10
|
+
function isStarknetWallet(wallet) {
|
|
11
|
+
return RequiredStarknetFeatures.every(
|
|
12
|
+
(feature) => feature in wallet.features
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { RequiredStarknetFeatures, StarknetWalletApi, isStarknetWallet };
|
|
17
|
+
//# sourceMappingURL=features.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.mjs","sources":["../src/features.ts"],"sourcesContent":["import type { RequestFn } from \"@starknet-io/types-js\";\nimport type { Wallet, WalletWithFeatures } from \"@wallet-standard/base\";\nimport {\n StandardConnect,\n StandardDisconnect,\n type StandardEventsFeature,\n type StandardConnectFeature,\n type StandardDisconnectFeature,\n StandardEvents,\n} from \"@wallet-standard/features\";\n\nexport const StarknetWalletApi = \"starknet:walletApi\";\n\nexport type StarknetWalletApiVersion = \"1.0.0\";\n\n/** A Wallet Standard feature for wallets that implement Starknet's wallet API. */\nexport type StarknetWalletRequestFeature = {\n readonly [StarknetWalletApi]: {\n readonly version: StarknetWalletApiVersion;\n readonly request: RequestFn;\n readonly walletVersion: string;\n };\n};\n\nexport type StarknetFeatures = StarknetWalletRequestFeature &\n StandardConnectFeature &\n StandardDisconnectFeature &\n StandardEventsFeature;\nexport type WalletWithStarknetFeatures = WalletWithFeatures<StarknetFeatures>;\n\nexport const RequiredStarknetFeatures = [\n StarknetWalletApi,\n StandardConnect,\n StandardDisconnect,\n StandardEvents,\n] as const satisfies (keyof StarknetFeatures)[];\n\n/** Check if a wallet is a Starknet wallet. */\nexport function isStarknetWallet(\n wallet: Wallet,\n): wallet is WalletWithStarknetFeatures {\n return RequiredStarknetFeatures.every(\n (feature) => feature in wallet.features,\n );\n}\n"],"names":[],"mappings":";;AAWO,MAAM,iBAAoB,GAAA,qBAAA;AAmB1B,MAAM,wBAA2B,GAAA;AAAA,EACtC,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AACF,EAAA;AAGO,SAAS,iBACd,MACsC,EAAA;AACtC,EAAA,OAAO,wBAAyB,CAAA,KAAA;AAAA,IAC9B,CAAC,OAAY,KAAA,OAAA,IAAW,MAAO,CAAA,QAAA;AAAA,GACjC,CAAA;AACF;;;;"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const features = require('@wallet-standard/features');
|
|
4
|
+
const chains = require('./chains.cjs');
|
|
5
|
+
const features$1 = require('./features.cjs');
|
|
6
|
+
require('ox');
|
|
7
|
+
|
|
8
|
+
var __accessCheck = (obj, member, msg) => {
|
|
9
|
+
if (!member.has(obj))
|
|
10
|
+
throw TypeError("Cannot " + msg);
|
|
11
|
+
};
|
|
12
|
+
var __privateGet = (obj, member, getter) => {
|
|
13
|
+
__accessCheck(obj, member, "read from private field");
|
|
14
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
15
|
+
};
|
|
16
|
+
var __privateAdd = (obj, member, value) => {
|
|
17
|
+
if (member.has(obj))
|
|
18
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
19
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
20
|
+
};
|
|
21
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
22
|
+
__accessCheck(obj, member, "write to private field");
|
|
23
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
24
|
+
return value;
|
|
25
|
+
};
|
|
26
|
+
var __privateMethod = (obj, member, method) => {
|
|
27
|
+
__accessCheck(obj, member, "access private method");
|
|
28
|
+
return method;
|
|
29
|
+
};
|
|
30
|
+
var _listeners, _account, _connect, _disconnect, _on, _emit, emit_fn, _off, off_fn, _disconnected, disconnected_fn, _onAccountsChanged, onAccountsChanged_fn, _onNetworkChanged, onNetworkChanged_fn, _updateAccount, updateAccount_fn, _request, request_fn, _getStarknetChain, getStarknetChain_fn;
|
|
31
|
+
class StarknetInjectedWallet {
|
|
32
|
+
constructor(injected) {
|
|
33
|
+
this.injected = injected;
|
|
34
|
+
__privateAdd(this, _emit);
|
|
35
|
+
__privateAdd(this, _off);
|
|
36
|
+
__privateAdd(this, _disconnected);
|
|
37
|
+
__privateAdd(this, _onAccountsChanged);
|
|
38
|
+
__privateAdd(this, _onNetworkChanged);
|
|
39
|
+
__privateAdd(this, _updateAccount);
|
|
40
|
+
__privateAdd(this, _request);
|
|
41
|
+
__privateAdd(this, _getStarknetChain);
|
|
42
|
+
__privateAdd(this, _listeners, {});
|
|
43
|
+
__privateAdd(this, _account, null);
|
|
44
|
+
__privateAdd(this, _connect, async ({ silent }) => {
|
|
45
|
+
if (!__privateGet(this, _account)) {
|
|
46
|
+
const accounts = await this.injected.request({
|
|
47
|
+
type: "wallet_requestAccounts",
|
|
48
|
+
params: {
|
|
49
|
+
silent_mode: silent
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
if (accounts.length === 0) {
|
|
53
|
+
return { accounts: [] };
|
|
54
|
+
}
|
|
55
|
+
await __privateMethod(this, _updateAccount, updateAccount_fn).call(this, accounts);
|
|
56
|
+
}
|
|
57
|
+
return { accounts: this.accounts };
|
|
58
|
+
});
|
|
59
|
+
__privateAdd(this, _disconnect, async () => {
|
|
60
|
+
__privateMethod(this, _disconnected, disconnected_fn).call(this);
|
|
61
|
+
});
|
|
62
|
+
__privateAdd(this, _on, (event, listener) => {
|
|
63
|
+
if (!__privateGet(this, _listeners)[event]) {
|
|
64
|
+
__privateGet(this, _listeners)[event] = [];
|
|
65
|
+
}
|
|
66
|
+
__privateGet(this, _listeners)[event].push(listener);
|
|
67
|
+
return () => __privateMethod(this, _off, off_fn).call(this, event, listener);
|
|
68
|
+
});
|
|
69
|
+
this.injected.on("accountsChanged", __privateMethod(this, _onAccountsChanged, onAccountsChanged_fn).bind(this));
|
|
70
|
+
this.injected.on("networkChanged", __privateMethod(this, _onNetworkChanged, onNetworkChanged_fn).bind(this));
|
|
71
|
+
}
|
|
72
|
+
get version() {
|
|
73
|
+
return "1.0.0";
|
|
74
|
+
}
|
|
75
|
+
get name() {
|
|
76
|
+
return this.injected.name;
|
|
77
|
+
}
|
|
78
|
+
get icon() {
|
|
79
|
+
if (typeof this.injected.icon === "string") {
|
|
80
|
+
return this.injected.icon;
|
|
81
|
+
}
|
|
82
|
+
return this.injected.icon.light;
|
|
83
|
+
}
|
|
84
|
+
get features() {
|
|
85
|
+
return {
|
|
86
|
+
[features.StandardConnect]: {
|
|
87
|
+
version: "1.0.0",
|
|
88
|
+
connect: __privateGet(this, _connect).bind(this)
|
|
89
|
+
},
|
|
90
|
+
[features.StandardDisconnect]: {
|
|
91
|
+
version: "1.0.0",
|
|
92
|
+
disconnect: __privateGet(this, _disconnect).bind(this)
|
|
93
|
+
},
|
|
94
|
+
[features.StandardEvents]: {
|
|
95
|
+
version: "1.0.0",
|
|
96
|
+
on: __privateGet(this, _on).bind(this)
|
|
97
|
+
},
|
|
98
|
+
[features$1.StarknetWalletApi]: {
|
|
99
|
+
version: "1.0.0",
|
|
100
|
+
request: __privateMethod(this, _request, request_fn).bind(this),
|
|
101
|
+
walletVersion: this.injected.version
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
get chains() {
|
|
106
|
+
return chains.WELL_KNOWN_STARKNET_CHAINS.slice();
|
|
107
|
+
}
|
|
108
|
+
get accounts() {
|
|
109
|
+
if (__privateGet(this, _account)) {
|
|
110
|
+
return [
|
|
111
|
+
{
|
|
112
|
+
address: __privateGet(this, _account).address,
|
|
113
|
+
publicKey: new Uint8Array(),
|
|
114
|
+
chains: [__privateGet(this, _account).chain],
|
|
115
|
+
features: []
|
|
116
|
+
}
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
_listeners = new WeakMap();
|
|
123
|
+
_account = new WeakMap();
|
|
124
|
+
_connect = new WeakMap();
|
|
125
|
+
_disconnect = new WeakMap();
|
|
126
|
+
_on = new WeakMap();
|
|
127
|
+
_emit = new WeakSet();
|
|
128
|
+
emit_fn = function(event, ...args) {
|
|
129
|
+
if (!__privateGet(this, _listeners)[event])
|
|
130
|
+
return;
|
|
131
|
+
for (const listener of __privateGet(this, _listeners)[event]) {
|
|
132
|
+
listener.apply(null, args);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
_off = new WeakSet();
|
|
136
|
+
off_fn = function(event, listener) {
|
|
137
|
+
__privateGet(this, _listeners)[event] = __privateGet(this, _listeners)[event]?.filter(
|
|
138
|
+
(existingListener) => listener !== existingListener
|
|
139
|
+
);
|
|
140
|
+
};
|
|
141
|
+
_disconnected = new WeakSet();
|
|
142
|
+
disconnected_fn = function() {
|
|
143
|
+
if (__privateGet(this, _account)) {
|
|
144
|
+
__privateSet(this, _account, null);
|
|
145
|
+
__privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
_onAccountsChanged = new WeakSet();
|
|
149
|
+
onAccountsChanged_fn = async function(accounts) {
|
|
150
|
+
if (!accounts || accounts.length === 0) {
|
|
151
|
+
__privateMethod(this, _disconnected, disconnected_fn).call(this);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (!__privateGet(this, _account)) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
await __privateMethod(this, _updateAccount, updateAccount_fn).call(this, accounts);
|
|
158
|
+
};
|
|
159
|
+
_onNetworkChanged = new WeakSet();
|
|
160
|
+
onNetworkChanged_fn = function(chainId, accounts) {
|
|
161
|
+
if (!chainId) {
|
|
162
|
+
__privateMethod(this, _disconnected, disconnected_fn).call(this);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (!__privateGet(this, _account)) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const chain = chains.formatStarknetChainId(chainId);
|
|
169
|
+
if (!chains.isStarknetChain(chain)) {
|
|
170
|
+
throw new Error(`Invalid Starknet chain: ${chain}`);
|
|
171
|
+
}
|
|
172
|
+
if (accounts?.length > 0) {
|
|
173
|
+
const [account] = accounts;
|
|
174
|
+
__privateSet(this, _account, { address: account, chain });
|
|
175
|
+
__privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
|
|
176
|
+
} else {
|
|
177
|
+
__privateSet(this, _account, { address: __privateGet(this, _account)?.address, chain });
|
|
178
|
+
__privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
_updateAccount = new WeakSet();
|
|
182
|
+
updateAccount_fn = async function(accounts) {
|
|
183
|
+
if (accounts.length === 0) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const [account] = accounts;
|
|
187
|
+
if (__privateGet(this, _account)?.chain) {
|
|
188
|
+
__privateGet(this, _account).address = account;
|
|
189
|
+
__privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
|
|
190
|
+
} else {
|
|
191
|
+
const chain = await __privateMethod(this, _getStarknetChain, getStarknetChain_fn).call(this);
|
|
192
|
+
__privateSet(this, _account, { address: account, chain });
|
|
193
|
+
__privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
_request = new WeakSet();
|
|
197
|
+
request_fn = function(...args) {
|
|
198
|
+
return this.injected.request(...args);
|
|
199
|
+
};
|
|
200
|
+
_getStarknetChain = new WeakSet();
|
|
201
|
+
getStarknetChain_fn = async function() {
|
|
202
|
+
const chainId = await this.injected.request({
|
|
203
|
+
type: "wallet_requestChainId"
|
|
204
|
+
});
|
|
205
|
+
const chain = chains.formatStarknetChainId(chainId);
|
|
206
|
+
if (!chains.isStarknetChain(chain)) {
|
|
207
|
+
throw new Error(`Invalid Starknet chain: ${chain}`);
|
|
208
|
+
}
|
|
209
|
+
return chain;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
exports.StarknetInjectedWallet = StarknetInjectedWallet;
|
|
213
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/injected-wallet.ts"],"sourcesContent":["import type { RequestFn, StarknetWindowObject } from \"@starknet-io/types-js\";\nimport type { Wallet } from \"@wallet-standard/base\";\nimport {\n StandardConnect,\n type StandardConnectMethod,\n StandardDisconnect,\n type StandardDisconnectMethod,\n StandardEvents,\n type StandardEventsListeners,\n type StandardEventsNames,\n type StandardEventsOnMethod,\n} from \"@wallet-standard/features\";\n\nimport {\n formatStarknetChainId,\n isStarknetChain,\n type StarknetChain,\n WELL_KNOWN_STARKNET_CHAINS,\n} from \"./chains\";\nimport {\n type StarknetFeatures,\n StarknetWalletApi,\n type WalletWithStarknetFeatures,\n} from \"./features\";\nimport type { StarknetWalletAccount } from \"./wallet\";\n\nexport class StarknetInjectedWallet implements WalletWithStarknetFeatures {\n #listeners: { [E in StandardEventsNames]?: StandardEventsListeners[E][] } =\n {};\n #account: { address: string; chain: StarknetChain } | null = null;\n\n constructor(private readonly injected: StarknetWindowObject) {\n this.injected.on(\"accountsChanged\", this.#onAccountsChanged.bind(this));\n this.injected.on(\"networkChanged\", this.#onNetworkChanged.bind(this));\n }\n\n get version() {\n return \"1.0.0\" as const;\n }\n\n get name() {\n return this.injected.name;\n }\n\n get icon() {\n if (typeof this.injected.icon === \"string\") {\n return this.injected.icon as Wallet[\"icon\"];\n }\n\n return this.injected.icon.light as Wallet[\"icon\"];\n }\n\n get features(): StarknetFeatures {\n return {\n [StandardConnect]: {\n version: \"1.0.0\" as const,\n connect: this.#connect.bind(this),\n },\n [StandardDisconnect]: {\n version: \"1.0.0\" as const,\n disconnect: this.#disconnect.bind(this),\n },\n [StandardEvents]: {\n version: \"1.0.0\" as const,\n on: this.#on.bind(this),\n },\n [StarknetWalletApi]: {\n version: \"1.0.0\" as const,\n request: this.#request.bind(this),\n walletVersion: this.injected.version,\n },\n };\n }\n\n get chains() {\n return WELL_KNOWN_STARKNET_CHAINS.slice();\n }\n\n get accounts(): StarknetWalletAccount[] {\n if (this.#account) {\n return [\n {\n address: this.#account.address,\n publicKey: new Uint8Array(),\n chains: [this.#account.chain],\n features: [],\n },\n ];\n }\n\n return [];\n }\n\n #connect: StandardConnectMethod = async ({ silent }) => {\n if (!this.#account) {\n const accounts = await this.injected.request({\n type: \"wallet_requestAccounts\",\n params: {\n silent_mode: silent,\n },\n });\n\n // TODO(fra): maybe we should throw an error here?\n // User rejected the request.\n if (accounts.length === 0) {\n return { accounts: [] };\n }\n\n await this.#updateAccount(accounts);\n }\n\n return { accounts: this.accounts };\n };\n\n #disconnect: StandardDisconnectMethod = async () => {\n this.#disconnected();\n };\n\n #on: StandardEventsOnMethod = (event, listener) => {\n if (!this.#listeners[event]) {\n this.#listeners[event] = [];\n }\n\n this.#listeners[event].push(listener);\n\n return (): void => this.#off(event, listener);\n };\n\n #emit<E extends StandardEventsNames>(\n event: E,\n ...args: Parameters<StandardEventsListeners[E]>\n ): void {\n if (!this.#listeners[event]) return;\n\n for (const listener of this.#listeners[event]) {\n listener.apply(null, args);\n }\n }\n\n #off<E extends StandardEventsNames>(\n event: E,\n listener: StandardEventsListeners[E],\n ): void {\n this.#listeners[event] = this.#listeners[event]?.filter(\n (existingListener) => listener !== existingListener,\n );\n }\n\n #disconnected() {\n if (this.#account) {\n this.#account = null;\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n\n async #onAccountsChanged(accounts: string[]) {\n if (!accounts || accounts.length === 0) {\n this.#disconnected();\n return;\n }\n\n if (!this.#account) {\n return;\n }\n\n await this.#updateAccount(accounts);\n }\n\n #onNetworkChanged(chainId?: string, accounts?: string[]) {\n if (!chainId) {\n this.#disconnected();\n return;\n }\n\n if (!this.#account) {\n return;\n }\n\n const chain = formatStarknetChainId(chainId);\n\n if (!isStarknetChain(chain)) {\n throw new Error(`Invalid Starknet chain: ${chain}`);\n }\n\n // Some wallets (like Keplr) don't provide accounts on network change.\n if (accounts?.length > 0) {\n const [account] = accounts;\n\n this.#account = { address: account, chain };\n this.#emit(\"change\", { accounts: this.accounts });\n } else {\n this.#account = { address: this.#account?.address, chain };\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n\n async #updateAccount(accounts: string[]) {\n if (accounts.length === 0) {\n return;\n }\n\n const [account] = accounts;\n\n if (this.#account?.chain) {\n // Only account changed. No need to make a request for the chain id.\n this.#account.address = account;\n this.#emit(\"change\", { accounts: this.accounts });\n } else {\n const chain = await this.#getStarknetChain();\n this.#account = { address: account, chain };\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n\n #request(...args: Parameters<RequestFn>): ReturnType<RequestFn> {\n return this.injected.request(...args);\n }\n\n async #getStarknetChain(): Promise<StarknetChain> {\n const chainId = await this.injected.request({\n type: \"wallet_requestChainId\",\n });\n const chain = formatStarknetChainId(chainId);\n\n if (!isStarknetChain(chain)) {\n throw new Error(`Invalid Starknet chain: ${chain}`);\n }\n\n return chain;\n }\n}\n"],"names":["StandardConnect","StandardDisconnect","StandardEvents","StarknetWalletApi","WELL_KNOWN_STARKNET_CHAINS","formatStarknetChainId","isStarknetChain"],"mappings":"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"}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { StarknetWindowObject } from '@starknet-io/types-js';
|
|
2
|
+
import { WalletWithStarknetFeatures, StarknetFeatures } from './features.cjs';
|
|
3
|
+
import { WalletAccount } from '@wallet-standard/base';
|
|
4
|
+
import '@wallet-standard/features';
|
|
5
|
+
|
|
6
|
+
type StarknetWalletAccount = WalletAccount;
|
|
7
|
+
|
|
8
|
+
declare class StarknetInjectedWallet implements WalletWithStarknetFeatures {
|
|
9
|
+
#private;
|
|
10
|
+
private readonly injected;
|
|
11
|
+
constructor(injected: StarknetWindowObject);
|
|
12
|
+
get version(): "1.0.0";
|
|
13
|
+
get name(): string;
|
|
14
|
+
get icon(): `data:image/svg+xml;base64,${string}` | `data:image/webp;base64,${string}` | `data:image/png;base64,${string}` | `data:image/gif;base64,${string}`;
|
|
15
|
+
get features(): StarknetFeatures;
|
|
16
|
+
get chains(): ("starknet:0x534e5f4d41494e" | "starknet:0x534e5f5345504f4c4941")[];
|
|
17
|
+
get accounts(): StarknetWalletAccount[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { StarknetInjectedWallet, type StarknetWalletAccount };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { StarknetWindowObject } from '@starknet-io/types-js';
|
|
2
|
+
import { WalletWithStarknetFeatures, StarknetFeatures } from './features.mjs';
|
|
3
|
+
import { WalletAccount } from '@wallet-standard/base';
|
|
4
|
+
import '@wallet-standard/features';
|
|
5
|
+
|
|
6
|
+
type StarknetWalletAccount = WalletAccount;
|
|
7
|
+
|
|
8
|
+
declare class StarknetInjectedWallet implements WalletWithStarknetFeatures {
|
|
9
|
+
#private;
|
|
10
|
+
private readonly injected;
|
|
11
|
+
constructor(injected: StarknetWindowObject);
|
|
12
|
+
get version(): "1.0.0";
|
|
13
|
+
get name(): string;
|
|
14
|
+
get icon(): `data:image/svg+xml;base64,${string}` | `data:image/webp;base64,${string}` | `data:image/png;base64,${string}` | `data:image/gif;base64,${string}`;
|
|
15
|
+
get features(): StarknetFeatures;
|
|
16
|
+
get chains(): ("starknet:0x534e5f4d41494e" | "starknet:0x534e5f5345504f4c4941")[];
|
|
17
|
+
get accounts(): StarknetWalletAccount[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { StarknetInjectedWallet, type StarknetWalletAccount };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { StarknetWindowObject } from '@starknet-io/types-js';
|
|
2
|
+
import { WalletWithStarknetFeatures, StarknetFeatures } from './features.js';
|
|
3
|
+
import { WalletAccount } from '@wallet-standard/base';
|
|
4
|
+
import '@wallet-standard/features';
|
|
5
|
+
|
|
6
|
+
type StarknetWalletAccount = WalletAccount;
|
|
7
|
+
|
|
8
|
+
declare class StarknetInjectedWallet implements WalletWithStarknetFeatures {
|
|
9
|
+
#private;
|
|
10
|
+
private readonly injected;
|
|
11
|
+
constructor(injected: StarknetWindowObject);
|
|
12
|
+
get version(): "1.0.0";
|
|
13
|
+
get name(): string;
|
|
14
|
+
get icon(): `data:image/svg+xml;base64,${string}` | `data:image/webp;base64,${string}` | `data:image/png;base64,${string}` | `data:image/gif;base64,${string}`;
|
|
15
|
+
get features(): StarknetFeatures;
|
|
16
|
+
get chains(): ("starknet:0x534e5f4d41494e" | "starknet:0x534e5f5345504f4c4941")[];
|
|
17
|
+
get accounts(): StarknetWalletAccount[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { StarknetInjectedWallet, type StarknetWalletAccount };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { StandardConnect, StandardDisconnect, StandardEvents } from '@wallet-standard/features';
|
|
2
|
+
import { WELL_KNOWN_STARKNET_CHAINS, formatStarknetChainId, isStarknetChain } from './chains.mjs';
|
|
3
|
+
import { StarknetWalletApi } from './features.mjs';
|
|
4
|
+
import 'ox';
|
|
5
|
+
|
|
6
|
+
var __accessCheck = (obj, member, msg) => {
|
|
7
|
+
if (!member.has(obj))
|
|
8
|
+
throw TypeError("Cannot " + msg);
|
|
9
|
+
};
|
|
10
|
+
var __privateGet = (obj, member, getter) => {
|
|
11
|
+
__accessCheck(obj, member, "read from private field");
|
|
12
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
13
|
+
};
|
|
14
|
+
var __privateAdd = (obj, member, value) => {
|
|
15
|
+
if (member.has(obj))
|
|
16
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
17
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
18
|
+
};
|
|
19
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
20
|
+
__accessCheck(obj, member, "write to private field");
|
|
21
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
22
|
+
return value;
|
|
23
|
+
};
|
|
24
|
+
var __privateMethod = (obj, member, method) => {
|
|
25
|
+
__accessCheck(obj, member, "access private method");
|
|
26
|
+
return method;
|
|
27
|
+
};
|
|
28
|
+
var _listeners, _account, _connect, _disconnect, _on, _emit, emit_fn, _off, off_fn, _disconnected, disconnected_fn, _onAccountsChanged, onAccountsChanged_fn, _onNetworkChanged, onNetworkChanged_fn, _updateAccount, updateAccount_fn, _request, request_fn, _getStarknetChain, getStarknetChain_fn;
|
|
29
|
+
class StarknetInjectedWallet {
|
|
30
|
+
constructor(injected) {
|
|
31
|
+
this.injected = injected;
|
|
32
|
+
__privateAdd(this, _emit);
|
|
33
|
+
__privateAdd(this, _off);
|
|
34
|
+
__privateAdd(this, _disconnected);
|
|
35
|
+
__privateAdd(this, _onAccountsChanged);
|
|
36
|
+
__privateAdd(this, _onNetworkChanged);
|
|
37
|
+
__privateAdd(this, _updateAccount);
|
|
38
|
+
__privateAdd(this, _request);
|
|
39
|
+
__privateAdd(this, _getStarknetChain);
|
|
40
|
+
__privateAdd(this, _listeners, {});
|
|
41
|
+
__privateAdd(this, _account, null);
|
|
42
|
+
__privateAdd(this, _connect, async ({ silent }) => {
|
|
43
|
+
if (!__privateGet(this, _account)) {
|
|
44
|
+
const accounts = await this.injected.request({
|
|
45
|
+
type: "wallet_requestAccounts",
|
|
46
|
+
params: {
|
|
47
|
+
silent_mode: silent
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
if (accounts.length === 0) {
|
|
51
|
+
return { accounts: [] };
|
|
52
|
+
}
|
|
53
|
+
await __privateMethod(this, _updateAccount, updateAccount_fn).call(this, accounts);
|
|
54
|
+
}
|
|
55
|
+
return { accounts: this.accounts };
|
|
56
|
+
});
|
|
57
|
+
__privateAdd(this, _disconnect, async () => {
|
|
58
|
+
__privateMethod(this, _disconnected, disconnected_fn).call(this);
|
|
59
|
+
});
|
|
60
|
+
__privateAdd(this, _on, (event, listener) => {
|
|
61
|
+
if (!__privateGet(this, _listeners)[event]) {
|
|
62
|
+
__privateGet(this, _listeners)[event] = [];
|
|
63
|
+
}
|
|
64
|
+
__privateGet(this, _listeners)[event].push(listener);
|
|
65
|
+
return () => __privateMethod(this, _off, off_fn).call(this, event, listener);
|
|
66
|
+
});
|
|
67
|
+
this.injected.on("accountsChanged", __privateMethod(this, _onAccountsChanged, onAccountsChanged_fn).bind(this));
|
|
68
|
+
this.injected.on("networkChanged", __privateMethod(this, _onNetworkChanged, onNetworkChanged_fn).bind(this));
|
|
69
|
+
}
|
|
70
|
+
get version() {
|
|
71
|
+
return "1.0.0";
|
|
72
|
+
}
|
|
73
|
+
get name() {
|
|
74
|
+
return this.injected.name;
|
|
75
|
+
}
|
|
76
|
+
get icon() {
|
|
77
|
+
if (typeof this.injected.icon === "string") {
|
|
78
|
+
return this.injected.icon;
|
|
79
|
+
}
|
|
80
|
+
return this.injected.icon.light;
|
|
81
|
+
}
|
|
82
|
+
get features() {
|
|
83
|
+
return {
|
|
84
|
+
[StandardConnect]: {
|
|
85
|
+
version: "1.0.0",
|
|
86
|
+
connect: __privateGet(this, _connect).bind(this)
|
|
87
|
+
},
|
|
88
|
+
[StandardDisconnect]: {
|
|
89
|
+
version: "1.0.0",
|
|
90
|
+
disconnect: __privateGet(this, _disconnect).bind(this)
|
|
91
|
+
},
|
|
92
|
+
[StandardEvents]: {
|
|
93
|
+
version: "1.0.0",
|
|
94
|
+
on: __privateGet(this, _on).bind(this)
|
|
95
|
+
},
|
|
96
|
+
[StarknetWalletApi]: {
|
|
97
|
+
version: "1.0.0",
|
|
98
|
+
request: __privateMethod(this, _request, request_fn).bind(this),
|
|
99
|
+
walletVersion: this.injected.version
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
get chains() {
|
|
104
|
+
return WELL_KNOWN_STARKNET_CHAINS.slice();
|
|
105
|
+
}
|
|
106
|
+
get accounts() {
|
|
107
|
+
if (__privateGet(this, _account)) {
|
|
108
|
+
return [
|
|
109
|
+
{
|
|
110
|
+
address: __privateGet(this, _account).address,
|
|
111
|
+
publicKey: new Uint8Array(),
|
|
112
|
+
chains: [__privateGet(this, _account).chain],
|
|
113
|
+
features: []
|
|
114
|
+
}
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
_listeners = new WeakMap();
|
|
121
|
+
_account = new WeakMap();
|
|
122
|
+
_connect = new WeakMap();
|
|
123
|
+
_disconnect = new WeakMap();
|
|
124
|
+
_on = new WeakMap();
|
|
125
|
+
_emit = new WeakSet();
|
|
126
|
+
emit_fn = function(event, ...args) {
|
|
127
|
+
if (!__privateGet(this, _listeners)[event])
|
|
128
|
+
return;
|
|
129
|
+
for (const listener of __privateGet(this, _listeners)[event]) {
|
|
130
|
+
listener.apply(null, args);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
_off = new WeakSet();
|
|
134
|
+
off_fn = function(event, listener) {
|
|
135
|
+
__privateGet(this, _listeners)[event] = __privateGet(this, _listeners)[event]?.filter(
|
|
136
|
+
(existingListener) => listener !== existingListener
|
|
137
|
+
);
|
|
138
|
+
};
|
|
139
|
+
_disconnected = new WeakSet();
|
|
140
|
+
disconnected_fn = function() {
|
|
141
|
+
if (__privateGet(this, _account)) {
|
|
142
|
+
__privateSet(this, _account, null);
|
|
143
|
+
__privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
_onAccountsChanged = new WeakSet();
|
|
147
|
+
onAccountsChanged_fn = async function(accounts) {
|
|
148
|
+
if (!accounts || accounts.length === 0) {
|
|
149
|
+
__privateMethod(this, _disconnected, disconnected_fn).call(this);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (!__privateGet(this, _account)) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
await __privateMethod(this, _updateAccount, updateAccount_fn).call(this, accounts);
|
|
156
|
+
};
|
|
157
|
+
_onNetworkChanged = new WeakSet();
|
|
158
|
+
onNetworkChanged_fn = function(chainId, accounts) {
|
|
159
|
+
if (!chainId) {
|
|
160
|
+
__privateMethod(this, _disconnected, disconnected_fn).call(this);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (!__privateGet(this, _account)) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const chain = formatStarknetChainId(chainId);
|
|
167
|
+
if (!isStarknetChain(chain)) {
|
|
168
|
+
throw new Error(`Invalid Starknet chain: ${chain}`);
|
|
169
|
+
}
|
|
170
|
+
if (accounts?.length > 0) {
|
|
171
|
+
const [account] = accounts;
|
|
172
|
+
__privateSet(this, _account, { address: account, chain });
|
|
173
|
+
__privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
|
|
174
|
+
} else {
|
|
175
|
+
__privateSet(this, _account, { address: __privateGet(this, _account)?.address, chain });
|
|
176
|
+
__privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
_updateAccount = new WeakSet();
|
|
180
|
+
updateAccount_fn = async function(accounts) {
|
|
181
|
+
if (accounts.length === 0) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const [account] = accounts;
|
|
185
|
+
if (__privateGet(this, _account)?.chain) {
|
|
186
|
+
__privateGet(this, _account).address = account;
|
|
187
|
+
__privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
|
|
188
|
+
} else {
|
|
189
|
+
const chain = await __privateMethod(this, _getStarknetChain, getStarknetChain_fn).call(this);
|
|
190
|
+
__privateSet(this, _account, { address: account, chain });
|
|
191
|
+
__privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
_request = new WeakSet();
|
|
195
|
+
request_fn = function(...args) {
|
|
196
|
+
return this.injected.request(...args);
|
|
197
|
+
};
|
|
198
|
+
_getStarknetChain = new WeakSet();
|
|
199
|
+
getStarknetChain_fn = async function() {
|
|
200
|
+
const chainId = await this.injected.request({
|
|
201
|
+
type: "wallet_requestChainId"
|
|
202
|
+
});
|
|
203
|
+
const chain = formatStarknetChainId(chainId);
|
|
204
|
+
if (!isStarknetChain(chain)) {
|
|
205
|
+
throw new Error(`Invalid Starknet chain: ${chain}`);
|
|
206
|
+
}
|
|
207
|
+
return chain;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
export { StarknetInjectedWallet };
|
|
211
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/injected-wallet.ts"],"sourcesContent":["import type { RequestFn, StarknetWindowObject } from \"@starknet-io/types-js\";\nimport type { Wallet } from \"@wallet-standard/base\";\nimport {\n StandardConnect,\n type StandardConnectMethod,\n StandardDisconnect,\n type StandardDisconnectMethod,\n StandardEvents,\n type StandardEventsListeners,\n type StandardEventsNames,\n type StandardEventsOnMethod,\n} from \"@wallet-standard/features\";\n\nimport {\n formatStarknetChainId,\n isStarknetChain,\n type StarknetChain,\n WELL_KNOWN_STARKNET_CHAINS,\n} from \"./chains\";\nimport {\n type StarknetFeatures,\n StarknetWalletApi,\n type WalletWithStarknetFeatures,\n} from \"./features\";\nimport type { StarknetWalletAccount } from \"./wallet\";\n\nexport class StarknetInjectedWallet implements WalletWithStarknetFeatures {\n #listeners: { [E in StandardEventsNames]?: StandardEventsListeners[E][] } =\n {};\n #account: { address: string; chain: StarknetChain } | null = null;\n\n constructor(private readonly injected: StarknetWindowObject) {\n this.injected.on(\"accountsChanged\", this.#onAccountsChanged.bind(this));\n this.injected.on(\"networkChanged\", this.#onNetworkChanged.bind(this));\n }\n\n get version() {\n return \"1.0.0\" as const;\n }\n\n get name() {\n return this.injected.name;\n }\n\n get icon() {\n if (typeof this.injected.icon === \"string\") {\n return this.injected.icon as Wallet[\"icon\"];\n }\n\n return this.injected.icon.light as Wallet[\"icon\"];\n }\n\n get features(): StarknetFeatures {\n return {\n [StandardConnect]: {\n version: \"1.0.0\" as const,\n connect: this.#connect.bind(this),\n },\n [StandardDisconnect]: {\n version: \"1.0.0\" as const,\n disconnect: this.#disconnect.bind(this),\n },\n [StandardEvents]: {\n version: \"1.0.0\" as const,\n on: this.#on.bind(this),\n },\n [StarknetWalletApi]: {\n version: \"1.0.0\" as const,\n request: this.#request.bind(this),\n walletVersion: this.injected.version,\n },\n };\n }\n\n get chains() {\n return WELL_KNOWN_STARKNET_CHAINS.slice();\n }\n\n get accounts(): StarknetWalletAccount[] {\n if (this.#account) {\n return [\n {\n address: this.#account.address,\n publicKey: new Uint8Array(),\n chains: [this.#account.chain],\n features: [],\n },\n ];\n }\n\n return [];\n }\n\n #connect: StandardConnectMethod = async ({ silent }) => {\n if (!this.#account) {\n const accounts = await this.injected.request({\n type: \"wallet_requestAccounts\",\n params: {\n silent_mode: silent,\n },\n });\n\n // TODO(fra): maybe we should throw an error here?\n // User rejected the request.\n if (accounts.length === 0) {\n return { accounts: [] };\n }\n\n await this.#updateAccount(accounts);\n }\n\n return { accounts: this.accounts };\n };\n\n #disconnect: StandardDisconnectMethod = async () => {\n this.#disconnected();\n };\n\n #on: StandardEventsOnMethod = (event, listener) => {\n if (!this.#listeners[event]) {\n this.#listeners[event] = [];\n }\n\n this.#listeners[event].push(listener);\n\n return (): void => this.#off(event, listener);\n };\n\n #emit<E extends StandardEventsNames>(\n event: E,\n ...args: Parameters<StandardEventsListeners[E]>\n ): void {\n if (!this.#listeners[event]) return;\n\n for (const listener of this.#listeners[event]) {\n listener.apply(null, args);\n }\n }\n\n #off<E extends StandardEventsNames>(\n event: E,\n listener: StandardEventsListeners[E],\n ): void {\n this.#listeners[event] = this.#listeners[event]?.filter(\n (existingListener) => listener !== existingListener,\n );\n }\n\n #disconnected() {\n if (this.#account) {\n this.#account = null;\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n\n async #onAccountsChanged(accounts: string[]) {\n if (!accounts || accounts.length === 0) {\n this.#disconnected();\n return;\n }\n\n if (!this.#account) {\n return;\n }\n\n await this.#updateAccount(accounts);\n }\n\n #onNetworkChanged(chainId?: string, accounts?: string[]) {\n if (!chainId) {\n this.#disconnected();\n return;\n }\n\n if (!this.#account) {\n return;\n }\n\n const chain = formatStarknetChainId(chainId);\n\n if (!isStarknetChain(chain)) {\n throw new Error(`Invalid Starknet chain: ${chain}`);\n }\n\n // Some wallets (like Keplr) don't provide accounts on network change.\n if (accounts?.length > 0) {\n const [account] = accounts;\n\n this.#account = { address: account, chain };\n this.#emit(\"change\", { accounts: this.accounts });\n } else {\n this.#account = { address: this.#account?.address, chain };\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n\n async #updateAccount(accounts: string[]) {\n if (accounts.length === 0) {\n return;\n }\n\n const [account] = accounts;\n\n if (this.#account?.chain) {\n // Only account changed. No need to make a request for the chain id.\n this.#account.address = account;\n this.#emit(\"change\", { accounts: this.accounts });\n } else {\n const chain = await this.#getStarknetChain();\n this.#account = { address: account, chain };\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n\n #request(...args: Parameters<RequestFn>): ReturnType<RequestFn> {\n return this.injected.request(...args);\n }\n\n async #getStarknetChain(): Promise<StarknetChain> {\n const chainId = await this.injected.request({\n type: \"wallet_requestChainId\",\n });\n const chain = formatStarknetChainId(chainId);\n\n if (!isStarknetChain(chain)) {\n throw new Error(`Invalid Starknet chain: ${chain}`);\n }\n\n return chain;\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@starknet-io/get-starknet-wallet-standard",
|
|
3
|
+
"version": "5.0.0-beta.0",
|
|
4
|
+
"keywords": [
|
|
5
|
+
"starknet",
|
|
6
|
+
"starkware",
|
|
7
|
+
"l2",
|
|
8
|
+
"zk",
|
|
9
|
+
"rollup",
|
|
10
|
+
"wallet",
|
|
11
|
+
"dapp"
|
|
12
|
+
],
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"type": "module",
|
|
15
|
+
"main": "./dist/index.mjs",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.mjs",
|
|
21
|
+
"require": "./dist/index.cjs",
|
|
22
|
+
"default": "./dist/index.mjs"
|
|
23
|
+
},
|
|
24
|
+
"./chains": {
|
|
25
|
+
"types": "./dist/chains.d.ts",
|
|
26
|
+
"import": "./dist/chains.mjs",
|
|
27
|
+
"require": "./dist/chains.cjs",
|
|
28
|
+
"default": "./dist/chains.mjs"
|
|
29
|
+
},
|
|
30
|
+
"./features": {
|
|
31
|
+
"types": "./dist/features.d.ts",
|
|
32
|
+
"import": "./dist/features.mjs",
|
|
33
|
+
"require": "./dist/features.cjs",
|
|
34
|
+
"default": "./dist/features.mjs"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"src"
|
|
40
|
+
],
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"typescript": "^5.8.3",
|
|
43
|
+
"unbuild": "^2.0.0",
|
|
44
|
+
"vitest": "^3.1.1"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@starknet-io/types-js": "^0.7.10",
|
|
48
|
+
"@wallet-standard/base": "^1.1.0",
|
|
49
|
+
"@wallet-standard/features": "^1.1.0",
|
|
50
|
+
"ox": "^0.4.4"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "unbuild",
|
|
54
|
+
"format:check": "biome format .",
|
|
55
|
+
"format": "biome format --write .",
|
|
56
|
+
"lint:check": "biome lint .",
|
|
57
|
+
"lint": "biome lint --write .",
|
|
58
|
+
"test": "vitest"
|
|
59
|
+
}
|
|
60
|
+
}
|
package/src/chains.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { IdentifierString } from "@wallet-standard/base";
|
|
2
|
+
import { Hex } from "ox";
|
|
3
|
+
|
|
4
|
+
export type ChainId = `0x${string}`;
|
|
5
|
+
|
|
6
|
+
export const STARKNET_CHAIN_PREFIX = "starknet:";
|
|
7
|
+
|
|
8
|
+
export type StarknetChain = `${typeof STARKNET_CHAIN_PREFIX}${ChainId}`;
|
|
9
|
+
|
|
10
|
+
export class StarknetChainError extends Error {
|
|
11
|
+
constructor(message: string) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "StarknetChainError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const WELL_KNOWN_STARKNET_CHAINS = [
|
|
18
|
+
"starknet:0x534e5f4d41494e", // mainnet
|
|
19
|
+
"starknet:0x534e5f5345504f4c4941", // sepolia
|
|
20
|
+
] as const satisfies StarknetChain[];
|
|
21
|
+
|
|
22
|
+
/** Check if a chain identifier is a Starknet chain. */
|
|
23
|
+
export function isStarknetChain(chain: string): chain is StarknetChain {
|
|
24
|
+
const parts = chain.split(":");
|
|
25
|
+
if (parts.length !== 2 || parts[0] !== "starknet") {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return Hex.validate(parts[1]);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Returns a `StarknetChain` from a `ChainId`. */
|
|
33
|
+
export function formatStarknetChainId(chainId: string): StarknetChain {
|
|
34
|
+
if (!Hex.validate(chainId)) {
|
|
35
|
+
throw new StarknetChainError(`Invalid Starknet chain id: ${chainId}`);
|
|
36
|
+
}
|
|
37
|
+
return `${STARKNET_CHAIN_PREFIX}${chainId}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Returns the 0x prefixed chain id. */
|
|
41
|
+
export function getStarknetChainId(chain: string): ChainId {
|
|
42
|
+
if (!isStarknetChain(chain)) {
|
|
43
|
+
throw new StarknetChainError(`Invalid Starknet chain: ${chain}`);
|
|
44
|
+
}
|
|
45
|
+
return chain.slice(STARKNET_CHAIN_PREFIX.length) as ChainId;
|
|
46
|
+
}
|
package/src/features.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { RequestFn } from "@starknet-io/types-js";
|
|
2
|
+
import type { Wallet, WalletWithFeatures } from "@wallet-standard/base";
|
|
3
|
+
import {
|
|
4
|
+
StandardConnect,
|
|
5
|
+
StandardDisconnect,
|
|
6
|
+
type StandardEventsFeature,
|
|
7
|
+
type StandardConnectFeature,
|
|
8
|
+
type StandardDisconnectFeature,
|
|
9
|
+
StandardEvents,
|
|
10
|
+
} from "@wallet-standard/features";
|
|
11
|
+
|
|
12
|
+
export const StarknetWalletApi = "starknet:walletApi";
|
|
13
|
+
|
|
14
|
+
export type StarknetWalletApiVersion = "1.0.0";
|
|
15
|
+
|
|
16
|
+
/** A Wallet Standard feature for wallets that implement Starknet's wallet API. */
|
|
17
|
+
export type StarknetWalletRequestFeature = {
|
|
18
|
+
readonly [StarknetWalletApi]: {
|
|
19
|
+
readonly version: StarknetWalletApiVersion;
|
|
20
|
+
readonly request: RequestFn;
|
|
21
|
+
readonly walletVersion: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type StarknetFeatures = StarknetWalletRequestFeature &
|
|
26
|
+
StandardConnectFeature &
|
|
27
|
+
StandardDisconnectFeature &
|
|
28
|
+
StandardEventsFeature;
|
|
29
|
+
export type WalletWithStarknetFeatures = WalletWithFeatures<StarknetFeatures>;
|
|
30
|
+
|
|
31
|
+
export const RequiredStarknetFeatures = [
|
|
32
|
+
StarknetWalletApi,
|
|
33
|
+
StandardConnect,
|
|
34
|
+
StandardDisconnect,
|
|
35
|
+
StandardEvents,
|
|
36
|
+
] as const satisfies (keyof StarknetFeatures)[];
|
|
37
|
+
|
|
38
|
+
/** Check if a wallet is a Starknet wallet. */
|
|
39
|
+
export function isStarknetWallet(
|
|
40
|
+
wallet: Wallet,
|
|
41
|
+
): wallet is WalletWithStarknetFeatures {
|
|
42
|
+
return RequiredStarknetFeatures.every(
|
|
43
|
+
(feature) => feature in wallet.features,
|
|
44
|
+
);
|
|
45
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import type { RequestFn, StarknetWindowObject } from "@starknet-io/types-js";
|
|
2
|
+
import type { Wallet } from "@wallet-standard/base";
|
|
3
|
+
import {
|
|
4
|
+
StandardConnect,
|
|
5
|
+
type StandardConnectMethod,
|
|
6
|
+
StandardDisconnect,
|
|
7
|
+
type StandardDisconnectMethod,
|
|
8
|
+
StandardEvents,
|
|
9
|
+
type StandardEventsListeners,
|
|
10
|
+
type StandardEventsNames,
|
|
11
|
+
type StandardEventsOnMethod,
|
|
12
|
+
} from "@wallet-standard/features";
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
formatStarknetChainId,
|
|
16
|
+
isStarknetChain,
|
|
17
|
+
type StarknetChain,
|
|
18
|
+
WELL_KNOWN_STARKNET_CHAINS,
|
|
19
|
+
} from "./chains";
|
|
20
|
+
import {
|
|
21
|
+
type StarknetFeatures,
|
|
22
|
+
StarknetWalletApi,
|
|
23
|
+
type WalletWithStarknetFeatures,
|
|
24
|
+
} from "./features";
|
|
25
|
+
import type { StarknetWalletAccount } from "./wallet";
|
|
26
|
+
|
|
27
|
+
export class StarknetInjectedWallet implements WalletWithStarknetFeatures {
|
|
28
|
+
#listeners: { [E in StandardEventsNames]?: StandardEventsListeners[E][] } =
|
|
29
|
+
{};
|
|
30
|
+
#account: { address: string; chain: StarknetChain } | null = null;
|
|
31
|
+
|
|
32
|
+
constructor(private readonly injected: StarknetWindowObject) {
|
|
33
|
+
this.injected.on("accountsChanged", this.#onAccountsChanged.bind(this));
|
|
34
|
+
this.injected.on("networkChanged", this.#onNetworkChanged.bind(this));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
get version() {
|
|
38
|
+
return "1.0.0" as const;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
get name() {
|
|
42
|
+
return this.injected.name;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
get icon() {
|
|
46
|
+
if (typeof this.injected.icon === "string") {
|
|
47
|
+
return this.injected.icon as Wallet["icon"];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return this.injected.icon.light as Wallet["icon"];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
get features(): StarknetFeatures {
|
|
54
|
+
return {
|
|
55
|
+
[StandardConnect]: {
|
|
56
|
+
version: "1.0.0" as const,
|
|
57
|
+
connect: this.#connect.bind(this),
|
|
58
|
+
},
|
|
59
|
+
[StandardDisconnect]: {
|
|
60
|
+
version: "1.0.0" as const,
|
|
61
|
+
disconnect: this.#disconnect.bind(this),
|
|
62
|
+
},
|
|
63
|
+
[StandardEvents]: {
|
|
64
|
+
version: "1.0.0" as const,
|
|
65
|
+
on: this.#on.bind(this),
|
|
66
|
+
},
|
|
67
|
+
[StarknetWalletApi]: {
|
|
68
|
+
version: "1.0.0" as const,
|
|
69
|
+
request: this.#request.bind(this),
|
|
70
|
+
walletVersion: this.injected.version,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
get chains() {
|
|
76
|
+
return WELL_KNOWN_STARKNET_CHAINS.slice();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
get accounts(): StarknetWalletAccount[] {
|
|
80
|
+
if (this.#account) {
|
|
81
|
+
return [
|
|
82
|
+
{
|
|
83
|
+
address: this.#account.address,
|
|
84
|
+
publicKey: new Uint8Array(),
|
|
85
|
+
chains: [this.#account.chain],
|
|
86
|
+
features: [],
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
#connect: StandardConnectMethod = async ({ silent }) => {
|
|
95
|
+
if (!this.#account) {
|
|
96
|
+
const accounts = await this.injected.request({
|
|
97
|
+
type: "wallet_requestAccounts",
|
|
98
|
+
params: {
|
|
99
|
+
silent_mode: silent,
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// TODO(fra): maybe we should throw an error here?
|
|
104
|
+
// User rejected the request.
|
|
105
|
+
if (accounts.length === 0) {
|
|
106
|
+
return { accounts: [] };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
await this.#updateAccount(accounts);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return { accounts: this.accounts };
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
#disconnect: StandardDisconnectMethod = async () => {
|
|
116
|
+
this.#disconnected();
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
#on: StandardEventsOnMethod = (event, listener) => {
|
|
120
|
+
if (!this.#listeners[event]) {
|
|
121
|
+
this.#listeners[event] = [];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
this.#listeners[event].push(listener);
|
|
125
|
+
|
|
126
|
+
return (): void => this.#off(event, listener);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
#emit<E extends StandardEventsNames>(
|
|
130
|
+
event: E,
|
|
131
|
+
...args: Parameters<StandardEventsListeners[E]>
|
|
132
|
+
): void {
|
|
133
|
+
if (!this.#listeners[event]) return;
|
|
134
|
+
|
|
135
|
+
for (const listener of this.#listeners[event]) {
|
|
136
|
+
listener.apply(null, args);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
#off<E extends StandardEventsNames>(
|
|
141
|
+
event: E,
|
|
142
|
+
listener: StandardEventsListeners[E],
|
|
143
|
+
): void {
|
|
144
|
+
this.#listeners[event] = this.#listeners[event]?.filter(
|
|
145
|
+
(existingListener) => listener !== existingListener,
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
#disconnected() {
|
|
150
|
+
if (this.#account) {
|
|
151
|
+
this.#account = null;
|
|
152
|
+
this.#emit("change", { accounts: this.accounts });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async #onAccountsChanged(accounts: string[]) {
|
|
157
|
+
if (!accounts || accounts.length === 0) {
|
|
158
|
+
this.#disconnected();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (!this.#account) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
await this.#updateAccount(accounts);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
#onNetworkChanged(chainId?: string, accounts?: string[]) {
|
|
170
|
+
if (!chainId) {
|
|
171
|
+
this.#disconnected();
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (!this.#account) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const chain = formatStarknetChainId(chainId);
|
|
180
|
+
|
|
181
|
+
if (!isStarknetChain(chain)) {
|
|
182
|
+
throw new Error(`Invalid Starknet chain: ${chain}`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Some wallets (like Keplr) don't provide accounts on network change.
|
|
186
|
+
if (accounts?.length > 0) {
|
|
187
|
+
const [account] = accounts;
|
|
188
|
+
|
|
189
|
+
this.#account = { address: account, chain };
|
|
190
|
+
this.#emit("change", { accounts: this.accounts });
|
|
191
|
+
} else {
|
|
192
|
+
this.#account = { address: this.#account?.address, chain };
|
|
193
|
+
this.#emit("change", { accounts: this.accounts });
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async #updateAccount(accounts: string[]) {
|
|
198
|
+
if (accounts.length === 0) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const [account] = accounts;
|
|
203
|
+
|
|
204
|
+
if (this.#account?.chain) {
|
|
205
|
+
// Only account changed. No need to make a request for the chain id.
|
|
206
|
+
this.#account.address = account;
|
|
207
|
+
this.#emit("change", { accounts: this.accounts });
|
|
208
|
+
} else {
|
|
209
|
+
const chain = await this.#getStarknetChain();
|
|
210
|
+
this.#account = { address: account, chain };
|
|
211
|
+
this.#emit("change", { accounts: this.accounts });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
#request(...args: Parameters<RequestFn>): ReturnType<RequestFn> {
|
|
216
|
+
return this.injected.request(...args);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
async #getStarknetChain(): Promise<StarknetChain> {
|
|
220
|
+
const chainId = await this.injected.request({
|
|
221
|
+
type: "wallet_requestChainId",
|
|
222
|
+
});
|
|
223
|
+
const chain = formatStarknetChainId(chainId);
|
|
224
|
+
|
|
225
|
+
if (!isStarknetChain(chain)) {
|
|
226
|
+
throw new Error(`Invalid Starknet chain: ${chain}`);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return chain;
|
|
230
|
+
}
|
|
231
|
+
}
|
package/src/wallet.ts
ADDED