@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 +12 -1
- package/README.md +69 -11
- package/dist/browser/es/connect-solana.mjs +14 -5
- package/dist/browser/es/connect-solana.mjs.map +1 -1
- package/dist/node/cjs/connect-solana.js +112 -0
- package/dist/node/cjs/connect-solana.js.map +1 -0
- package/dist/node/es/connect-solana.mjs +89 -0
- package/dist/node/es/connect-solana.mjs.map +1 -0
- package/dist/types/index.d.ts +8 -10
- package/package.json +10 -6
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.
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
(
|
|
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: (
|
|
68
|
-
registerWallet: (
|
|
69
|
-
|
|
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 * //
|
|
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":[]}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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
|
|
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: (
|
|
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: (
|
|
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
|
-
* //
|
|
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.
|
|
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/
|
|
27
|
+
"default": "./dist/node/es/connect-solana.mjs"
|
|
24
28
|
},
|
|
25
29
|
"require": {
|
|
26
30
|
"types": "./dist/types/index.d.ts",
|
|
27
|
-
"default": "./dist/
|
|
31
|
+
"default": "./dist/node/cjs/connect-solana.js"
|
|
28
32
|
},
|
|
29
|
-
"default": "./dist/
|
|
33
|
+
"default": "./dist/node/cjs/connect-solana.js"
|
|
30
34
|
},
|
|
31
35
|
"./package.json": "./package.json"
|
|
32
36
|
},
|
|
33
|
-
"main": "./dist/
|
|
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.
|
|
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
|
},
|