@metamask/connect-solana 0.1.0 → 0.2.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/CHANGELOG.md CHANGED
@@ -7,11 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.0]
11
+
12
+ ### Added
13
+
14
+ - Add node.js builds [#169](https://github.com/MetaMask/connect-monorepo/pull/169)
15
+
16
+ ### Changed
17
+
18
+ - **BREAKING:** Automatically register as MetaMask to Solana Wallet Standard registry upon instantiation - with option to skip auto-registration [#178](https://github.com/MetaMask/connect-monorepo/pull/178) ([#179](https://github.com/MetaMask/connect-monorepo/pull/179))
19
+
10
20
  ## [0.1.0]
11
21
 
12
22
  ### Added
13
23
 
14
24
  - Initial release
15
25
 
16
- [Unreleased]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-solana@0.1.0...HEAD
26
+ [Unreleased]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-solana@0.2.0...HEAD
27
+ [0.2.0]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-solana@0.1.0...@metamask/connect-solana@0.2.0
17
28
  [0.1.0]: https://github.com/MetaMask/connect-monorepo/releases/tag/@metamask/connect-solana@0.1.0
package/README.md CHANGED
@@ -85,28 +85,86 @@ function App() {
85
85
  }
86
86
  ```
87
87
 
88
+ ### ⚠️ Wallet Adapter support
89
+
90
+ > **Note:** There is a known issue with `@solana/wallet-adapter-react` that prevents connecting to MetaMask when using the Wallet Standard provider from `@metamask/connect-solana` in Chrome on Android.
91
+ >
92
+ > See this [patch file](../../.yarn/patches/@solana-wallet-adapter-react-npm-0.15.39-86277fdcc0.patch) for details.
93
+
88
94
  ## API Reference
89
95
 
90
96
  ### `createSolanaClient(options)`
91
97
 
92
- Creates a new Solana client instance.
98
+ Creates a new Solana client instance. By default, the wallet is automatically registered with the wallet-standard registry on creation.
93
99
 
94
100
  #### Parameters
95
101
 
96
- - `options.dapp.name` (required) - The name of your dapp
97
- - `options.dapp.url` (optional) - The URL of your dapp
98
- - `options.dapp.iconUrl` (optional) - The icon URL of your dapp
99
- - `options.api.supportedNetworks` (optional) - Map of CAIP chain IDs to RPC URLs
100
- - `options.debug` (optional) - Enable debug logging
102
+ | Option | Type | Required | Description |
103
+ | ----------------------- | ------------------------- | -------- | ---------------------------------------------------------------------- |
104
+ | `dapp.name` | `string` | Yes | Name of your dApp |
105
+ | `dapp.url` | `string` | No | URL of your dApp |
106
+ | `dapp.iconUrl` | `string` | No | Icon URL for your dApp |
107
+ | `api.supportedNetworks` | `SolanaSupportedNetworks` | No | Map of network names (`mainnet`, `devnet`, `testnet`) to RPC URLs |
108
+ | `debug` | `boolean` | No | Enable debug logging |
109
+ | `skipAutoRegister` | `boolean` | No | Skip auto-registering the wallet during creation (defaults to `false`) |
101
110
 
102
111
  #### Returns
103
112
 
104
- A `SolanaClient` object with:
113
+ `Promise<SolanaClient>`
114
+
115
+ ---
116
+
117
+ ### `SolanaClient`
118
+
119
+ The object returned by `createSolanaClient`.
120
+
121
+ #### Properties
122
+
123
+ | Property | Type | Description |
124
+ | -------- | ---------------- | -------------------------------------- |
125
+ | `core` | `MultichainCore` | The underlying MultichainCore instance |
126
+
127
+ #### Methods
128
+
129
+ ##### `getWallet()`
130
+
131
+ Returns a wallet-standard compatible MetaMask wallet instance.
132
+
133
+ **Returns**
134
+
135
+ `Wallet` - A [wallet-standard](https://github.com/wallet-standard/wallet-standard) compatible wallet.
136
+
137
+ ##### `registerWallet()`
138
+
139
+ Registers the MetaMask wallet with the wallet-standard registry. This is a no-op if the wallet was already auto-registered during creation (i.e., `skipAutoRegister` was not set to `true`).
140
+
141
+ **Returns**
105
142
 
106
- - `core` - The underlying MultichainCore instance
107
- - `getWallet(walletName?)` - Returns a wallet-standard compatible wallet
108
- - `registerWallet(walletName?)` - Registers the wallet with the wallet-standard registry
109
- - `disconnect()` - Disconnects and revokes the session
143
+ `Promise<void>`
144
+
145
+ ##### `disconnect()`
146
+
147
+ Disconnects from the wallet and revokes the session.
148
+
149
+ **Returns**
150
+
151
+ `Promise<void>`
152
+
153
+ ---
154
+
155
+ ### Types
156
+
157
+ #### `SolanaNetwork`
158
+
159
+ ```typescript
160
+ type SolanaNetwork = 'mainnet' | 'devnet' | 'testnet';
161
+ ```
162
+
163
+ #### `SolanaSupportedNetworks`
164
+
165
+ ```typescript
166
+ type SolanaSupportedNetworks = Partial<Record<SolanaNetwork, string>>;
167
+ ```
110
168
 
111
169
  ## TypeScript
112
170
 
@@ -1,3 +1,4 @@
1
+ /* Browser ES build */
1
2
  var __async = (__this, __arguments, generator) => {
2
3
  return new Promise((resolve, reject) => {
3
4
  var fulfilled = (value) => {
@@ -48,12 +49,13 @@ function convertNetworksToCAIP(networks) {
48
49
  // src/connect.ts
49
50
  function createSolanaClient(options) {
50
51
  return __async(this, null, function* () {
51
- var _a, _b;
52
+ var _a, _b, _c;
52
53
  const defaultNetworks = {
53
54
  mainnet: "https://api.mainnet-beta.solana.com"
54
55
  };
56
+ const skipAutoRegister = (_a = options.skipAutoRegister) != null ? _a : false;
55
57
  const supportedNetworks = convertNetworksToCAIP(
56
- (_b = (_a = options.api) == null ? void 0 : _a.supportedNetworks) != null ? _b : defaultNetworks
58
+ (_c = (_b = options.api) == null ? void 0 : _b.supportedNetworks) != null ? _c : defaultNetworks
57
59
  );
58
60
  const core = yield createMultichainClient({
59
61
  dapp: options.dapp,
@@ -62,11 +64,18 @@ function createSolanaClient(options) {
62
64
  }
63
65
  });
64
66
  const client = core.provider;
67
+ const walletName = "MetaMask Connect";
68
+ if (!skipAutoRegister) {
69
+ yield registerSolanaWalletStandard({ client, walletName });
70
+ }
65
71
  return {
66
72
  core,
67
- getWallet: (walletName) => getWalletStandard({ client, walletName }),
68
- registerWallet: (walletName = "MetaMask Connect") => __async(null, null, function* () {
69
- return registerSolanaWalletStandard({ client, walletName });
73
+ getWallet: () => getWalletStandard({ client, walletName }),
74
+ registerWallet: () => __async(null, null, function* () {
75
+ if (!skipAutoRegister) {
76
+ return;
77
+ }
78
+ yield registerSolanaWalletStandard({ client, walletName });
70
79
  }),
71
80
  disconnect: () => __async(null, null, function* () {
72
81
  return yield core.disconnect();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/connect.ts","../../../src/networks.ts"],"sourcesContent":["import { createMultichainClient } from '@metamask/connect-multichain';\nimport {\n getWalletStandard,\n registerSolanaWalletStandard,\n} from '@metamask/solana-wallet-standard';\n\nimport { convertNetworksToCAIP } from './networks';\nimport type {\n SolanaClient,\n SolanaConnectOptions,\n SolanaSupportedNetworks,\n} from './types';\n\n/**\n * Creates a new Solana client for connecting to MetaMask via wallet-standard.\n *\n * This function initializes the MultichainSDK and provides methods to get or register\n * a wallet-standard compatible wallet. The wallet handles session creation internally\n * when users connect through the Solana wallet adapter UI.\n *\n * @param options - Configuration options for the Solana client\n * @param options.dapp - Dapp identification and branding settings\n * @param options.api - Optional API configuration with supported networks\n * @param options.api.supportedNetworks - Record mapping network names (mainnet, devnet, testnet) to RPC URLs\n * @param options.debug - Enable debug logging\n * @returns A promise that resolves to the Solana client instance\n *\n * @example\n * ```typescript\n * import { createSolanaClient } from '@metamask/connect-solana';\n *\n * const client = await createSolanaClient({\n * dapp: {\n * name: 'My Solana DApp',\n * url: 'https://mydapp.com',\n * },\n * api: {\n * supportedNetworks: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com',\n * },\n * },\n * });\n *\n * // Register the wallet to make it discoverable by Solana dapps\n * await client.registerWallet();\n *\n * // Or get the wallet instance directly\n * const wallet = client.getWallet();\n * ```\n */\nexport async function createSolanaClient(\n options: SolanaConnectOptions,\n): Promise<SolanaClient> {\n const defaultNetworks: SolanaSupportedNetworks = {\n mainnet: 'https://api.mainnet-beta.solana.com',\n };\n\n const supportedNetworks = convertNetworksToCAIP(\n options.api?.supportedNetworks ?? defaultNetworks,\n );\n\n const core = await createMultichainClient({\n dapp: options.dapp,\n api: {\n supportedNetworks,\n },\n });\n\n const client = core.provider;\n\n return {\n core,\n getWallet: (walletName?: string) =>\n getWalletStandard({ client, walletName }),\n registerWallet: async (walletName = 'MetaMask Connect') =>\n registerSolanaWalletStandard({ client, walletName }),\n disconnect: async () => await core.disconnect(),\n };\n}\n","import type { SolanaNetwork, SolanaSupportedNetworks } from './types';\n\n/**\n * CAIP-2 chain IDs for Solana networks.\n * The reference is the first 32 characters of the Base58-encoded genesis hash.\n */\nexport const SOLANA_CAIP_IDS: Record<SolanaNetwork, string> = {\n mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n devnet: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n testnet: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n};\n\n/**\n * Converts a record of network names to RPC URLs into a record of CAIP IDs to RPC URLs.\n *\n * @param networks - A record of network names to RPC URLs\n * @returns A record of CAIP IDs to RPC URLs\n */\nexport function convertNetworksToCAIP(\n networks: SolanaSupportedNetworks,\n): Record<string, string> {\n return Object.entries(networks).reduce<Record<string, string>>(\n (acc, [network, rpcUrl]) => {\n const caipId = SOLANA_CAIP_IDS[network as SolanaNetwork];\n if (caipId && rpcUrl) {\n acc[caipId] = rpcUrl;\n }\n return acc;\n },\n {},\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EACA;AAAA,OACK;;;ACEA,IAAM,kBAAiD;AAAA,EAC5D,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAQO,SAAS,sBACd,UACwB;AACxB,SAAO,OAAO,QAAQ,QAAQ,EAAE;AAAA,IAC9B,CAAC,KAAK,CAAC,SAAS,MAAM,MAAM;AAC1B,YAAM,SAAS,gBAAgB,OAAwB;AACvD,UAAI,UAAU,QAAQ;AACpB,YAAI,MAAM,IAAI;AAAA,MAChB;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AACF;;;ADoBA,SAAsB,mBACpB,SACuB;AAAA;AArDzB;AAsDE,UAAM,kBAA2C;AAAA,MAC/C,SAAS;AAAA,IACX;AAEA,UAAM,oBAAoB;AAAA,OACxB,mBAAQ,QAAR,mBAAa,sBAAb,YAAkC;AAAA,IACpC;AAEA,UAAM,OAAO,MAAM,uBAAuB;AAAA,MACxC,MAAM,QAAQ;AAAA,MACd,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,SAAS,KAAK;AAEpB,WAAO;AAAA,MACL;AAAA,MACA,WAAW,CAAC,eACV,kBAAkB,EAAE,QAAQ,WAAW,CAAC;AAAA,MAC1C,gBAAgB,CAAO,aAAa,uBAAoB;AACtD,4CAA6B,EAAE,QAAQ,WAAW,CAAC;AAAA;AAAA,MACrD,YAAY,MAAS;AAAG,qBAAM,KAAK,WAAW;AAAA;AAAA,IAChD;AAAA,EACF;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../src/connect.ts","../../../src/networks.ts"],"sourcesContent":["import { createMultichainClient } from '@metamask/connect-multichain';\nimport {\n getWalletStandard,\n registerSolanaWalletStandard,\n} from '@metamask/solana-wallet-standard';\n\nimport { convertNetworksToCAIP } from './networks';\nimport type {\n SolanaClient,\n SolanaConnectOptions,\n SolanaSupportedNetworks,\n} from './types';\n\n/**\n * Creates a new Solana client for connecting to MetaMask via wallet-standard.\n *\n * This function initializes the MultichainSDK and provides methods to get or register\n * a wallet-standard compatible wallet. The wallet handles session creation internally\n * when users connect through the Solana wallet adapter UI.\n *\n * @param options - Configuration options for the Solana client\n * @param options.dapp - Dapp identification and branding settings\n * @param options.api - Optional API configuration with supported networks\n * @param options.api.supportedNetworks - Record mapping network names (mainnet, devnet, testnet) to RPC URLs\n * @param options.debug - Enable debug logging\n * @param options.skipAutoRegister - Skip auto-registering the wallet during creation (defaults to false)\n * @returns A promise that resolves to the Solana client instance\n *\n * @example\n * ```typescript\n * import { createSolanaClient } from '@metamask/connect-solana';\n *\n * // Wallet is auto-registered and ready to use\n * const client = await createSolanaClient({\n * dapp: {\n * name: 'My Solana DApp',\n * url: 'https://mydapp.com',\n * },\n * api: {\n * supportedNetworks: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com',\n * },\n * },\n * });\n *\n * // Get the wallet instance directly\n * const wallet = client.getWallet();\n * ```\n */\nexport async function createSolanaClient(\n options: SolanaConnectOptions,\n): Promise<SolanaClient> {\n const defaultNetworks: SolanaSupportedNetworks = {\n mainnet: 'https://api.mainnet-beta.solana.com',\n };\n\n const skipAutoRegister = options.skipAutoRegister ?? false;\n\n const supportedNetworks = convertNetworksToCAIP(\n options.api?.supportedNetworks ?? defaultNetworks,\n );\n\n const core = await createMultichainClient({\n dapp: options.dapp,\n api: {\n supportedNetworks,\n },\n });\n\n const client = core.provider;\n\n const walletName = 'MetaMask Connect';\n\n if (!skipAutoRegister) {\n await registerSolanaWalletStandard({ client, walletName });\n }\n\n return {\n core,\n getWallet: () => getWalletStandard({ client, walletName }),\n registerWallet: async (): Promise<void> => {\n if (!skipAutoRegister) {\n return;\n }\n await registerSolanaWalletStandard({ client, walletName });\n },\n disconnect: async () => await core.disconnect(),\n };\n}\n","import type { SolanaNetwork, SolanaSupportedNetworks } from './types';\n\n/**\n * CAIP-2 chain IDs for Solana networks.\n * The reference is the first 32 characters of the Base58-encoded genesis hash.\n */\nexport const SOLANA_CAIP_IDS: Record<SolanaNetwork, string> = {\n mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n devnet: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n testnet: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n};\n\n/**\n * Converts a record of network names to RPC URLs into a record of CAIP IDs to RPC URLs.\n *\n * @param networks - A record of network names to RPC URLs\n * @returns A record of CAIP IDs to RPC URLs\n */\nexport function convertNetworksToCAIP(\n networks: SolanaSupportedNetworks,\n): Record<string, string> {\n return Object.entries(networks).reduce<Record<string, string>>(\n (acc, [network, rpcUrl]) => {\n const caipId = SOLANA_CAIP_IDS[network as SolanaNetwork];\n if (caipId && rpcUrl) {\n acc[caipId] = rpcUrl;\n }\n return acc;\n },\n {},\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EACA;AAAA,OACK;;;ACEA,IAAM,kBAAiD;AAAA,EAC5D,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAQO,SAAS,sBACd,UACwB;AACxB,SAAO,OAAO,QAAQ,QAAQ,EAAE;AAAA,IAC9B,CAAC,KAAK,CAAC,SAAS,MAAM,MAAM;AAC1B,YAAM,SAAS,gBAAgB,OAAwB;AACvD,UAAI,UAAU,QAAQ;AACpB,YAAI,MAAM,IAAI;AAAA,MAChB;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AACF;;;ADmBA,SAAsB,mBACpB,SACuB;AAAA;AApDzB;AAqDE,UAAM,kBAA2C;AAAA,MAC/C,SAAS;AAAA,IACX;AAEA,UAAM,oBAAmB,aAAQ,qBAAR,YAA4B;AAErD,UAAM,oBAAoB;AAAA,OACxB,mBAAQ,QAAR,mBAAa,sBAAb,YAAkC;AAAA,IACpC;AAEA,UAAM,OAAO,MAAM,uBAAuB;AAAA,MACxC,MAAM,QAAQ;AAAA,MACd,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,SAAS,KAAK;AAEpB,UAAM,aAAa;AAEnB,QAAI,CAAC,kBAAkB;AACrB,YAAM,6BAA6B,EAAE,QAAQ,WAAW,CAAC;AAAA,IAC3D;AAEA,WAAO;AAAA,MACL;AAAA,MACA,WAAW,MAAM,kBAAkB,EAAE,QAAQ,WAAW,CAAC;AAAA,MACzD,gBAAgB,MAA2B;AACzC,YAAI,CAAC,kBAAkB;AACrB;AAAA,QACF;AACA,cAAM,6BAA6B,EAAE,QAAQ,WAAW,CAAC;AAAA,MAC3D;AAAA,MACA,YAAY,MAAS;AAAG,qBAAM,KAAK,WAAW;AAAA;AAAA,IAChD;AAAA,EACF;AAAA;","names":[]}
@@ -0,0 +1,112 @@
1
+ /* Node.js CJS build */
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var __async = (__this, __arguments, generator) => {
21
+ return new Promise((resolve, reject) => {
22
+ var fulfilled = (value) => {
23
+ try {
24
+ step(generator.next(value));
25
+ } catch (e) {
26
+ reject(e);
27
+ }
28
+ };
29
+ var rejected = (value) => {
30
+ try {
31
+ step(generator.throw(value));
32
+ } catch (e) {
33
+ reject(e);
34
+ }
35
+ };
36
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
37
+ step((generator = generator.apply(__this, __arguments)).next());
38
+ });
39
+ };
40
+
41
+ // src/index.ts
42
+ var src_exports = {};
43
+ __export(src_exports, {
44
+ createSolanaClient: () => createSolanaClient
45
+ });
46
+ module.exports = __toCommonJS(src_exports);
47
+
48
+ // src/connect.ts
49
+ var import_connect_multichain = require("@metamask/connect-multichain");
50
+ var import_solana_wallet_standard = require("@metamask/solana-wallet-standard");
51
+
52
+ // src/networks.ts
53
+ var SOLANA_CAIP_IDS = {
54
+ mainnet: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
55
+ devnet: "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
56
+ testnet: "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"
57
+ };
58
+ function convertNetworksToCAIP(networks) {
59
+ return Object.entries(networks).reduce(
60
+ (acc, [network, rpcUrl]) => {
61
+ const caipId = SOLANA_CAIP_IDS[network];
62
+ if (caipId && rpcUrl) {
63
+ acc[caipId] = rpcUrl;
64
+ }
65
+ return acc;
66
+ },
67
+ {}
68
+ );
69
+ }
70
+
71
+ // src/connect.ts
72
+ function createSolanaClient(options) {
73
+ return __async(this, null, function* () {
74
+ var _a, _b, _c;
75
+ const defaultNetworks = {
76
+ mainnet: "https://api.mainnet-beta.solana.com"
77
+ };
78
+ const skipAutoRegister = (_a = options.skipAutoRegister) != null ? _a : false;
79
+ const supportedNetworks = convertNetworksToCAIP(
80
+ (_c = (_b = options.api) == null ? void 0 : _b.supportedNetworks) != null ? _c : defaultNetworks
81
+ );
82
+ const core = yield (0, import_connect_multichain.createMultichainClient)({
83
+ dapp: options.dapp,
84
+ api: {
85
+ supportedNetworks
86
+ }
87
+ });
88
+ const client = core.provider;
89
+ const walletName = "MetaMask Connect";
90
+ if (!skipAutoRegister) {
91
+ yield (0, import_solana_wallet_standard.registerSolanaWalletStandard)({ client, walletName });
92
+ }
93
+ return {
94
+ core,
95
+ getWallet: () => (0, import_solana_wallet_standard.getWalletStandard)({ client, walletName }),
96
+ registerWallet: () => __async(null, null, function* () {
97
+ if (!skipAutoRegister) {
98
+ return;
99
+ }
100
+ yield (0, import_solana_wallet_standard.registerSolanaWalletStandard)({ client, walletName });
101
+ }),
102
+ disconnect: () => __async(null, null, function* () {
103
+ return yield core.disconnect();
104
+ })
105
+ };
106
+ });
107
+ }
108
+ // Annotate the CommonJS export names for ESM import in node:
109
+ 0 && (module.exports = {
110
+ createSolanaClient
111
+ });
112
+ //# sourceMappingURL=connect-solana.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/index.ts","../../../src/connect.ts","../../../src/networks.ts"],"sourcesContent":["export { createSolanaClient } from './connect';\nexport type {\n SolanaClient,\n SolanaConnectOptions,\n SolanaNetwork,\n SolanaSupportedNetworks,\n} from './types';\n","import { createMultichainClient } from '@metamask/connect-multichain';\nimport {\n getWalletStandard,\n registerSolanaWalletStandard,\n} from '@metamask/solana-wallet-standard';\n\nimport { convertNetworksToCAIP } from './networks';\nimport type {\n SolanaClient,\n SolanaConnectOptions,\n SolanaSupportedNetworks,\n} from './types';\n\n/**\n * Creates a new Solana client for connecting to MetaMask via wallet-standard.\n *\n * This function initializes the MultichainSDK and provides methods to get or register\n * a wallet-standard compatible wallet. The wallet handles session creation internally\n * when users connect through the Solana wallet adapter UI.\n *\n * @param options - Configuration options for the Solana client\n * @param options.dapp - Dapp identification and branding settings\n * @param options.api - Optional API configuration with supported networks\n * @param options.api.supportedNetworks - Record mapping network names (mainnet, devnet, testnet) to RPC URLs\n * @param options.debug - Enable debug logging\n * @param options.skipAutoRegister - Skip auto-registering the wallet during creation (defaults to false)\n * @returns A promise that resolves to the Solana client instance\n *\n * @example\n * ```typescript\n * import { createSolanaClient } from '@metamask/connect-solana';\n *\n * // Wallet is auto-registered and ready to use\n * const client = await createSolanaClient({\n * dapp: {\n * name: 'My Solana DApp',\n * url: 'https://mydapp.com',\n * },\n * api: {\n * supportedNetworks: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com',\n * },\n * },\n * });\n *\n * // Get the wallet instance directly\n * const wallet = client.getWallet();\n * ```\n */\nexport async function createSolanaClient(\n options: SolanaConnectOptions,\n): Promise<SolanaClient> {\n const defaultNetworks: SolanaSupportedNetworks = {\n mainnet: 'https://api.mainnet-beta.solana.com',\n };\n\n const skipAutoRegister = options.skipAutoRegister ?? false;\n\n const supportedNetworks = convertNetworksToCAIP(\n options.api?.supportedNetworks ?? defaultNetworks,\n );\n\n const core = await createMultichainClient({\n dapp: options.dapp,\n api: {\n supportedNetworks,\n },\n });\n\n const client = core.provider;\n\n const walletName = 'MetaMask Connect';\n\n if (!skipAutoRegister) {\n await registerSolanaWalletStandard({ client, walletName });\n }\n\n return {\n core,\n getWallet: () => getWalletStandard({ client, walletName }),\n registerWallet: async (): Promise<void> => {\n if (!skipAutoRegister) {\n return;\n }\n await registerSolanaWalletStandard({ client, walletName });\n },\n disconnect: async () => await core.disconnect(),\n };\n}\n","import type { SolanaNetwork, SolanaSupportedNetworks } from './types';\n\n/**\n * CAIP-2 chain IDs for Solana networks.\n * The reference is the first 32 characters of the Base58-encoded genesis hash.\n */\nexport const SOLANA_CAIP_IDS: Record<SolanaNetwork, string> = {\n mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n devnet: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n testnet: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n};\n\n/**\n * Converts a record of network names to RPC URLs into a record of CAIP IDs to RPC URLs.\n *\n * @param networks - A record of network names to RPC URLs\n * @returns A record of CAIP IDs to RPC URLs\n */\nexport function convertNetworksToCAIP(\n networks: SolanaSupportedNetworks,\n): Record<string, string> {\n return Object.entries(networks).reduce<Record<string, string>>(\n (acc, [network, rpcUrl]) => {\n const caipId = SOLANA_CAIP_IDS[network as SolanaNetwork];\n if (caipId && rpcUrl) {\n acc[caipId] = rpcUrl;\n }\n return acc;\n },\n {},\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,gCAAuC;AACvC,oCAGO;;;ACEA,IAAM,kBAAiD;AAAA,EAC5D,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAQO,SAAS,sBACd,UACwB;AACxB,SAAO,OAAO,QAAQ,QAAQ,EAAE;AAAA,IAC9B,CAAC,KAAK,CAAC,SAAS,MAAM,MAAM;AAC1B,YAAM,SAAS,gBAAgB,OAAwB;AACvD,UAAI,UAAU,QAAQ;AACpB,YAAI,MAAM,IAAI;AAAA,MAChB;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AACF;;;ADmBA,SAAsB,mBACpB,SACuB;AAAA;AApDzB;AAqDE,UAAM,kBAA2C;AAAA,MAC/C,SAAS;AAAA,IACX;AAEA,UAAM,oBAAmB,aAAQ,qBAAR,YAA4B;AAErD,UAAM,oBAAoB;AAAA,OACxB,mBAAQ,QAAR,mBAAa,sBAAb,YAAkC;AAAA,IACpC;AAEA,UAAM,OAAO,UAAM,kDAAuB;AAAA,MACxC,MAAM,QAAQ;AAAA,MACd,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,SAAS,KAAK;AAEpB,UAAM,aAAa;AAEnB,QAAI,CAAC,kBAAkB;AACrB,gBAAM,4DAA6B,EAAE,QAAQ,WAAW,CAAC;AAAA,IAC3D;AAEA,WAAO;AAAA,MACL;AAAA,MACA,WAAW,UAAM,iDAAkB,EAAE,QAAQ,WAAW,CAAC;AAAA,MACzD,gBAAgB,MAA2B;AACzC,YAAI,CAAC,kBAAkB;AACrB;AAAA,QACF;AACA,kBAAM,4DAA6B,EAAE,QAAQ,WAAW,CAAC;AAAA,MAC3D;AAAA,MACA,YAAY,MAAS;AAAG,qBAAM,KAAK,WAAW;AAAA;AAAA,IAChD;AAAA,EACF;AAAA;","names":[]}
@@ -0,0 +1,89 @@
1
+ /* Node.js ES build */
2
+ var __async = (__this, __arguments, generator) => {
3
+ return new Promise((resolve, reject) => {
4
+ var fulfilled = (value) => {
5
+ try {
6
+ step(generator.next(value));
7
+ } catch (e) {
8
+ reject(e);
9
+ }
10
+ };
11
+ var rejected = (value) => {
12
+ try {
13
+ step(generator.throw(value));
14
+ } catch (e) {
15
+ reject(e);
16
+ }
17
+ };
18
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
19
+ step((generator = generator.apply(__this, __arguments)).next());
20
+ });
21
+ };
22
+
23
+ // src/connect.ts
24
+ import { createMultichainClient } from "@metamask/connect-multichain";
25
+ import {
26
+ getWalletStandard,
27
+ registerSolanaWalletStandard
28
+ } from "@metamask/solana-wallet-standard";
29
+
30
+ // src/networks.ts
31
+ var SOLANA_CAIP_IDS = {
32
+ mainnet: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
33
+ devnet: "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
34
+ testnet: "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"
35
+ };
36
+ function convertNetworksToCAIP(networks) {
37
+ return Object.entries(networks).reduce(
38
+ (acc, [network, rpcUrl]) => {
39
+ const caipId = SOLANA_CAIP_IDS[network];
40
+ if (caipId && rpcUrl) {
41
+ acc[caipId] = rpcUrl;
42
+ }
43
+ return acc;
44
+ },
45
+ {}
46
+ );
47
+ }
48
+
49
+ // src/connect.ts
50
+ function createSolanaClient(options) {
51
+ return __async(this, null, function* () {
52
+ var _a, _b, _c;
53
+ const defaultNetworks = {
54
+ mainnet: "https://api.mainnet-beta.solana.com"
55
+ };
56
+ const skipAutoRegister = (_a = options.skipAutoRegister) != null ? _a : false;
57
+ const supportedNetworks = convertNetworksToCAIP(
58
+ (_c = (_b = options.api) == null ? void 0 : _b.supportedNetworks) != null ? _c : defaultNetworks
59
+ );
60
+ const core = yield createMultichainClient({
61
+ dapp: options.dapp,
62
+ api: {
63
+ supportedNetworks
64
+ }
65
+ });
66
+ const client = core.provider;
67
+ const walletName = "MetaMask Connect";
68
+ if (!skipAutoRegister) {
69
+ yield registerSolanaWalletStandard({ client, walletName });
70
+ }
71
+ return {
72
+ core,
73
+ getWallet: () => getWalletStandard({ client, walletName }),
74
+ registerWallet: () => __async(null, null, function* () {
75
+ if (!skipAutoRegister) {
76
+ return;
77
+ }
78
+ yield registerSolanaWalletStandard({ client, walletName });
79
+ }),
80
+ disconnect: () => __async(null, null, function* () {
81
+ return yield core.disconnect();
82
+ })
83
+ };
84
+ });
85
+ }
86
+ export {
87
+ createSolanaClient
88
+ };
89
+ //# sourceMappingURL=connect-solana.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/connect.ts","../../../src/networks.ts"],"sourcesContent":["import { createMultichainClient } from '@metamask/connect-multichain';\nimport {\n getWalletStandard,\n registerSolanaWalletStandard,\n} from '@metamask/solana-wallet-standard';\n\nimport { convertNetworksToCAIP } from './networks';\nimport type {\n SolanaClient,\n SolanaConnectOptions,\n SolanaSupportedNetworks,\n} from './types';\n\n/**\n * Creates a new Solana client for connecting to MetaMask via wallet-standard.\n *\n * This function initializes the MultichainSDK and provides methods to get or register\n * a wallet-standard compatible wallet. The wallet handles session creation internally\n * when users connect through the Solana wallet adapter UI.\n *\n * @param options - Configuration options for the Solana client\n * @param options.dapp - Dapp identification and branding settings\n * @param options.api - Optional API configuration with supported networks\n * @param options.api.supportedNetworks - Record mapping network names (mainnet, devnet, testnet) to RPC URLs\n * @param options.debug - Enable debug logging\n * @param options.skipAutoRegister - Skip auto-registering the wallet during creation (defaults to false)\n * @returns A promise that resolves to the Solana client instance\n *\n * @example\n * ```typescript\n * import { createSolanaClient } from '@metamask/connect-solana';\n *\n * // Wallet is auto-registered and ready to use\n * const client = await createSolanaClient({\n * dapp: {\n * name: 'My Solana DApp',\n * url: 'https://mydapp.com',\n * },\n * api: {\n * supportedNetworks: {\n * mainnet: 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com',\n * },\n * },\n * });\n *\n * // Get the wallet instance directly\n * const wallet = client.getWallet();\n * ```\n */\nexport async function createSolanaClient(\n options: SolanaConnectOptions,\n): Promise<SolanaClient> {\n const defaultNetworks: SolanaSupportedNetworks = {\n mainnet: 'https://api.mainnet-beta.solana.com',\n };\n\n const skipAutoRegister = options.skipAutoRegister ?? false;\n\n const supportedNetworks = convertNetworksToCAIP(\n options.api?.supportedNetworks ?? defaultNetworks,\n );\n\n const core = await createMultichainClient({\n dapp: options.dapp,\n api: {\n supportedNetworks,\n },\n });\n\n const client = core.provider;\n\n const walletName = 'MetaMask Connect';\n\n if (!skipAutoRegister) {\n await registerSolanaWalletStandard({ client, walletName });\n }\n\n return {\n core,\n getWallet: () => getWalletStandard({ client, walletName }),\n registerWallet: async (): Promise<void> => {\n if (!skipAutoRegister) {\n return;\n }\n await registerSolanaWalletStandard({ client, walletName });\n },\n disconnect: async () => await core.disconnect(),\n };\n}\n","import type { SolanaNetwork, SolanaSupportedNetworks } from './types';\n\n/**\n * CAIP-2 chain IDs for Solana networks.\n * The reference is the first 32 characters of the Base58-encoded genesis hash.\n */\nexport const SOLANA_CAIP_IDS: Record<SolanaNetwork, string> = {\n mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n devnet: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n testnet: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n};\n\n/**\n * Converts a record of network names to RPC URLs into a record of CAIP IDs to RPC URLs.\n *\n * @param networks - A record of network names to RPC URLs\n * @returns A record of CAIP IDs to RPC URLs\n */\nexport function convertNetworksToCAIP(\n networks: SolanaSupportedNetworks,\n): Record<string, string> {\n return Object.entries(networks).reduce<Record<string, string>>(\n (acc, [network, rpcUrl]) => {\n const caipId = SOLANA_CAIP_IDS[network as SolanaNetwork];\n if (caipId && rpcUrl) {\n acc[caipId] = rpcUrl;\n }\n return acc;\n },\n {},\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EACA;AAAA,OACK;;;ACEA,IAAM,kBAAiD;AAAA,EAC5D,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAQO,SAAS,sBACd,UACwB;AACxB,SAAO,OAAO,QAAQ,QAAQ,EAAE;AAAA,IAC9B,CAAC,KAAK,CAAC,SAAS,MAAM,MAAM;AAC1B,YAAM,SAAS,gBAAgB,OAAwB;AACvD,UAAI,UAAU,QAAQ;AACpB,YAAI,MAAM,IAAI;AAAA,MAChB;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AACF;;;ADmBA,SAAsB,mBACpB,SACuB;AAAA;AApDzB;AAqDE,UAAM,kBAA2C;AAAA,MAC/C,SAAS;AAAA,IACX;AAEA,UAAM,oBAAmB,aAAQ,qBAAR,YAA4B;AAErD,UAAM,oBAAoB;AAAA,OACxB,mBAAQ,QAAR,mBAAa,sBAAb,YAAkC;AAAA,IACpC;AAEA,UAAM,OAAO,MAAM,uBAAuB;AAAA,MACxC,MAAM,QAAQ;AAAA,MACd,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,SAAS,KAAK;AAEpB,UAAM,aAAa;AAEnB,QAAI,CAAC,kBAAkB;AACrB,YAAM,6BAA6B,EAAE,QAAQ,WAAW,CAAC;AAAA,IAC3D;AAEA,WAAO;AAAA,MACL;AAAA,MACA,WAAW,MAAM,kBAAkB,EAAE,QAAQ,WAAW,CAAC;AAAA,MACzD,gBAAgB,MAA2B;AACzC,YAAI,CAAC,kBAAkB;AACrB;AAAA,QACF;AACA,cAAM,6BAA6B,EAAE,QAAQ,WAAW,CAAC;AAAA,MAC3D;AAAA,MACA,YAAY,MAAS;AAAG,qBAAM,KAAK,WAAW;AAAA;AAAA,IAChD;AAAA,EACF;AAAA;","names":[]}
@@ -32,6 +32,8 @@ type SolanaConnectOptions = Pick<MultichainOptions, 'dapp'> & {
32
32
  };
33
33
  /** Enable debug logging */
34
34
  debug?: boolean;
35
+ /** Skip auto-registering the wallet during creation. Defaults to false. Set to true for manual control. */
36
+ skipAutoRegister?: boolean;
35
37
  };
36
38
  /**
37
39
  * The Solana client instance returned by createSolanaClient.
@@ -40,19 +42,16 @@ type SolanaClient = {
40
42
  /** The underlying MultichainCore instance */
41
43
  core: MultichainCore;
42
44
  /**
43
- * Gets a wallet-standard compatible wallet instance.
45
+ * Gets the wallet-standard compatible MetaMask wallet instance.
44
46
  *
45
- * @param walletName - Optional custom name for the wallet
46
47
  * @returns The wallet instance
47
48
  */
48
- getWallet: (walletName?: string) => Wallet;
49
+ getWallet: () => Wallet;
49
50
  /**
50
51
  * Registers the MetaMask wallet with the wallet-standard registry.
51
52
  * This makes MetaMask automatically discoverable by Solana dapps.
52
- *
53
- * @param walletName - Optional custom name for the wallet
54
53
  */
55
- registerWallet: (walletName?: string) => Promise<void>;
54
+ registerWallet: () => Promise<void>;
56
55
  /**
57
56
  * Disconnects from the wallet and revokes the session.
58
57
  */
@@ -71,12 +70,14 @@ type SolanaClient = {
71
70
  * @param options.api - Optional API configuration with supported networks
72
71
  * @param options.api.supportedNetworks - Record mapping network names (mainnet, devnet, testnet) to RPC URLs
73
72
  * @param options.debug - Enable debug logging
73
+ * @param options.skipAutoRegister - Skip auto-registering the wallet during creation (defaults to false)
74
74
  * @returns A promise that resolves to the Solana client instance
75
75
  *
76
76
  * @example
77
77
  * ```typescript
78
78
  * import { createSolanaClient } from '@metamask/connect-solana';
79
79
  *
80
+ * // Wallet is auto-registered and ready to use
80
81
  * const client = await createSolanaClient({
81
82
  * dapp: {
82
83
  * name: 'My Solana DApp',
@@ -90,10 +91,7 @@ type SolanaClient = {
90
91
  * },
91
92
  * });
92
93
  *
93
- * // Register the wallet to make it discoverable by Solana dapps
94
- * await client.registerWallet();
95
- *
96
- * // Or get the wallet instance directly
94
+ * // Get the wallet instance directly
97
95
  * const wallet = client.getWallet();
98
96
  * ```
99
97
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/connect-solana",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Solana Layer for MetaMask Connect",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -18,19 +18,23 @@
18
18
  "sideEffects": false,
19
19
  "exports": {
20
20
  ".": {
21
+ "browser": {
22
+ "types": "./dist/types/index.d.ts",
23
+ "import": "./dist/browser/es/connect-solana.mjs"
24
+ },
21
25
  "import": {
22
26
  "types": "./dist/types/index.d.ts",
23
- "default": "./dist/browser/es/connect-solana.mjs"
27
+ "default": "./dist/node/es/connect-solana.mjs"
24
28
  },
25
29
  "require": {
26
30
  "types": "./dist/types/index.d.ts",
27
- "default": "./dist/browser/es/connect-solana.mjs"
31
+ "default": "./dist/node/cjs/connect-solana.js"
28
32
  },
29
- "default": "./dist/browser/es/connect-solana.mjs"
33
+ "default": "./dist/node/cjs/connect-solana.js"
30
34
  },
31
35
  "./package.json": "./package.json"
32
36
  },
33
- "main": "./dist/browser/es/connect-solana.mjs",
37
+ "main": "./dist/node/cjs/connect-solana.js",
34
38
  "module": "./dist/browser/es/connect-solana.mjs",
35
39
  "browser": "./dist/browser/es/connect-solana.mjs",
36
40
  "types": "./dist/types/index.d.ts",
@@ -54,7 +58,7 @@
54
58
  "test:watch": "vitest watch"
55
59
  },
56
60
  "dependencies": {
57
- "@metamask/connect-multichain": "^0.5.3",
61
+ "@metamask/connect-multichain": "^0.6.0",
58
62
  "@metamask/solana-wallet-standard": "^0.6.0",
59
63
  "@wallet-standard/base": "^1.1.0"
60
64
  },