@aptos-labs/wallet-adapter-core 0.2.2 → 1.0.1
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 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.global.js +93 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +36 -3
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +36 -3
- package/dist/index.mjs.map +1 -0
- package/package.json +12 -12
- package/src/WalletCore.ts +17 -4
- package/src/__tests__/WalletCore.test.ts +11 -0
- package/src/ans.ts +21 -0
- package/src/types.ts +3 -2
package/dist/index.js
CHANGED
|
@@ -184,6 +184,26 @@ function removeLocalStorage() {
|
|
|
184
184
|
localStorage.removeItem(LOCAL_STORAGE_ITEM_KEY);
|
|
185
185
|
}
|
|
186
186
|
|
|
187
|
+
// src/ans.ts
|
|
188
|
+
var ChainIdToAnsContractAddressMap = {
|
|
189
|
+
"1": "mainnet",
|
|
190
|
+
"2": "testnet"
|
|
191
|
+
};
|
|
192
|
+
var getNameByAddress = async (chainId, address) => {
|
|
193
|
+
try {
|
|
194
|
+
if (!ChainIdToAnsContractAddressMap[chainId])
|
|
195
|
+
return null;
|
|
196
|
+
const response = await fetch(
|
|
197
|
+
`https://www.aptosnames.com/api/${ChainIdToAnsContractAddressMap[chainId]}/v1/name/${address}`
|
|
198
|
+
);
|
|
199
|
+
const data = await response.json();
|
|
200
|
+
return data.name;
|
|
201
|
+
} catch (e) {
|
|
202
|
+
console.log("error", e);
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
|
|
187
207
|
// src/WalletCore.ts
|
|
188
208
|
var WalletCore = class extends import_eventemitter3.default {
|
|
189
209
|
constructor(plugins) {
|
|
@@ -231,6 +251,16 @@ var WalletCore = class extends import_eventemitter3.default {
|
|
|
231
251
|
this.setNetwork(null);
|
|
232
252
|
removeLocalStorage();
|
|
233
253
|
}
|
|
254
|
+
async setAnsName() {
|
|
255
|
+
var _a;
|
|
256
|
+
if (((_a = this._network) == null ? void 0 : _a.chainId) && this._account) {
|
|
257
|
+
const name = await getNameByAddress(
|
|
258
|
+
this._network.chainId,
|
|
259
|
+
this._account.address
|
|
260
|
+
);
|
|
261
|
+
this._account.ansName = name;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
234
264
|
setWallet(wallet) {
|
|
235
265
|
this._wallet = wallet;
|
|
236
266
|
}
|
|
@@ -280,7 +310,7 @@ var WalletCore = class extends import_eventemitter3.default {
|
|
|
280
310
|
(wallet) => wallet.name === walletName
|
|
281
311
|
);
|
|
282
312
|
if (!selectedWallet || selectedWallet.readyState !== "Installed" /* Installed */ && selectedWallet.readyState !== "Loadable" /* Loadable */) {
|
|
283
|
-
|
|
313
|
+
return;
|
|
284
314
|
}
|
|
285
315
|
if (this._connected) {
|
|
286
316
|
await this.disconnect();
|
|
@@ -291,6 +321,7 @@ var WalletCore = class extends import_eventemitter3.default {
|
|
|
291
321
|
this.setAccount({ ...account });
|
|
292
322
|
const network = await selectedWallet.network();
|
|
293
323
|
this.setNetwork({ ...network });
|
|
324
|
+
await this.setAnsName();
|
|
294
325
|
setLocalStorage(selectedWallet.name);
|
|
295
326
|
this._connected = true;
|
|
296
327
|
this.emit("connect", account);
|
|
@@ -358,8 +389,9 @@ var WalletCore = class extends import_eventemitter3.default {
|
|
|
358
389
|
var _a;
|
|
359
390
|
try {
|
|
360
391
|
this.doesWalletExist();
|
|
361
|
-
await ((_a = this._wallet) == null ? void 0 : _a.onAccountChange((data) => {
|
|
392
|
+
await ((_a = this._wallet) == null ? void 0 : _a.onAccountChange(async (data) => {
|
|
362
393
|
this.setAccount({ ...data });
|
|
394
|
+
await this.setAnsName();
|
|
363
395
|
this.emit("accountChange", this._account);
|
|
364
396
|
}));
|
|
365
397
|
} catch (error) {
|
|
@@ -371,8 +403,9 @@ var WalletCore = class extends import_eventemitter3.default {
|
|
|
371
403
|
var _a;
|
|
372
404
|
try {
|
|
373
405
|
this.doesWalletExist();
|
|
374
|
-
await ((_a = this._wallet) == null ? void 0 : _a.onNetworkChange((data) => {
|
|
406
|
+
await ((_a = this._wallet) == null ? void 0 : _a.onNetworkChange(async (data) => {
|
|
375
407
|
this.setNetwork({ ...data });
|
|
408
|
+
await this.setAnsName();
|
|
376
409
|
this.emit("networkChange", this._network);
|
|
377
410
|
}));
|
|
378
411
|
} catch (error) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/WalletCore.ts","../src/constants.ts","../src/error/index.ts","../src/utils/scopePollingDetectionStrategy.ts","../src/utils/localStorage.ts"],"sourcesContent":["export { WalletCore } from \"./WalletCore\";\nexport * from \"./types\";\nexport * from \"./constants\";\n","import { HexString, Types } from \"aptos\";\nimport EventEmitter from \"eventemitter3\";\nimport nacl from \"tweetnacl\";\nimport { Buffer } from \"buffer\";\n\nimport { WalletReadyState } from \"./constants\";\nimport {\n WalletAccountChangeError,\n WalletAccountError,\n WalletConnectionError,\n WalletDisconnectionError,\n WalletGetNetworkError,\n WalletNetworkChangeError,\n WalletNotConnectedError,\n WalletNotReadyError,\n WalletNotSelectedError,\n WalletNotSupportedMethod,\n WalletSignAndSubmitMessageError,\n WalletSignMessageAndVerifyError,\n WalletSignMessageError,\n WalletSignTransactionError,\n} from \"./error\";\nimport {\n AccountInfo,\n NetworkInfo,\n WalletName,\n SignMessagePayload,\n SignMessageResponse,\n Wallet,\n WalletInfo,\n WalletCoreEvents,\n} from \"./types\";\nimport {\n removeLocalStorage,\n setLocalStorage,\n scopePollingDetectionStrategy,\n} from \"./utils\";\n\nexport class WalletCore extends EventEmitter<WalletCoreEvents> {\n private _wallets: Wallet[] = [];\n private _wallet: Wallet | null = null;\n private _account: AccountInfo | null = null;\n private _network: NetworkInfo | null = null;\n\n private _connecting: boolean = false;\n private _connected: boolean = false;\n\n constructor(plugins: Wallet[]) {\n super();\n this._wallets = plugins;\n this.scopePollingDetectionStrategy();\n }\n\n private scopePollingDetectionStrategy() {\n this._wallets?.forEach((wallet: Wallet) => {\n if (!wallet.readyState) {\n wallet.readyState =\n typeof window === \"undefined\" || typeof document === \"undefined\"\n ? WalletReadyState.Unsupported\n : WalletReadyState.NotDetected;\n }\n if (typeof window !== \"undefined\") {\n scopePollingDetectionStrategy(() => {\n const providerName = wallet.providerName || wallet.name.toLowerCase();\n if (Object.keys(window).includes(providerName)) {\n wallet.readyState = WalletReadyState.Installed;\n wallet.provider = window[providerName as any];\n this.emit(\"readyStateChange\", wallet);\n return true;\n }\n return false;\n });\n }\n });\n }\n\n private doesWalletExist(): boolean | WalletNotConnectedError {\n if (!this._connected || this._connecting || !this._wallet)\n throw new WalletNotConnectedError().name;\n if (\n !(\n this._wallet.readyState === WalletReadyState.Loadable ||\n this._wallet.readyState === WalletReadyState.Installed\n )\n )\n throw new WalletNotReadyError().name;\n return true;\n }\n\n private clearData() {\n this._connected = false;\n this.setWallet(null);\n this.setAccount(null);\n this.setNetwork(null);\n removeLocalStorage();\n }\n\n setWallet(wallet: Wallet | null) {\n this._wallet = wallet;\n }\n\n setAccount(account: AccountInfo | null) {\n this._account = account;\n }\n\n setNetwork(network: NetworkInfo | null) {\n this._network = network;\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n get wallets(): Wallet[] {\n return this._wallets;\n }\n\n /**\n * Getter for the current connected wallet\n * @return wallet info\n * @throws WalletNotSelectedError\n */\n get wallet(): WalletInfo | null {\n try {\n if (!this._wallet) return null;\n return {\n name: this._wallet.name,\n icon: this._wallet.icon,\n url: this._wallet.url,\n };\n } catch (error: any) {\n throw new WalletNotSelectedError(error).message;\n }\n }\n\n /**\n * Getter for the current connected account\n * @return account info\n * @throws WalletAccountError\n */\n get account(): AccountInfo | null {\n try {\n return this._account;\n } catch (error: any) {\n throw new WalletAccountError(error).message;\n }\n }\n\n /**\n * Getter for the current wallet network\n * @return network info\n * @throws WalletGetNetworkError\n */\n get network(): NetworkInfo | null {\n try {\n return this._network;\n } catch (error: any) {\n throw new WalletGetNetworkError(error).message;\n }\n }\n\n /** \n Connects a wallet to the app. If a wallet is already connected,\n we first disconnect the current connected wallet and then connect the selected wallet.\n On connect success, we set the current account and the network, and keeping the selected wallet\n name in LocalStorage to support autoConnect function.\n\n @param walletName. The wallet name we want to connect as a WalletName type.\n @emit emits \"connect\" event\n @throws WalletConnectionError\n */\n async connect(walletName: WalletName): Promise<void> {\n try {\n const selectedWallet = this._wallets?.find(\n (wallet: Wallet) => wallet.name === walletName\n );\n\n if (\n !selectedWallet ||\n (selectedWallet.readyState !== WalletReadyState.Installed &&\n selectedWallet.readyState !== WalletReadyState.Loadable)\n ) {\n return;\n }\n\n if (this._connected) {\n await this.disconnect();\n }\n this._connecting = true;\n this.setWallet(selectedWallet);\n const account = await selectedWallet.connect();\n this.setAccount({ ...account });\n const network = await selectedWallet.network();\n this.setNetwork({ ...network });\n setLocalStorage(selectedWallet.name);\n this._connected = true;\n this.emit(\"connect\", account);\n } catch (error: any) {\n this.clearData();\n throw new WalletConnectionError(error).message;\n } finally {\n this._connecting = false;\n }\n }\n\n /** \n Disconnect the exisitng wallet. On success, we clear the \n current account, current network and LocalStorage data.\n @emit emits \"disconnect\" event\n @throws WalletDisconnectionError\n */\n async disconnect(): Promise<void> {\n try {\n this.doesWalletExist();\n await this._wallet?.disconnect();\n this.clearData();\n this.emit(\"disconnect\");\n } catch (error: any) {\n throw new WalletDisconnectionError(error).message;\n }\n }\n\n /** \n Sign and submit transaction to chain.\n @param transaction\n @return response from the wallet's signAndSubmitTransaction function\n @throws WalletSignAndSubmitMessageError\n */\n async signAndSubmitTransaction(\n transaction: Types.TransactionPayload\n ): Promise<any> {\n try {\n this.doesWalletExist();\n const response = await this._wallet?.signAndSubmitTransaction(\n transaction\n );\n return response;\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletSignAndSubmitMessageError(errMsg).message;\n }\n }\n\n /** \n Sign transaction (doesnt submit to chain).\n @param transaction\n @return response from the wallet's signTransaction function\n @throws WalletSignTransactionError\n */\n async signTransaction(\n transaction: Types.TransactionPayload\n ): Promise<Uint8Array | null> {\n if (this._wallet && !(\"signTransaction\" in this._wallet)) {\n throw new WalletNotSupportedMethod(\n `Sign Transaction is not supported by ${this.wallet?.name}`\n ).message;\n }\n\n try {\n this.doesWalletExist();\n const response = await (this._wallet as any).signTransaction(transaction);\n return response;\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletSignTransactionError(errMsg).message;\n }\n }\n\n /** \n Sign message (doesnt submit to chain).\n @param message\n @return response from the wallet's signMessage function\n @throws WalletSignMessageError\n */\n async signMessage(\n message: SignMessagePayload\n ): Promise<SignMessageResponse | null> {\n try {\n this.doesWalletExist();\n if (!this._wallet) return null;\n const response = await this._wallet?.signMessage(message);\n return response;\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletSignMessageError(errMsg).message;\n }\n }\n\n /** \n Event for when account has changed on the wallet\n @return the new account info\n @throws WalletAccountChangeError\n */\n async onAccountChange(): Promise<void> {\n try {\n this.doesWalletExist();\n await this._wallet?.onAccountChange((data: AccountInfo) => {\n this.setAccount({ ...data });\n this.emit(\"accountChange\", this._account);\n });\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletAccountChangeError(errMsg).message;\n }\n }\n\n /** \n Event for when network has changed on the wallet\n @return the new network info\n @throws WalletNetworkChangeError\n */\n async onNetworkChange(): Promise<void> {\n try {\n this.doesWalletExist();\n await this._wallet?.onNetworkChange((data: NetworkInfo) => {\n this.setNetwork({ ...data });\n this.emit(\"networkChange\", this._network);\n });\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletNetworkChangeError(errMsg).message;\n }\n }\n\n async signMessageAndVerify(message: SignMessagePayload): Promise<boolean> {\n try {\n this.doesWalletExist();\n if (!this._account) throw new Error(\"No account found!\");\n const response = await this._wallet?.signMessage(message);\n if (!response)\n throw new WalletSignMessageAndVerifyError(\"Failed to sign a message\")\n .message;\n // Verify that the bytes were signed using the private key that matches the known public key\n let verified = false;\n if (Array.isArray(response.signature)) {\n // multi sig wallets\n const { fullMessage, signature, bitmap } = response;\n if (bitmap) {\n const minKeysRequired = this._account.minKeysRequired as number;\n if (signature.length < minKeysRequired) {\n verified = false;\n } else {\n // Getting an array which marks the keys signing the message with 1, while marking 0 for the keys not being used.\n const bits = Array.from(bitmap).flatMap((n) =>\n Array.from({ length: 8 }).map((_, i) => (n >> i) & 1)\n );\n // Filter out indexes of the keys we need\n const index = bits.map((_, i) => i).filter((i) => bits[i]);\n\n const publicKeys = this._account.publicKey as string[];\n const matchedPublicKeys = publicKeys.filter(\n (_: string, i: number) => index.includes(i)\n );\n\n verified = true;\n for (let i = 0; i < signature.length; i++) {\n const isSigVerified = nacl.sign.detached.verify(\n Buffer.from(fullMessage),\n Buffer.from(signature[i], \"hex\"),\n Buffer.from(matchedPublicKeys[i], \"hex\")\n ); // `isSigVerified` should be `true` for every signature\n\n if (!isSigVerified) {\n verified = false;\n break;\n }\n }\n }\n } else {\n throw new WalletSignMessageAndVerifyError(\"Failed to get a bitmap\")\n .message;\n }\n } else {\n // single sig wallets\n // support for when address doesnt have hex prefix (0x)\n const currentAccountPublicKey = new HexString(\n this._account.publicKey as string\n );\n // support for when address doesnt have hex prefix (0x)\n const signature = new HexString(response.signature);\n verified = nacl.sign.detached.verify(\n Buffer.from(response.fullMessage),\n Buffer.from(signature.noPrefix(), \"hex\"),\n Buffer.from(currentAccountPublicKey.noPrefix(), \"hex\")\n );\n }\n return verified;\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletSignMessageAndVerifyError(errMsg).message;\n }\n }\n}\n","export enum WalletReadyState {\n /**\n * User-installable wallets can typically be detected by scanning for an API\n * that they've injected into the global context. If such an API is present,\n * we consider the wallet to have been installed.\n */\n Installed = \"Installed\",\n NotDetected = \"NotDetected\",\n /**\n * Loadable wallets are always available to you. Since you can load them at\n * any time, it's meaningless to say that they have been detected.\n */\n Loadable = \"Loadable\",\n /**\n * If a wallet is not supported on a given platform (eg. server-rendering, or\n * mobile) then it will stay in the `Unsupported` state.\n */\n Unsupported = \"Unsupported\",\n}\n\nexport enum NetworkName {\n Mainnet = \"mainnet\",\n Testnet = \"testnet\",\n Devnet = \"devnet\",\n}\n","export class WalletError extends Error {\n public error: any;\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n constructor(message?: string, error?: any) {\n super(message);\n this.error = error;\n }\n}\n\nexport class WalletNotSelectedError extends WalletError {\n name = \"WalletNotSelectedError\";\n}\n\nexport class WalletNotReadyError extends WalletError {\n name = \"WalletNotReadyError\";\n}\n\nexport class WalletLoadError extends WalletError {\n name = \"WalletLoadError\";\n}\n\nexport class WalletConfigError extends WalletError {\n name = \"WalletConfigError\";\n}\n\nexport class WalletConnectionError extends WalletError {\n name = \"WalletConnectionError\";\n}\n\nexport class WalletDisconnectedError extends WalletError {\n name = \"WalletDisconnectedError\";\n}\n\nexport class WalletDisconnectionError extends WalletError {\n name = \"WalletDisconnectionError\";\n}\n\nexport class WalletAccountError extends WalletError {\n name = \"WalletAccountError\";\n}\nexport class WalletGetNetworkError extends WalletError {\n name = \"WalletGetNetworkError\";\n}\n\nexport class WalletAccountChangeError extends WalletError {\n name = \"WalletAccountChangeError\";\n}\n\nexport class WalletNetworkChangeError extends WalletError {\n name = \"WalletNetworkChangeError\";\n}\n\nexport class WalletPublicKeyError extends WalletError {\n name = \"WalletPublicKeyError\";\n}\n\nexport class WalletKeypairError extends WalletError {\n name = \"WalletKeypairError\";\n}\n\nexport class WalletNotConnectedError extends WalletError {\n name = \"WalletNotConnectedError\";\n}\n\nexport class WalletSendTransactionError extends WalletError {\n name = \"WalletSendTransactionError\";\n}\n\nexport class WalletSignMessageError extends WalletError {\n name = \"WalletSignMessageError\";\n}\n\nexport class WalletSignMessageAndVerifyError extends WalletError {\n name = \"WalletSignMessageAndVerifyError\";\n}\n\nexport class WalletSignAndSubmitMessageError extends WalletError {\n name = \"WalletSignAndSubmitMessageError\";\n}\n\nexport class WalletSignTransactionError extends WalletError {\n name = \"WalletSignTransactionError\";\n}\n\nexport class WalletTimeoutError extends WalletError {\n name = \"WalletTimeoutError\";\n}\n\nexport class WalletWindowBlockedError extends WalletError {\n name = \"WalletWindowBlockedError\";\n}\n\nexport class WalletWindowClosedError extends WalletError {\n name = \"WalletWindowClosedError\";\n}\n\nexport class WalletResponseError extends WalletError {\n name = \"WalletResponseError\";\n}\n\nexport class WalletNotSupportedMethod extends WalletError {\n name = \"WalletNotSupportedMethod\";\n}\n","export function scopePollingDetectionStrategy(detect: () => boolean): void {\n // Early return when server-side rendering\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n\n const disposers: (() => void)[] = [];\n\n function detectAndDispose() {\n const detected = detect();\n if (detected) {\n for (const dispose of disposers) {\n dispose();\n }\n }\n }\n\n // Strategy #1: Try detecting every second.\n const interval =\n // TODO: #334 Replace with idle callback strategy.\n setInterval(detectAndDispose, 1000);\n disposers.push(() => clearInterval(interval));\n\n // Strategy #2: Detect as soon as the DOM becomes 'ready'/'interactive'.\n if (\n // Implies that `DOMContentLoaded` has not yet fired.\n document.readyState === \"loading\"\n ) {\n document.addEventListener(\"DOMContentLoaded\", detectAndDispose, {\n once: true,\n });\n disposers.push(() =>\n document.removeEventListener(\"DOMContentLoaded\", detectAndDispose)\n );\n }\n\n // Strategy #3: Detect after the `window` has fully loaded.\n if (\n // If the `complete` state has been reached, we're too late.\n document.readyState !== \"complete\"\n ) {\n window.addEventListener(\"load\", detectAndDispose, { once: true });\n disposers.push(() => window.removeEventListener(\"load\", detectAndDispose));\n }\n\n // Strategy #4: Detect synchronously, now.\n detectAndDispose();\n}\n","import { WalletName } from \"../types\";\n\nconst LOCAL_STORAGE_ITEM_KEY = \"AptosWalletName\";\n\nexport function setLocalStorage(walletName: WalletName) {\n localStorage.setItem(LOCAL_STORAGE_ITEM_KEY, walletName);\n}\n\nexport function removeLocalStorage() {\n localStorage.removeItem(LOCAL_STORAGE_ITEM_KEY);\n}\n\nexport function getLocalStorage() {\n localStorage.getItem(LOCAL_STORAGE_ITEM_KEY);\n}\n"],"mappings":"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","names":["WalletReadyState","NetworkName","EventEmitter","nacl"]}
|
package/dist/index.mjs
CHANGED
|
@@ -150,6 +150,26 @@ function removeLocalStorage() {
|
|
|
150
150
|
localStorage.removeItem(LOCAL_STORAGE_ITEM_KEY);
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
+
// src/ans.ts
|
|
154
|
+
var ChainIdToAnsContractAddressMap = {
|
|
155
|
+
"1": "mainnet",
|
|
156
|
+
"2": "testnet"
|
|
157
|
+
};
|
|
158
|
+
var getNameByAddress = async (chainId, address) => {
|
|
159
|
+
try {
|
|
160
|
+
if (!ChainIdToAnsContractAddressMap[chainId])
|
|
161
|
+
return null;
|
|
162
|
+
const response = await fetch(
|
|
163
|
+
`https://www.aptosnames.com/api/${ChainIdToAnsContractAddressMap[chainId]}/v1/name/${address}`
|
|
164
|
+
);
|
|
165
|
+
const data = await response.json();
|
|
166
|
+
return data.name;
|
|
167
|
+
} catch (e) {
|
|
168
|
+
console.log("error", e);
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
153
173
|
// src/WalletCore.ts
|
|
154
174
|
var WalletCore = class extends EventEmitter {
|
|
155
175
|
constructor(plugins) {
|
|
@@ -197,6 +217,16 @@ var WalletCore = class extends EventEmitter {
|
|
|
197
217
|
this.setNetwork(null);
|
|
198
218
|
removeLocalStorage();
|
|
199
219
|
}
|
|
220
|
+
async setAnsName() {
|
|
221
|
+
var _a;
|
|
222
|
+
if (((_a = this._network) == null ? void 0 : _a.chainId) && this._account) {
|
|
223
|
+
const name = await getNameByAddress(
|
|
224
|
+
this._network.chainId,
|
|
225
|
+
this._account.address
|
|
226
|
+
);
|
|
227
|
+
this._account.ansName = name;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
200
230
|
setWallet(wallet) {
|
|
201
231
|
this._wallet = wallet;
|
|
202
232
|
}
|
|
@@ -246,7 +276,7 @@ var WalletCore = class extends EventEmitter {
|
|
|
246
276
|
(wallet) => wallet.name === walletName
|
|
247
277
|
);
|
|
248
278
|
if (!selectedWallet || selectedWallet.readyState !== "Installed" /* Installed */ && selectedWallet.readyState !== "Loadable" /* Loadable */) {
|
|
249
|
-
|
|
279
|
+
return;
|
|
250
280
|
}
|
|
251
281
|
if (this._connected) {
|
|
252
282
|
await this.disconnect();
|
|
@@ -257,6 +287,7 @@ var WalletCore = class extends EventEmitter {
|
|
|
257
287
|
this.setAccount({ ...account });
|
|
258
288
|
const network = await selectedWallet.network();
|
|
259
289
|
this.setNetwork({ ...network });
|
|
290
|
+
await this.setAnsName();
|
|
260
291
|
setLocalStorage(selectedWallet.name);
|
|
261
292
|
this._connected = true;
|
|
262
293
|
this.emit("connect", account);
|
|
@@ -324,8 +355,9 @@ var WalletCore = class extends EventEmitter {
|
|
|
324
355
|
var _a;
|
|
325
356
|
try {
|
|
326
357
|
this.doesWalletExist();
|
|
327
|
-
await ((_a = this._wallet) == null ? void 0 : _a.onAccountChange((data) => {
|
|
358
|
+
await ((_a = this._wallet) == null ? void 0 : _a.onAccountChange(async (data) => {
|
|
328
359
|
this.setAccount({ ...data });
|
|
360
|
+
await this.setAnsName();
|
|
329
361
|
this.emit("accountChange", this._account);
|
|
330
362
|
}));
|
|
331
363
|
} catch (error) {
|
|
@@ -337,8 +369,9 @@ var WalletCore = class extends EventEmitter {
|
|
|
337
369
|
var _a;
|
|
338
370
|
try {
|
|
339
371
|
this.doesWalletExist();
|
|
340
|
-
await ((_a = this._wallet) == null ? void 0 : _a.onNetworkChange((data) => {
|
|
372
|
+
await ((_a = this._wallet) == null ? void 0 : _a.onNetworkChange(async (data) => {
|
|
341
373
|
this.setNetwork({ ...data });
|
|
374
|
+
await this.setAnsName();
|
|
342
375
|
this.emit("networkChange", this._network);
|
|
343
376
|
}));
|
|
344
377
|
} catch (error) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/WalletCore.ts","../src/constants.ts","../src/error/index.ts","../src/utils/scopePollingDetectionStrategy.ts","../src/utils/localStorage.ts"],"sourcesContent":["import { HexString, Types } from \"aptos\";\nimport EventEmitter from \"eventemitter3\";\nimport nacl from \"tweetnacl\";\nimport { Buffer } from \"buffer\";\n\nimport { WalletReadyState } from \"./constants\";\nimport {\n WalletAccountChangeError,\n WalletAccountError,\n WalletConnectionError,\n WalletDisconnectionError,\n WalletGetNetworkError,\n WalletNetworkChangeError,\n WalletNotConnectedError,\n WalletNotReadyError,\n WalletNotSelectedError,\n WalletNotSupportedMethod,\n WalletSignAndSubmitMessageError,\n WalletSignMessageAndVerifyError,\n WalletSignMessageError,\n WalletSignTransactionError,\n} from \"./error\";\nimport {\n AccountInfo,\n NetworkInfo,\n WalletName,\n SignMessagePayload,\n SignMessageResponse,\n Wallet,\n WalletInfo,\n WalletCoreEvents,\n} from \"./types\";\nimport {\n removeLocalStorage,\n setLocalStorage,\n scopePollingDetectionStrategy,\n} from \"./utils\";\n\nexport class WalletCore extends EventEmitter<WalletCoreEvents> {\n private _wallets: Wallet[] = [];\n private _wallet: Wallet | null = null;\n private _account: AccountInfo | null = null;\n private _network: NetworkInfo | null = null;\n\n private _connecting: boolean = false;\n private _connected: boolean = false;\n\n constructor(plugins: Wallet[]) {\n super();\n this._wallets = plugins;\n this.scopePollingDetectionStrategy();\n }\n\n private scopePollingDetectionStrategy() {\n this._wallets?.forEach((wallet: Wallet) => {\n if (!wallet.readyState) {\n wallet.readyState =\n typeof window === \"undefined\" || typeof document === \"undefined\"\n ? WalletReadyState.Unsupported\n : WalletReadyState.NotDetected;\n }\n if (typeof window !== \"undefined\") {\n scopePollingDetectionStrategy(() => {\n const providerName = wallet.providerName || wallet.name.toLowerCase();\n if (Object.keys(window).includes(providerName)) {\n wallet.readyState = WalletReadyState.Installed;\n wallet.provider = window[providerName as any];\n this.emit(\"readyStateChange\", wallet);\n return true;\n }\n return false;\n });\n }\n });\n }\n\n private doesWalletExist(): boolean | WalletNotConnectedError {\n if (!this._connected || this._connecting || !this._wallet)\n throw new WalletNotConnectedError().name;\n if (\n !(\n this._wallet.readyState === WalletReadyState.Loadable ||\n this._wallet.readyState === WalletReadyState.Installed\n )\n )\n throw new WalletNotReadyError().name;\n return true;\n }\n\n private clearData() {\n this._connected = false;\n this.setWallet(null);\n this.setAccount(null);\n this.setNetwork(null);\n removeLocalStorage();\n }\n\n setWallet(wallet: Wallet | null) {\n this._wallet = wallet;\n }\n\n setAccount(account: AccountInfo | null) {\n this._account = account;\n }\n\n setNetwork(network: NetworkInfo | null) {\n this._network = network;\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n get wallets(): Wallet[] {\n return this._wallets;\n }\n\n /**\n * Getter for the current connected wallet\n * @return wallet info\n * @throws WalletNotSelectedError\n */\n get wallet(): WalletInfo | null {\n try {\n if (!this._wallet) return null;\n return {\n name: this._wallet.name,\n icon: this._wallet.icon,\n url: this._wallet.url,\n };\n } catch (error: any) {\n throw new WalletNotSelectedError(error).message;\n }\n }\n\n /**\n * Getter for the current connected account\n * @return account info\n * @throws WalletAccountError\n */\n get account(): AccountInfo | null {\n try {\n return this._account;\n } catch (error: any) {\n throw new WalletAccountError(error).message;\n }\n }\n\n /**\n * Getter for the current wallet network\n * @return network info\n * @throws WalletGetNetworkError\n */\n get network(): NetworkInfo | null {\n try {\n return this._network;\n } catch (error: any) {\n throw new WalletGetNetworkError(error).message;\n }\n }\n\n /** \n Connects a wallet to the app. If a wallet is already connected,\n we first disconnect the current connected wallet and then connect the selected wallet.\n On connect success, we set the current account and the network, and keeping the selected wallet\n name in LocalStorage to support autoConnect function.\n\n @param walletName. The wallet name we want to connect as a WalletName type.\n @emit emits \"connect\" event\n @throws WalletConnectionError\n */\n async connect(walletName: WalletName): Promise<void> {\n try {\n const selectedWallet = this._wallets?.find(\n (wallet: Wallet) => wallet.name === walletName\n );\n\n if (\n !selectedWallet ||\n (selectedWallet.readyState !== WalletReadyState.Installed &&\n selectedWallet.readyState !== WalletReadyState.Loadable)\n ) {\n return;\n }\n\n if (this._connected) {\n await this.disconnect();\n }\n this._connecting = true;\n this.setWallet(selectedWallet);\n const account = await selectedWallet.connect();\n this.setAccount({ ...account });\n const network = await selectedWallet.network();\n this.setNetwork({ ...network });\n setLocalStorage(selectedWallet.name);\n this._connected = true;\n this.emit(\"connect\", account);\n } catch (error: any) {\n this.clearData();\n throw new WalletConnectionError(error).message;\n } finally {\n this._connecting = false;\n }\n }\n\n /** \n Disconnect the exisitng wallet. On success, we clear the \n current account, current network and LocalStorage data.\n @emit emits \"disconnect\" event\n @throws WalletDisconnectionError\n */\n async disconnect(): Promise<void> {\n try {\n this.doesWalletExist();\n await this._wallet?.disconnect();\n this.clearData();\n this.emit(\"disconnect\");\n } catch (error: any) {\n throw new WalletDisconnectionError(error).message;\n }\n }\n\n /** \n Sign and submit transaction to chain.\n @param transaction\n @return response from the wallet's signAndSubmitTransaction function\n @throws WalletSignAndSubmitMessageError\n */\n async signAndSubmitTransaction(\n transaction: Types.TransactionPayload\n ): Promise<any> {\n try {\n this.doesWalletExist();\n const response = await this._wallet?.signAndSubmitTransaction(\n transaction\n );\n return response;\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletSignAndSubmitMessageError(errMsg).message;\n }\n }\n\n /** \n Sign transaction (doesnt submit to chain).\n @param transaction\n @return response from the wallet's signTransaction function\n @throws WalletSignTransactionError\n */\n async signTransaction(\n transaction: Types.TransactionPayload\n ): Promise<Uint8Array | null> {\n if (this._wallet && !(\"signTransaction\" in this._wallet)) {\n throw new WalletNotSupportedMethod(\n `Sign Transaction is not supported by ${this.wallet?.name}`\n ).message;\n }\n\n try {\n this.doesWalletExist();\n const response = await (this._wallet as any).signTransaction(transaction);\n return response;\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletSignTransactionError(errMsg).message;\n }\n }\n\n /** \n Sign message (doesnt submit to chain).\n @param message\n @return response from the wallet's signMessage function\n @throws WalletSignMessageError\n */\n async signMessage(\n message: SignMessagePayload\n ): Promise<SignMessageResponse | null> {\n try {\n this.doesWalletExist();\n if (!this._wallet) return null;\n const response = await this._wallet?.signMessage(message);\n return response;\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletSignMessageError(errMsg).message;\n }\n }\n\n /** \n Event for when account has changed on the wallet\n @return the new account info\n @throws WalletAccountChangeError\n */\n async onAccountChange(): Promise<void> {\n try {\n this.doesWalletExist();\n await this._wallet?.onAccountChange((data: AccountInfo) => {\n this.setAccount({ ...data });\n this.emit(\"accountChange\", this._account);\n });\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletAccountChangeError(errMsg).message;\n }\n }\n\n /** \n Event for when network has changed on the wallet\n @return the new network info\n @throws WalletNetworkChangeError\n */\n async onNetworkChange(): Promise<void> {\n try {\n this.doesWalletExist();\n await this._wallet?.onNetworkChange((data: NetworkInfo) => {\n this.setNetwork({ ...data });\n this.emit(\"networkChange\", this._network);\n });\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletNetworkChangeError(errMsg).message;\n }\n }\n\n async signMessageAndVerify(message: SignMessagePayload): Promise<boolean> {\n try {\n this.doesWalletExist();\n if (!this._account) throw new Error(\"No account found!\");\n const response = await this._wallet?.signMessage(message);\n if (!response)\n throw new WalletSignMessageAndVerifyError(\"Failed to sign a message\")\n .message;\n // Verify that the bytes were signed using the private key that matches the known public key\n let verified = false;\n if (Array.isArray(response.signature)) {\n // multi sig wallets\n const { fullMessage, signature, bitmap } = response;\n if (bitmap) {\n const minKeysRequired = this._account.minKeysRequired as number;\n if (signature.length < minKeysRequired) {\n verified = false;\n } else {\n // Getting an array which marks the keys signing the message with 1, while marking 0 for the keys not being used.\n const bits = Array.from(bitmap).flatMap((n) =>\n Array.from({ length: 8 }).map((_, i) => (n >> i) & 1)\n );\n // Filter out indexes of the keys we need\n const index = bits.map((_, i) => i).filter((i) => bits[i]);\n\n const publicKeys = this._account.publicKey as string[];\n const matchedPublicKeys = publicKeys.filter(\n (_: string, i: number) => index.includes(i)\n );\n\n verified = true;\n for (let i = 0; i < signature.length; i++) {\n const isSigVerified = nacl.sign.detached.verify(\n Buffer.from(fullMessage),\n Buffer.from(signature[i], \"hex\"),\n Buffer.from(matchedPublicKeys[i], \"hex\")\n ); // `isSigVerified` should be `true` for every signature\n\n if (!isSigVerified) {\n verified = false;\n break;\n }\n }\n }\n } else {\n throw new WalletSignMessageAndVerifyError(\"Failed to get a bitmap\")\n .message;\n }\n } else {\n // single sig wallets\n // support for when address doesnt have hex prefix (0x)\n const currentAccountPublicKey = new HexString(\n this._account.publicKey as string\n );\n // support for when address doesnt have hex prefix (0x)\n const signature = new HexString(response.signature);\n verified = nacl.sign.detached.verify(\n Buffer.from(response.fullMessage),\n Buffer.from(signature.noPrefix(), \"hex\"),\n Buffer.from(currentAccountPublicKey.noPrefix(), \"hex\")\n );\n }\n return verified;\n } catch (error: any) {\n const errMsg =\n typeof error == \"object\" && \"message\" in error ? error.message : error;\n throw new WalletSignMessageAndVerifyError(errMsg).message;\n }\n }\n}\n","export enum WalletReadyState {\n /**\n * User-installable wallets can typically be detected by scanning for an API\n * that they've injected into the global context. If such an API is present,\n * we consider the wallet to have been installed.\n */\n Installed = \"Installed\",\n NotDetected = \"NotDetected\",\n /**\n * Loadable wallets are always available to you. Since you can load them at\n * any time, it's meaningless to say that they have been detected.\n */\n Loadable = \"Loadable\",\n /**\n * If a wallet is not supported on a given platform (eg. server-rendering, or\n * mobile) then it will stay in the `Unsupported` state.\n */\n Unsupported = \"Unsupported\",\n}\n\nexport enum NetworkName {\n Mainnet = \"mainnet\",\n Testnet = \"testnet\",\n Devnet = \"devnet\",\n}\n","export class WalletError extends Error {\n public error: any;\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n constructor(message?: string, error?: any) {\n super(message);\n this.error = error;\n }\n}\n\nexport class WalletNotSelectedError extends WalletError {\n name = \"WalletNotSelectedError\";\n}\n\nexport class WalletNotReadyError extends WalletError {\n name = \"WalletNotReadyError\";\n}\n\nexport class WalletLoadError extends WalletError {\n name = \"WalletLoadError\";\n}\n\nexport class WalletConfigError extends WalletError {\n name = \"WalletConfigError\";\n}\n\nexport class WalletConnectionError extends WalletError {\n name = \"WalletConnectionError\";\n}\n\nexport class WalletDisconnectedError extends WalletError {\n name = \"WalletDisconnectedError\";\n}\n\nexport class WalletDisconnectionError extends WalletError {\n name = \"WalletDisconnectionError\";\n}\n\nexport class WalletAccountError extends WalletError {\n name = \"WalletAccountError\";\n}\nexport class WalletGetNetworkError extends WalletError {\n name = \"WalletGetNetworkError\";\n}\n\nexport class WalletAccountChangeError extends WalletError {\n name = \"WalletAccountChangeError\";\n}\n\nexport class WalletNetworkChangeError extends WalletError {\n name = \"WalletNetworkChangeError\";\n}\n\nexport class WalletPublicKeyError extends WalletError {\n name = \"WalletPublicKeyError\";\n}\n\nexport class WalletKeypairError extends WalletError {\n name = \"WalletKeypairError\";\n}\n\nexport class WalletNotConnectedError extends WalletError {\n name = \"WalletNotConnectedError\";\n}\n\nexport class WalletSendTransactionError extends WalletError {\n name = \"WalletSendTransactionError\";\n}\n\nexport class WalletSignMessageError extends WalletError {\n name = \"WalletSignMessageError\";\n}\n\nexport class WalletSignMessageAndVerifyError extends WalletError {\n name = \"WalletSignMessageAndVerifyError\";\n}\n\nexport class WalletSignAndSubmitMessageError extends WalletError {\n name = \"WalletSignAndSubmitMessageError\";\n}\n\nexport class WalletSignTransactionError extends WalletError {\n name = \"WalletSignTransactionError\";\n}\n\nexport class WalletTimeoutError extends WalletError {\n name = \"WalletTimeoutError\";\n}\n\nexport class WalletWindowBlockedError extends WalletError {\n name = \"WalletWindowBlockedError\";\n}\n\nexport class WalletWindowClosedError extends WalletError {\n name = \"WalletWindowClosedError\";\n}\n\nexport class WalletResponseError extends WalletError {\n name = \"WalletResponseError\";\n}\n\nexport class WalletNotSupportedMethod extends WalletError {\n name = \"WalletNotSupportedMethod\";\n}\n","export function scopePollingDetectionStrategy(detect: () => boolean): void {\n // Early return when server-side rendering\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n\n const disposers: (() => void)[] = [];\n\n function detectAndDispose() {\n const detected = detect();\n if (detected) {\n for (const dispose of disposers) {\n dispose();\n }\n }\n }\n\n // Strategy #1: Try detecting every second.\n const interval =\n // TODO: #334 Replace with idle callback strategy.\n setInterval(detectAndDispose, 1000);\n disposers.push(() => clearInterval(interval));\n\n // Strategy #2: Detect as soon as the DOM becomes 'ready'/'interactive'.\n if (\n // Implies that `DOMContentLoaded` has not yet fired.\n document.readyState === \"loading\"\n ) {\n document.addEventListener(\"DOMContentLoaded\", detectAndDispose, {\n once: true,\n });\n disposers.push(() =>\n document.removeEventListener(\"DOMContentLoaded\", detectAndDispose)\n );\n }\n\n // Strategy #3: Detect after the `window` has fully loaded.\n if (\n // If the `complete` state has been reached, we're too late.\n document.readyState !== \"complete\"\n ) {\n window.addEventListener(\"load\", detectAndDispose, { once: true });\n disposers.push(() => window.removeEventListener(\"load\", detectAndDispose));\n }\n\n // Strategy #4: Detect synchronously, now.\n detectAndDispose();\n}\n","import { WalletName } from \"../types\";\n\nconst LOCAL_STORAGE_ITEM_KEY = \"AptosWalletName\";\n\nexport function setLocalStorage(walletName: WalletName) {\n localStorage.setItem(LOCAL_STORAGE_ITEM_KEY, walletName);\n}\n\nexport function removeLocalStorage() {\n localStorage.removeItem(LOCAL_STORAGE_ITEM_KEY);\n}\n\nexport function getLocalStorage() {\n localStorage.getItem(LOCAL_STORAGE_ITEM_KEY);\n}\n"],"mappings":"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","names":["WalletReadyState","NetworkName"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aptos-labs/wallet-adapter-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Aptos Wallet Adapter Core",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -27,27 +27,27 @@
|
|
|
27
27
|
"Wallet Adapter",
|
|
28
28
|
"Aptos Wallet"
|
|
29
29
|
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup src/index.ts --format esm,cjs --dts",
|
|
32
|
+
"dev": "tsup src/index.ts --format esm,cjs --watch --dts",
|
|
33
|
+
"test": "jest",
|
|
34
|
+
"lint": "TIMING=1 eslint \"src/**/*.ts*\"",
|
|
35
|
+
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
|
|
36
|
+
},
|
|
30
37
|
"devDependencies": {
|
|
38
|
+
"@aptos-labs/eslint-config-adapter": "workspace:*",
|
|
39
|
+
"@aptos-labs/wallet-adapter-tsconfig": "workspace:*",
|
|
31
40
|
"@types/jest": "^29.2.4",
|
|
32
41
|
"eslint": "^8.15.0",
|
|
33
42
|
"jest": "^29.3.1",
|
|
34
43
|
"ts-jest": "^29.0.3",
|
|
35
44
|
"tsup": "^5.10.1",
|
|
36
|
-
"typescript": "^4.5.3"
|
|
37
|
-
"@aptos-labs/eslint-config-adapter": "0.0.0",
|
|
38
|
-
"@aptos-labs/wallet-adapter-tsconfig": "0.0.0"
|
|
45
|
+
"typescript": "^4.5.3"
|
|
39
46
|
},
|
|
40
47
|
"dependencies": {
|
|
41
48
|
"aptos": "^1.3.17",
|
|
42
49
|
"buffer": "^6.0.3",
|
|
43
50
|
"eventemitter3": "^4.0.7",
|
|
44
51
|
"tweetnacl": "^1.0.3"
|
|
45
|
-
},
|
|
46
|
-
"scripts": {
|
|
47
|
-
"build": "tsup src/index.ts --format esm,cjs --dts",
|
|
48
|
-
"dev": "tsup src/index.ts --format esm,cjs --watch --dts",
|
|
49
|
-
"test": "jest",
|
|
50
|
-
"lint": "TIMING=1 eslint \"src/**/*.ts*\"",
|
|
51
|
-
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
|
|
52
52
|
}
|
|
53
|
-
}
|
|
53
|
+
}
|
package/src/WalletCore.ts
CHANGED
|
@@ -35,6 +35,7 @@ import {
|
|
|
35
35
|
setLocalStorage,
|
|
36
36
|
scopePollingDetectionStrategy,
|
|
37
37
|
} from "./utils";
|
|
38
|
+
import { getNameByAddress } from "./ans";
|
|
38
39
|
|
|
39
40
|
export class WalletCore extends EventEmitter<WalletCoreEvents> {
|
|
40
41
|
private _wallets: Wallet[] = [];
|
|
@@ -95,6 +96,16 @@ export class WalletCore extends EventEmitter<WalletCoreEvents> {
|
|
|
95
96
|
removeLocalStorage();
|
|
96
97
|
}
|
|
97
98
|
|
|
99
|
+
private async setAnsName() {
|
|
100
|
+
if (this._network?.chainId && this._account) {
|
|
101
|
+
const name = await getNameByAddress(
|
|
102
|
+
this._network.chainId,
|
|
103
|
+
this._account.address
|
|
104
|
+
);
|
|
105
|
+
this._account.ansName = name;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
98
109
|
setWallet(wallet: Wallet | null) {
|
|
99
110
|
this._wallet = wallet;
|
|
100
111
|
}
|
|
@@ -180,8 +191,7 @@ export class WalletCore extends EventEmitter<WalletCoreEvents> {
|
|
|
180
191
|
(selectedWallet.readyState !== WalletReadyState.Installed &&
|
|
181
192
|
selectedWallet.readyState !== WalletReadyState.Loadable)
|
|
182
193
|
) {
|
|
183
|
-
|
|
184
|
-
.message;
|
|
194
|
+
return;
|
|
185
195
|
}
|
|
186
196
|
|
|
187
197
|
if (this._connected) {
|
|
@@ -193,6 +203,7 @@ export class WalletCore extends EventEmitter<WalletCoreEvents> {
|
|
|
193
203
|
this.setAccount({ ...account });
|
|
194
204
|
const network = await selectedWallet.network();
|
|
195
205
|
this.setNetwork({ ...network });
|
|
206
|
+
await this.setAnsName();
|
|
196
207
|
setLocalStorage(selectedWallet.name);
|
|
197
208
|
this._connected = true;
|
|
198
209
|
this.emit("connect", account);
|
|
@@ -298,8 +309,9 @@ export class WalletCore extends EventEmitter<WalletCoreEvents> {
|
|
|
298
309
|
async onAccountChange(): Promise<void> {
|
|
299
310
|
try {
|
|
300
311
|
this.doesWalletExist();
|
|
301
|
-
await this._wallet?.onAccountChange((data: AccountInfo) => {
|
|
312
|
+
await this._wallet?.onAccountChange(async (data: AccountInfo) => {
|
|
302
313
|
this.setAccount({ ...data });
|
|
314
|
+
await this.setAnsName();
|
|
303
315
|
this.emit("accountChange", this._account);
|
|
304
316
|
});
|
|
305
317
|
} catch (error: any) {
|
|
@@ -317,8 +329,9 @@ export class WalletCore extends EventEmitter<WalletCoreEvents> {
|
|
|
317
329
|
async onNetworkChange(): Promise<void> {
|
|
318
330
|
try {
|
|
319
331
|
this.doesWalletExist();
|
|
320
|
-
await this._wallet?.onNetworkChange((data: NetworkInfo) => {
|
|
332
|
+
await this._wallet?.onNetworkChange(async (data: NetworkInfo) => {
|
|
321
333
|
this.setNetwork({ ...data });
|
|
334
|
+
await this.setAnsName();
|
|
322
335
|
this.emit("networkChange", this._network);
|
|
323
336
|
});
|
|
324
337
|
} catch (error: any) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AptosAccount } from "aptos";
|
|
2
|
+
import { getNameByAddress } from "../ans";
|
|
2
3
|
import {
|
|
3
4
|
SignMessagePayload,
|
|
4
5
|
SignMessageResponse,
|
|
@@ -104,3 +105,13 @@ describe("signMessageAndVerify", () => {
|
|
|
104
105
|
expect(verified).toBeFalsy();
|
|
105
106
|
});
|
|
106
107
|
});
|
|
108
|
+
|
|
109
|
+
describe("ans", () => {
|
|
110
|
+
it("should fetch the correct name", async () => {
|
|
111
|
+
const name = await getNameByAddress(
|
|
112
|
+
"2",
|
|
113
|
+
"0x54fac6e5d52953c75e749a8ad260bc450cad0b8ed2f06c1e98707879e13956d1"
|
|
114
|
+
);
|
|
115
|
+
expect(name).toBe("adapter");
|
|
116
|
+
});
|
|
117
|
+
});
|
package/src/ans.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const ChainIdToAnsContractAddressMap: Record<string, string> = {
|
|
2
|
+
"1": "mainnet", // mainnet
|
|
3
|
+
"2": "testnet", // testnet
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
export const getNameByAddress = async (
|
|
7
|
+
chainId: string,
|
|
8
|
+
address: string
|
|
9
|
+
): Promise<string | null> => {
|
|
10
|
+
try {
|
|
11
|
+
if (!ChainIdToAnsContractAddressMap[chainId]) return null;
|
|
12
|
+
const response = await fetch(
|
|
13
|
+
`https://www.aptosnames.com/api/${ChainIdToAnsContractAddressMap[chainId]}/v1/name/${address}`
|
|
14
|
+
);
|
|
15
|
+
const data = await response.json();
|
|
16
|
+
return data.name;
|
|
17
|
+
} catch (e) {
|
|
18
|
+
console.log("error", e);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
};
|
package/src/types.ts
CHANGED
|
@@ -14,7 +14,8 @@ export type NetworkInfo = {
|
|
|
14
14
|
export type AccountInfo = {
|
|
15
15
|
address: string;
|
|
16
16
|
publicKey: string | string[];
|
|
17
|
-
minKeysRequired?: number
|
|
17
|
+
minKeysRequired?: number;
|
|
18
|
+
ansName?: string | null;
|
|
18
19
|
};
|
|
19
20
|
|
|
20
21
|
export interface AptosWalletErrorResult {
|
|
@@ -50,7 +51,7 @@ export interface AdapterPluginProps<Name extends string = string> {
|
|
|
50
51
|
name: WalletName<Name>;
|
|
51
52
|
url: string;
|
|
52
53
|
icon: `data:image/${"svg+xml" | "webp" | "png" | "gif"};base64,${string}`;
|
|
53
|
-
providerName?: string
|
|
54
|
+
providerName?: string;
|
|
54
55
|
provider: any;
|
|
55
56
|
connect(): Promise<any>;
|
|
56
57
|
disconnect: () => Promise<any>;
|