@paimaexample/wallets 0.4.0 → 0.6.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/esm/wallets/src/midnight/midnight.d.ts +5 -2
- package/esm/wallets/src/midnight/midnight.d.ts.map +1 -1
- package/esm/wallets/src/midnight/midnight.js +54 -24
- package/esm/wallets/src/midnight/wrapper.d.ts.map +1 -1
- package/esm/wallets/src/midnight/wrapper.js +3 -1
- package/esm/wallets/src/wallet-modes.d.ts +3 -1
- package/esm/wallets/src/wallet-modes.d.ts.map +1 -1
- package/package.json +3 -1
- package/script/wallets/src/midnight/midnight.d.ts +5 -2
- package/script/wallets/src/midnight/midnight.d.ts.map +1 -1
- package/script/wallets/src/midnight/midnight.js +57 -24
- package/script/wallets/src/midnight/wrapper.d.ts.map +1 -1
- package/script/wallets/src/midnight/wrapper.js +3 -1
- package/script/wallets/src/wallet-modes.d.ts +3 -1
- package/script/wallets/src/wallet-modes.d.ts.map +1 -1
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { type MidnightAddress } from "../../../utils/src/mod.js";
|
|
2
|
+
import type { ConnectedAPI } from "@midnight-ntwrk/dapp-connector-api";
|
|
2
3
|
import { type IInjectedConnector, type ActiveConnection, type IProvider, type AddressAndType, type UserSignature, type IConnector, type ConnectionOption } from "../IProvider.js";
|
|
3
|
-
export type MidnightApi =
|
|
4
|
+
export type MidnightApi = ConnectedAPI;
|
|
4
5
|
export declare class MidnightConnector implements IConnector<MidnightApi>, IInjectedConnector<MidnightApi> {
|
|
5
6
|
private provider;
|
|
6
7
|
private static INSTANCE;
|
|
8
|
+
private static networkId;
|
|
7
9
|
static getWalletOptions(): ConnectionOption<MidnightApi>[];
|
|
8
10
|
static instance(): MidnightConnector;
|
|
11
|
+
setNetworkId: (networkId: string) => void;
|
|
9
12
|
getOrThrowProvider: () => MidnightProvider;
|
|
10
13
|
getProvider: () => undefined | MidnightProvider;
|
|
11
14
|
isConnected(): boolean;
|
|
@@ -19,7 +22,7 @@ export declare class MidnightProvider implements IProvider<MidnightApi> {
|
|
|
19
22
|
constructor(conn: ActiveConnection<MidnightApi>, address: MidnightAddress);
|
|
20
23
|
static init: (conn: ActiveConnection<MidnightApi>) => Promise<MidnightProvider>;
|
|
21
24
|
getConnection(): ActiveConnection<MidnightApi>;
|
|
22
|
-
signMessage: (message: string) => Promise<UserSignature>;
|
|
25
|
+
signMessage: (message: string, keyType?: "unshielded") => Promise<UserSignature>;
|
|
23
26
|
getAddress(): AddressAndType;
|
|
24
27
|
static fetchAddress: (conn: ActiveConnection<MidnightApi>) => Promise<string>;
|
|
25
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midnight.d.ts","sourceRoot":"","sources":["../../../../src/wallets/src/midnight/midnight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"midnight.d.ts","sourceRoot":"","sources":["../../../../src/wallets/src/midnight/midnight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC;AAMvC,qBAAa,iBACX,YAAW,UAAU,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC;IACnE,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4C;IACnE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAsB;IAE9C,MAAM,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE;IA+B1D,MAAM,CAAC,QAAQ,IAAI,iBAAiB;IAQpC,YAAY,GAAI,WAAW,MAAM,KAAG,IAAI,CAEtC;IAEF,kBAAkB,QAAO,gBAAgB,CAKvC;IAEF,WAAW,QAAO,SAAS,GAAG,gBAAgB,CAE5C;IAEF,WAAW,IAAI,OAAO;IAItB,aAAa,QAAa,OAAO,CAAC,gBAAgB,CAAC,CAUjD;IAEF,YAAY,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,gBAAgB,CAAC,CAW7D;IAED,eAAe,GAAU,MAAM,gBAAgB,CAAC,WAAW,CAAC,KAAG,OAAO,CAAC,gBAAgB,CAAC,CAMvF;CAEF;AAGD,qBAAa,gBAAiB,YAAW,SAAS,CAAC,WAAW,CAAC;IAE3D,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,QAAQ,CAAC,OAAO,EAAE,eAAe;gBADhB,IAAI,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAC3C,OAAO,EAAE,eAAe;IAGnC,MAAM,CAAC,IAAI,GACT,MAAM,gBAAgB,CAAC,WAAW,CAAC,KAClC,OAAO,CAAC,gBAAgB,CAAC,CAO1B;IAEF,aAAa,IAAI,gBAAgB,CAAC,WAAW,CAAC;IAI9C,WAAW,GACT,SAAS,MAAM,EACf,UAAS,YAA2B,KACnC,OAAO,CAAC,aAAa,CAAC,CAMvB;IAEF,UAAU,IAAI,cAAc;IAO5B,MAAM,CAAC,YAAY,GAAU,MAAM,gBAAgB,CAAC,WAAW,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC,CAMhF;CACH"}
|
|
@@ -1,27 +1,42 @@
|
|
|
1
1
|
import { AddressType } from "../../../utils/src/mod.js";
|
|
2
|
+
import semver from "semver";
|
|
2
3
|
import { optionToActive, } from "../IProvider.js";
|
|
3
4
|
import { getWindow } from "../windows.js";
|
|
5
|
+
const COMPATIBLE_CONNECTOR_API_VERSION = ">=1.0.0";
|
|
6
|
+
const DEFAULT_NETWORK_ID = "undeployed";
|
|
4
7
|
// TODO Implement this class
|
|
5
8
|
export class MidnightConnector {
|
|
6
9
|
provider;
|
|
7
10
|
static INSTANCE = undefined;
|
|
11
|
+
static networkId = DEFAULT_NETWORK_ID;
|
|
8
12
|
static getWalletOptions() {
|
|
9
|
-
const midnightApi = getWindow()
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const options = Object.entries(midnightApi).reduce((options, [key,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
displayName: info.name,
|
|
18
|
-
icon: 'icon' in info ? info.icon : undefined,
|
|
19
|
-
},
|
|
20
|
-
api: info.enable,
|
|
21
|
-
});
|
|
13
|
+
const midnightApi = getWindow()
|
|
14
|
+
?.midnight ?? {};
|
|
15
|
+
console.log("MidnightConnector.getWalletOptions: window.midnight content:", midnightApi);
|
|
16
|
+
const options = Object.entries(midnightApi).reduce((options, [key, api]) => {
|
|
17
|
+
console.log(`MidnightConnector.getWalletOptions: Checking wallet "${key}"`, api);
|
|
18
|
+
if (!isInitialApi(api)) {
|
|
19
|
+
console.log(`MidnightConnector.getWalletOptions: Wallet "${key}" is NOT a valid InitialAPI (missing connect or apiVersion)`);
|
|
20
|
+
return options;
|
|
22
21
|
}
|
|
22
|
+
if (!isCompatibleApiVersion(api.apiVersion)) {
|
|
23
|
+
console.log(`MidnightConnector.getWalletOptions: Wallet "${key}" has incompatible version ${api.apiVersion} (required: ${COMPATIBLE_CONNECTOR_API_VERSION})`);
|
|
24
|
+
return options;
|
|
25
|
+
}
|
|
26
|
+
const name = api.rdns?.trim() || key;
|
|
27
|
+
const displayName = api.name?.trim() || name;
|
|
28
|
+
console.log(`MidnightConnector.getWalletOptions: Wallet "${key}" is COMPATIBLE. Name: ${name}, DisplayName: ${displayName}`);
|
|
29
|
+
options.push({
|
|
30
|
+
metadata: {
|
|
31
|
+
name,
|
|
32
|
+
displayName,
|
|
33
|
+
icon: api.icon,
|
|
34
|
+
},
|
|
35
|
+
api: () => connectWithNetwork(api, MidnightConnector.networkId),
|
|
36
|
+
});
|
|
23
37
|
return options;
|
|
24
38
|
}, []);
|
|
39
|
+
console.log(`MidnightConnector.getWalletOptions: Found ${options.length} compatible wallets`);
|
|
25
40
|
return options;
|
|
26
41
|
}
|
|
27
42
|
static instance() {
|
|
@@ -31,6 +46,9 @@ export class MidnightConnector {
|
|
|
31
46
|
}
|
|
32
47
|
return MidnightConnector.INSTANCE;
|
|
33
48
|
}
|
|
49
|
+
setNetworkId = (networkId) => {
|
|
50
|
+
MidnightConnector.networkId = networkId || DEFAULT_NETWORK_ID;
|
|
51
|
+
};
|
|
34
52
|
getOrThrowProvider = () => {
|
|
35
53
|
if (this.provider == null) {
|
|
36
54
|
throw new Error(`MidnightConnector provider isn't initialized yet`);
|
|
@@ -89,9 +107,12 @@ export class MidnightProvider {
|
|
|
89
107
|
getConnection() {
|
|
90
108
|
return this.conn;
|
|
91
109
|
}
|
|
92
|
-
signMessage = async (message) => {
|
|
93
|
-
|
|
94
|
-
|
|
110
|
+
signMessage = async (message, keyType = "unshielded") => {
|
|
111
|
+
const signature = (await this.conn.api.signData(message, {
|
|
112
|
+
encoding: "text",
|
|
113
|
+
keyType,
|
|
114
|
+
}));
|
|
115
|
+
return signature.signature;
|
|
95
116
|
};
|
|
96
117
|
getAddress() {
|
|
97
118
|
return {
|
|
@@ -100,13 +121,22 @@ export class MidnightProvider {
|
|
|
100
121
|
};
|
|
101
122
|
}
|
|
102
123
|
static fetchAddress = async (conn) => {
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
// encryptionPublicKey : "mn_shield-epk_undeployed1qvqx2dn29ukvgw8p37m0n3a8hhtae93snaqfvg7uy04yam00vjmrkcqtdla9r"
|
|
109
|
-
// encryptionPublicKeyLegacy : "030065366a2f2cc438e18fb6f9c7a7bdd7dc96309f409623dc23ea4eedef64b63b60"
|
|
110
|
-
return state.address;
|
|
124
|
+
const addresses = await conn.api.getShieldedAddresses();
|
|
125
|
+
if (!addresses?.shieldedAddress) {
|
|
126
|
+
throw new Error("Midnight wallet did not return a shielded address");
|
|
127
|
+
}
|
|
128
|
+
return addresses.shieldedAddress;
|
|
111
129
|
};
|
|
112
130
|
}
|
|
131
|
+
const isInitialApi = (api) => {
|
|
132
|
+
return (!!api &&
|
|
133
|
+
typeof api.connect === "function" &&
|
|
134
|
+
typeof api.apiVersion === "string");
|
|
135
|
+
};
|
|
136
|
+
const isCompatibleApiVersion = (apiVersion) => {
|
|
137
|
+
return semver.satisfies(apiVersion, COMPATIBLE_CONNECTOR_API_VERSION, { includePrerelease: true });
|
|
138
|
+
};
|
|
139
|
+
const connectWithNetwork = async (api, networkId) => {
|
|
140
|
+
const connect = api.connect.bind(api);
|
|
141
|
+
return await connect(networkId);
|
|
142
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../../src/wallets/src/midnight/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAGxE,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAUzE;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../../src/wallets/src/midnight/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAGxE,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAUzE;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAe7D"}
|
|
@@ -11,7 +11,9 @@ export async function checkMidnightWalletStatus() {
|
|
|
11
11
|
return { success: true, result: "OK" };
|
|
12
12
|
}
|
|
13
13
|
export async function midnightLoginWrapper(loginInfo) {
|
|
14
|
-
const
|
|
14
|
+
const connector = MidnightConnector.instance();
|
|
15
|
+
connector.setNetworkId(loginInfo.networkId ?? "undeployed");
|
|
16
|
+
const loginResult = await connectInjected("midnightLoginWrapper", loginInfo, connector);
|
|
15
17
|
if (loginResult.success === false) {
|
|
16
18
|
return loginResult;
|
|
17
19
|
}
|
|
@@ -41,7 +41,9 @@ export type LoginInfoMap = {
|
|
|
41
41
|
preferBatchedMode: boolean;
|
|
42
42
|
seed: string;
|
|
43
43
|
};
|
|
44
|
-
[WalletMode.Midnight]: BaseLoginInfo<MidnightApi
|
|
44
|
+
[WalletMode.Midnight]: BaseLoginInfo<MidnightApi> & {
|
|
45
|
+
networkId?: string;
|
|
46
|
+
};
|
|
45
47
|
};
|
|
46
48
|
type ToUnion<T> = {
|
|
47
49
|
[K in keyof T]: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-modes.d.ts","sourceRoot":"","sources":["../../../src/wallets/src/wallet-modes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAEL,KAAK,mBAAmB,EACxB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,MAAM,aAAa,CAAC,GAAG,IAAI;IAC/B,UAAU,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;CACvC,CAAC;AACF,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;QAChD,yFAAyF;QACzF,iBAAiB,EAAE,OAAO,CAAC;QAC3B;;;;;;WAMG;QACH,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,KAAK,CAAC;KACf,CAAC;IACF,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;QACtB,UAAU,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACxC,iBAAiB,EAAE,OAAO,CAAC;KAC5B,CAAC;IACF,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QACpB,UAAU,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACzC,iBAAiB,EAAE,OAAO,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"wallet-modes.d.ts","sourceRoot":"","sources":["../../../src/wallets/src/wallet-modes.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@paimaexample/wallets",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Your package.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"@coderspirit/nominal": "^4.1.1",
|
|
26
26
|
"@foxglove/crc": "^1.0.1",
|
|
27
27
|
"@metamask/providers": "^22.1.0",
|
|
28
|
+
"@midnight-ntwrk/dapp-connector-api": "4.0.0",
|
|
28
29
|
"@perawallet/connect": "^1.4.2",
|
|
29
30
|
"@polkadot/extension-dapp": "^0.58.10",
|
|
30
31
|
"@polkadot/extension-inject": "^0.58.10",
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"mina-signer": "^3.0.7",
|
|
49
50
|
"mqtt": "^5.14.0",
|
|
50
51
|
"mqtt-pattern": "^2.1.0",
|
|
52
|
+
"semver": "^7.7.3",
|
|
51
53
|
"viem": "2.37.3",
|
|
52
54
|
"web3": "^4.16.0",
|
|
53
55
|
"web3-utils": "^4.3.3"
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { type MidnightAddress } from "../../../utils/src/mod.js";
|
|
2
|
+
import type { ConnectedAPI } from "@midnight-ntwrk/dapp-connector-api";
|
|
2
3
|
import { type IInjectedConnector, type ActiveConnection, type IProvider, type AddressAndType, type UserSignature, type IConnector, type ConnectionOption } from "../IProvider.js";
|
|
3
|
-
export type MidnightApi =
|
|
4
|
+
export type MidnightApi = ConnectedAPI;
|
|
4
5
|
export declare class MidnightConnector implements IConnector<MidnightApi>, IInjectedConnector<MidnightApi> {
|
|
5
6
|
private provider;
|
|
6
7
|
private static INSTANCE;
|
|
8
|
+
private static networkId;
|
|
7
9
|
static getWalletOptions(): ConnectionOption<MidnightApi>[];
|
|
8
10
|
static instance(): MidnightConnector;
|
|
11
|
+
setNetworkId: (networkId: string) => void;
|
|
9
12
|
getOrThrowProvider: () => MidnightProvider;
|
|
10
13
|
getProvider: () => undefined | MidnightProvider;
|
|
11
14
|
isConnected(): boolean;
|
|
@@ -19,7 +22,7 @@ export declare class MidnightProvider implements IProvider<MidnightApi> {
|
|
|
19
22
|
constructor(conn: ActiveConnection<MidnightApi>, address: MidnightAddress);
|
|
20
23
|
static init: (conn: ActiveConnection<MidnightApi>) => Promise<MidnightProvider>;
|
|
21
24
|
getConnection(): ActiveConnection<MidnightApi>;
|
|
22
|
-
signMessage: (message: string) => Promise<UserSignature>;
|
|
25
|
+
signMessage: (message: string, keyType?: "unshielded") => Promise<UserSignature>;
|
|
23
26
|
getAddress(): AddressAndType;
|
|
24
27
|
static fetchAddress: (conn: ActiveConnection<MidnightApi>) => Promise<string>;
|
|
25
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midnight.d.ts","sourceRoot":"","sources":["../../../../src/wallets/src/midnight/midnight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"midnight.d.ts","sourceRoot":"","sources":["../../../../src/wallets/src/midnight/midnight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC;AAMvC,qBAAa,iBACX,YAAW,UAAU,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC;IACnE,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4C;IACnE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAsB;IAE9C,MAAM,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE;IA+B1D,MAAM,CAAC,QAAQ,IAAI,iBAAiB;IAQpC,YAAY,GAAI,WAAW,MAAM,KAAG,IAAI,CAEtC;IAEF,kBAAkB,QAAO,gBAAgB,CAKvC;IAEF,WAAW,QAAO,SAAS,GAAG,gBAAgB,CAE5C;IAEF,WAAW,IAAI,OAAO;IAItB,aAAa,QAAa,OAAO,CAAC,gBAAgB,CAAC,CAUjD;IAEF,YAAY,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,gBAAgB,CAAC,CAW7D;IAED,eAAe,GAAU,MAAM,gBAAgB,CAAC,WAAW,CAAC,KAAG,OAAO,CAAC,gBAAgB,CAAC,CAMvF;CAEF;AAGD,qBAAa,gBAAiB,YAAW,SAAS,CAAC,WAAW,CAAC;IAE3D,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,QAAQ,CAAC,OAAO,EAAE,eAAe;gBADhB,IAAI,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAC3C,OAAO,EAAE,eAAe;IAGnC,MAAM,CAAC,IAAI,GACT,MAAM,gBAAgB,CAAC,WAAW,CAAC,KAClC,OAAO,CAAC,gBAAgB,CAAC,CAO1B;IAEF,aAAa,IAAI,gBAAgB,CAAC,WAAW,CAAC;IAI9C,WAAW,GACT,SAAS,MAAM,EACf,UAAS,YAA2B,KACnC,OAAO,CAAC,aAAa,CAAC,CAMvB;IAEF,UAAU,IAAI,cAAc;IAO5B,MAAM,CAAC,YAAY,GAAU,MAAM,gBAAgB,CAAC,WAAW,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC,CAMhF;CACH"}
|
|
@@ -1,30 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.MidnightProvider = exports.MidnightConnector = void 0;
|
|
4
7
|
const mod_js_1 = require("../../../utils/src/mod.js");
|
|
8
|
+
const semver_1 = __importDefault(require("semver"));
|
|
5
9
|
const IProvider_js_1 = require("../IProvider.js");
|
|
6
10
|
const windows_js_1 = require("../windows.js");
|
|
11
|
+
const COMPATIBLE_CONNECTOR_API_VERSION = ">=1.0.0";
|
|
12
|
+
const DEFAULT_NETWORK_ID = "undeployed";
|
|
7
13
|
// TODO Implement this class
|
|
8
14
|
class MidnightConnector {
|
|
9
15
|
provider;
|
|
10
16
|
static INSTANCE = undefined;
|
|
17
|
+
static networkId = DEFAULT_NETWORK_ID;
|
|
11
18
|
static getWalletOptions() {
|
|
12
|
-
const midnightApi = (0, windows_js_1.getWindow)()
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const options = Object.entries(midnightApi).reduce((options, [key,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
displayName: info.name,
|
|
21
|
-
icon: 'icon' in info ? info.icon : undefined,
|
|
22
|
-
},
|
|
23
|
-
api: info.enable,
|
|
24
|
-
});
|
|
19
|
+
const midnightApi = (0, windows_js_1.getWindow)()
|
|
20
|
+
?.midnight ?? {};
|
|
21
|
+
console.log("MidnightConnector.getWalletOptions: window.midnight content:", midnightApi);
|
|
22
|
+
const options = Object.entries(midnightApi).reduce((options, [key, api]) => {
|
|
23
|
+
console.log(`MidnightConnector.getWalletOptions: Checking wallet "${key}"`, api);
|
|
24
|
+
if (!isInitialApi(api)) {
|
|
25
|
+
console.log(`MidnightConnector.getWalletOptions: Wallet "${key}" is NOT a valid InitialAPI (missing connect or apiVersion)`);
|
|
26
|
+
return options;
|
|
25
27
|
}
|
|
28
|
+
if (!isCompatibleApiVersion(api.apiVersion)) {
|
|
29
|
+
console.log(`MidnightConnector.getWalletOptions: Wallet "${key}" has incompatible version ${api.apiVersion} (required: ${COMPATIBLE_CONNECTOR_API_VERSION})`);
|
|
30
|
+
return options;
|
|
31
|
+
}
|
|
32
|
+
const name = api.rdns?.trim() || key;
|
|
33
|
+
const displayName = api.name?.trim() || name;
|
|
34
|
+
console.log(`MidnightConnector.getWalletOptions: Wallet "${key}" is COMPATIBLE. Name: ${name}, DisplayName: ${displayName}`);
|
|
35
|
+
options.push({
|
|
36
|
+
metadata: {
|
|
37
|
+
name,
|
|
38
|
+
displayName,
|
|
39
|
+
icon: api.icon,
|
|
40
|
+
},
|
|
41
|
+
api: () => connectWithNetwork(api, MidnightConnector.networkId),
|
|
42
|
+
});
|
|
26
43
|
return options;
|
|
27
44
|
}, []);
|
|
45
|
+
console.log(`MidnightConnector.getWalletOptions: Found ${options.length} compatible wallets`);
|
|
28
46
|
return options;
|
|
29
47
|
}
|
|
30
48
|
static instance() {
|
|
@@ -34,6 +52,9 @@ class MidnightConnector {
|
|
|
34
52
|
}
|
|
35
53
|
return MidnightConnector.INSTANCE;
|
|
36
54
|
}
|
|
55
|
+
setNetworkId = (networkId) => {
|
|
56
|
+
MidnightConnector.networkId = networkId || DEFAULT_NETWORK_ID;
|
|
57
|
+
};
|
|
37
58
|
getOrThrowProvider = () => {
|
|
38
59
|
if (this.provider == null) {
|
|
39
60
|
throw new Error(`MidnightConnector provider isn't initialized yet`);
|
|
@@ -93,9 +114,12 @@ class MidnightProvider {
|
|
|
93
114
|
getConnection() {
|
|
94
115
|
return this.conn;
|
|
95
116
|
}
|
|
96
|
-
signMessage = async (message) => {
|
|
97
|
-
|
|
98
|
-
|
|
117
|
+
signMessage = async (message, keyType = "unshielded") => {
|
|
118
|
+
const signature = (await this.conn.api.signData(message, {
|
|
119
|
+
encoding: "text",
|
|
120
|
+
keyType,
|
|
121
|
+
}));
|
|
122
|
+
return signature.signature;
|
|
99
123
|
};
|
|
100
124
|
getAddress() {
|
|
101
125
|
return {
|
|
@@ -104,14 +128,23 @@ class MidnightProvider {
|
|
|
104
128
|
};
|
|
105
129
|
}
|
|
106
130
|
static fetchAddress = async (conn) => {
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
// encryptionPublicKey : "mn_shield-epk_undeployed1qvqx2dn29ukvgw8p37m0n3a8hhtae93snaqfvg7uy04yam00vjmrkcqtdla9r"
|
|
113
|
-
// encryptionPublicKeyLegacy : "030065366a2f2cc438e18fb6f9c7a7bdd7dc96309f409623dc23ea4eedef64b63b60"
|
|
114
|
-
return state.address;
|
|
131
|
+
const addresses = await conn.api.getShieldedAddresses();
|
|
132
|
+
if (!addresses?.shieldedAddress) {
|
|
133
|
+
throw new Error("Midnight wallet did not return a shielded address");
|
|
134
|
+
}
|
|
135
|
+
return addresses.shieldedAddress;
|
|
115
136
|
};
|
|
116
137
|
}
|
|
117
138
|
exports.MidnightProvider = MidnightProvider;
|
|
139
|
+
const isInitialApi = (api) => {
|
|
140
|
+
return (!!api &&
|
|
141
|
+
typeof api.connect === "function" &&
|
|
142
|
+
typeof api.apiVersion === "string");
|
|
143
|
+
};
|
|
144
|
+
const isCompatibleApiVersion = (apiVersion) => {
|
|
145
|
+
return semver_1.default.satisfies(apiVersion, COMPATIBLE_CONNECTOR_API_VERSION, { includePrerelease: true });
|
|
146
|
+
};
|
|
147
|
+
const connectWithNetwork = async (api, networkId) => {
|
|
148
|
+
const connect = api.connect.bind(api);
|
|
149
|
+
return await connect(networkId);
|
|
150
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../../src/wallets/src/midnight/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAGxE,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAUzE;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../../src/wallets/src/midnight/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAGxE,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAUzE;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAe7D"}
|
|
@@ -15,7 +15,9 @@ async function checkMidnightWalletStatus() {
|
|
|
15
15
|
return { success: true, result: "OK" };
|
|
16
16
|
}
|
|
17
17
|
async function midnightLoginWrapper(loginInfo) {
|
|
18
|
-
const
|
|
18
|
+
const connector = midnight_js_1.MidnightConnector.instance();
|
|
19
|
+
connector.setNetworkId(loginInfo.networkId ?? "undeployed");
|
|
20
|
+
const loginResult = await (0, wallet_modes_js_1.connectInjected)("midnightLoginWrapper", loginInfo, connector);
|
|
19
21
|
if (loginResult.success === false) {
|
|
20
22
|
return loginResult;
|
|
21
23
|
}
|
|
@@ -41,7 +41,9 @@ export type LoginInfoMap = {
|
|
|
41
41
|
preferBatchedMode: boolean;
|
|
42
42
|
seed: string;
|
|
43
43
|
};
|
|
44
|
-
[WalletMode.Midnight]: BaseLoginInfo<MidnightApi
|
|
44
|
+
[WalletMode.Midnight]: BaseLoginInfo<MidnightApi> & {
|
|
45
|
+
networkId?: string;
|
|
46
|
+
};
|
|
45
47
|
};
|
|
46
48
|
type ToUnion<T> = {
|
|
47
49
|
[K in keyof T]: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-modes.d.ts","sourceRoot":"","sources":["../../../src/wallets/src/wallet-modes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAEL,KAAK,mBAAmB,EACxB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,MAAM,aAAa,CAAC,GAAG,IAAI;IAC/B,UAAU,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;CACvC,CAAC;AACF,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;QAChD,yFAAyF;QACzF,iBAAiB,EAAE,OAAO,CAAC;QAC3B;;;;;;WAMG;QACH,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,KAAK,CAAC;KACf,CAAC;IACF,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;QACtB,UAAU,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACxC,iBAAiB,EAAE,OAAO,CAAC;KAC5B,CAAC;IACF,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QACpB,UAAU,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACzC,iBAAiB,EAAE,OAAO,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"wallet-modes.d.ts","sourceRoot":"","sources":["../../../src/wallets/src/wallet-modes.ts"],"names":[],"mappings":"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"}
|