From f3b990e909e6d40224d0f802f429d83d18f2b113 Mon Sep 17 00:00:00 2001 From: 0xhardrefresh <0xhardrefresh@protonmail.com> Date: Thu, 21 Nov 2024 13:33:38 +0200 Subject: [PATCH 1/6] init handler v0.5 --- src/helpers/errorHandler/ErrorHandler.ts | 133 ++++++++++++++++++++++ src/helpers/errorHandler/errorRegistry.ts | 74 ++++++++++++ src/helpers/errorHandler/testing.ts | 52 +++++++++ 3 files changed, 259 insertions(+) create mode 100644 src/helpers/errorHandler/ErrorHandler.ts create mode 100644 src/helpers/errorHandler/errorRegistry.ts create mode 100644 src/helpers/errorHandler/testing.ts diff --git a/src/helpers/errorHandler/ErrorHandler.ts b/src/helpers/errorHandler/ErrorHandler.ts new file mode 100644 index 000000000..2a51daebb --- /dev/null +++ b/src/helpers/errorHandler/ErrorHandler.ts @@ -0,0 +1,133 @@ +// errorHandler.js - Централізована логіка обробки помилок +import { errorRegistry } from "./errorRegistry"; +import { AxiosError } from "axios"; + + +// 1. Custom error handler +// 2. Axios (HTTP) error handler +// 3. Metamask, Rabby (EIP-1193, JSON-RPC 2.0) error handler +// 4. + +// https://blog.logrocket.com/understanding-resolving-metamask-error-codes/ +// https://rabby.io/docs/integrating-rabby-wallet/ +// https://www.jsonrpc.org/specification +// https://developer.mozilla.org/ru/docs/Web/HTTP/Status +// https://viem.sh/docs/error-handling.html + +class ErrorHandler { + static handleError(error: Error | AxiosError) { + // Визначення типу помилки + const errorType = this.identifyErrorType(error); + const errorData = errorRegistry[errorType] || errorRegistry.GENERIC_ERROR; + + // Генеруємо повідомлення для користувача + const message = this.getErrorMessage(errorData.template, error.message); + + // Показуємо сповіщення + this.showNotification(message); + + // Логування або інші дії + console.error(`Error code: ${errorData.code}`, error); + } + + // Основна функція, що ідентифікує тип помилки + static identifyErrorType(error) { + const checks = [ + this.identifyMetaMaskError, + this.identifyViemError, + this.identifyAxiosError, + this.identifyCustomThrownError, + ]; + + for (const check of checks) { + const errorType = check(error); + if (errorType) return errorType; + } + + return "GENERIC_ERROR"; + } + + // Функції для перевірки окремих типів помилок + + static identifyEIP1193WalletError(error) { + if (typeof window.ethereum === "undefined") return "WALLET_NOT_INSTALLED"; + + // EIP-1193 специфічні помилки + if (error.code === 4001) return "USER_REJECTION"; // Відхилення транзакції + if (error.code === -32602) return "INVALID_PARAMS"; // Некоректні параметри + if (error.code === -32603) return "INTERNAL_ERROR"; // Внутрішня помилка гаманця + if (error.code === -32000) return "RESOURCE_UNAVAILABLE"; // Ресурс недоступний (зокрема, низький баланс) + + return null; + } + + static identifyMetaMaskError(error) { + if (error.code === 4001) return "USER_REJECTION"; + if (error.message && /wrong network|incorrect network/i.test(error.message)) + return "WRONG_NETWORK"; + if (error.message && /insufficient funds/i.test(error.message)) + return "INSUFFICIENT_FUNDS"; + if ( + error.message && + /failed to connect|connection error/i.test(error.message) + ) + return "WALLET_CONNECTION_ERROR"; + return null; + } + + static identifyViemError(error) { + if (!error.message) return null; + if ( + /contract call failed|invalid argument|timeout|transaction failed|invalid address/i.test( + error.message + ) + ) { + if (/timeout/i.test(error.message)) return "TRANSACTION_TIMEOUT"; + if (/transaction failed/i.test(error.message)) + return "TRANSACTION_FAILED"; + if (/invalid address/i.test(error.message)) return "INVALID_ADDRESS"; + return "CONTRACT_CALL_ERROR"; + } + return null; + } + + static identifyAxiosError(error) { + if (!error.isAxiosError) return null; + if (error.code === "ECONNABORTED") return "AXIOS_TIMEOUT"; + if (!error.response) return "AXIOS_NETWORK_ERROR"; + if (error.response) return "AXIOS_RESPONSE_ERROR"; + return null; + } + + static identifyCustomThrownError(error) { + if (error instanceof Error) return "CUSTOM_THROWN_ERROR"; + return null; + } + + static getErrorMessage(template, messageFromError) { + let finalMessage = template; + if (template.includes("{message}")) { + finalMessage = finalMessage.replace( + "{message}", + messageFromError || "Деталі невідомі" + ); + } + if (template.includes("{statusText}") && messageFromError) { + finalMessage = finalMessage.replace("{statusText}", messageFromError); + } + return finalMessage; + } + + static showNotification(message) { + // Використовуйте свою бібліотеку для нотіфікацій + // Наприклад, Vue Toastification, Toastr, або будь-яку іншу + // Приклад з використанням console.log: + console.log("Notify user:", message); + } + + static addErrorType(key, template, code) { + errorRegistry[key] = { template, code }; + } +} + +export default ErrorHandler; diff --git a/src/helpers/errorHandler/errorRegistry.ts b/src/helpers/errorHandler/errorRegistry.ts new file mode 100644 index 000000000..e19e64057 --- /dev/null +++ b/src/helpers/errorHandler/errorRegistry.ts @@ -0,0 +1,74 @@ +// errorRegistry.js - Реєстр шаблонів помилок +export const errorRegistry = { + // Загальні помилки + GENERIC_ERROR: { + template: "Щось пішло не так. Спробуйте пізніше.", + code: 1000, + }, + NETWORK_ERROR: { + template: "Проблема з мережею. Перевірте підключення до Інтернету.", + code: 1001, + }, + AUTH_ERROR: { + template: "Авторизація не вдалася. Будь ласка, увійдіть заново.", + code: 1002, + }, + CUSTOM_THROWN_ERROR: { + template: "{message}", // Шаблон для помилок, створених через throw new Error + code: 1003, + }, + + // Помилки MetaMask та Rabby + USER_REJECTION: { + template: "Користувач відхилив запит на транзакцію.", + code: 2001, + }, + WRONG_NETWORK: { + template: "Будь ласка, підключіться до правильної мережі.", + code: 2002, + }, + INSUFFICIENT_FUNDS: { + template: "Недостатньо коштів для виконання транзакції.", + code: 2003, + }, + WALLET_CONNECTION_ERROR: { + template: + "Не вдалося підключитися до гаманця. Перевірте підключення та спробуйте знову.", + code: 2004, + }, + + // Помилки Viem + CONTRACT_CALL_ERROR: { + template: + "Помилка виклику функції смарт-контракту. Перевірте параметри і спробуйте знову.", + code: 3001, + }, + TRANSACTION_TIMEOUT: { + template: + "Час очікування підтвердження транзакції закінчився. Будь ласка, спробуйте пізніше.", + code: 3002, + }, + TRANSACTION_FAILED: { + template: "Транзакція не вдалася. Перевірте контракт і спробуйте знову.", + code: 3003, + }, + INVALID_ADDRESS: { + template: "Неправильна адреса. Перевірте і спробуйте знову.", + code: 3004, + }, + + // Помилки Axios + AXIOS_NETWORK_ERROR: { + template: "Помилка мережі при спробі з'єднання з сервером.", + code: 4001, + }, + AXIOS_TIMEOUT: { + template: "Час запиту до сервера вичерпано.", + code: 4002, + }, + AXIOS_RESPONSE_ERROR: { + template: "Сервер повернув помилкову відповідь: {statusText}.", + code: 4003, + }, + // Додавайте нові типи помилок тут +}; diff --git a/src/helpers/errorHandler/testing.ts b/src/helpers/errorHandler/testing.ts new file mode 100644 index 000000000..bc8c837a9 --- /dev/null +++ b/src/helpers/errorHandler/testing.ts @@ -0,0 +1,52 @@ +import axios from "axios"; + +import { getPublicClient } from "@/helpers/chains/getChainsInfo"; +import mimTokenInfo from "@/configs/tokens/mim"; + +import { + writeContractHelper, + simulateContractHelper, + waitForTransactionReceiptHelper, + } from "@/helpers/walletClienHelper"; + +export const testAxiosError = async () => { + return axios + .get("https://jsonplaceholder.typicode.com/posts/1") + .catch((error) => { + console.log(error); + }); +}; + +export const testCustomError = async () => { + throw new Error("Custom error"); +}; + +export const testReadContractError = async () => { + const chainId = 1; + const publicClient = getPublicClient(chainId); + + const mimInfo = mimTokenInfo.find((token) => token.chainId === chainId); + + const result = await publicClient.readContract({ + address: mimInfo!.address, + abi: mimInfo!.abi as any, + functionName: "method", + args: [], + }); + + console.log(result); +}; + +export const testWriteContractError = async () => { + const { request } = await simulateContractHelper({ + ...contract, + functionName: "approve", + args: [spender, allowanceValue], + }); + + const hash = await writeContractHelper(request); + + await waitForTransactionReceiptHelper({ + hash, + }); +}; From e1c78cdfb3542bf184d9762b09d4168f5018c099 Mon Sep 17 00:00:00 2001 From: 0xhardrefresh <0xhardrefresh@protonmail.com> Date: Fri, 22 Nov 2024 16:32:48 +0200 Subject: [PATCH 2/6] custom and viem errors identify --- src/App.vue | 22 ++++++ src/helpers/errorHandler/ErrorHandler.ts | 87 ++++------------------- src/helpers/errorHandler/errorRegistry.ts | 75 +++---------------- src/helpers/errorHandler/testing.ts | 12 +++- 4 files changed, 51 insertions(+), 145 deletions(-) diff --git a/src/App.vue b/src/App.vue index b7e2e7dcd..42847b04b 100644 --- a/src/App.vue +++ b/src/App.vue @@ -24,6 +24,10 @@ import { mapGetters } from "vuex"; import { defineAsyncComponent } from "vue"; import axios from "axios"; + +// import ErrorHandler from "./helpers/errorHandler/ErrorHandler"; +// import {testCustomError, testReadContractError} from "./helpers/errorHandler/testing"; + export default { data() { return { @@ -109,6 +113,24 @@ export default { import("@/components/tenderly/TenderlyMod.vue") ), }, + + // async created() { + // console.log("Start testing"); + // try { + // await testReadContractError(); + // } catch (error) { + // console.log("Cath Handler:", { + // error: error, + // isAxiosError: error.isAxiosError, + // code: error.code, + // message: error.message, + // response: error.response, + // name: error.name, + // }) + // ErrorHandler.handleError(error); + // } + + // }, }; diff --git a/src/helpers/errorHandler/ErrorHandler.ts b/src/helpers/errorHandler/ErrorHandler.ts index 2a51daebb..dff28096d 100644 --- a/src/helpers/errorHandler/ErrorHandler.ts +++ b/src/helpers/errorHandler/ErrorHandler.ts @@ -1,6 +1,7 @@ // errorHandler.js - Централізована логіка обробки помилок import { errorRegistry } from "./errorRegistry"; import { AxiosError } from "axios"; +import { BaseError } from "viem"; // 1. Custom error handler @@ -15,28 +16,24 @@ import { AxiosError } from "axios"; // https://viem.sh/docs/error-handling.html class ErrorHandler { - static handleError(error: Error | AxiosError) { + static handleError(error: Error) { + console.log("handleError:") // Визначення типу помилки const errorType = this.identifyErrorType(error); const errorData = errorRegistry[errorType] || errorRegistry.GENERIC_ERROR; // Генеруємо повідомлення для користувача - const message = this.getErrorMessage(errorData.template, error.message); - - // Показуємо сповіщення - this.showNotification(message); + const message = this.getErrorMessage(errorData.template, error.shortMessage ? error.shortMessage : error.message); // Логування або інші дії - console.error(`Error code: ${errorData.code}`, error); + console.log(`Error:`, {errorType, errorData, message}); } // Основна функція, що ідентифікує тип помилки - static identifyErrorType(error) { + static identifyErrorType(error: Error) { const checks = [ - this.identifyMetaMaskError, - this.identifyViemError, - this.identifyAxiosError, this.identifyCustomThrownError, + this.identifyViemError, ]; for (const check of checks) { @@ -47,60 +44,13 @@ class ErrorHandler { return "GENERIC_ERROR"; } - // Функції для перевірки окремих типів помилок - - static identifyEIP1193WalletError(error) { - if (typeof window.ethereum === "undefined") return "WALLET_NOT_INSTALLED"; - - // EIP-1193 специфічні помилки - if (error.code === 4001) return "USER_REJECTION"; // Відхилення транзакції - if (error.code === -32602) return "INVALID_PARAMS"; // Некоректні параметри - if (error.code === -32603) return "INTERNAL_ERROR"; // Внутрішня помилка гаманця - if (error.code === -32000) return "RESOURCE_UNAVAILABLE"; // Ресурс недоступний (зокрема, низький баланс) - - return null; - } - - static identifyMetaMaskError(error) { - if (error.code === 4001) return "USER_REJECTION"; - if (error.message && /wrong network|incorrect network/i.test(error.message)) - return "WRONG_NETWORK"; - if (error.message && /insufficient funds/i.test(error.message)) - return "INSUFFICIENT_FUNDS"; - if ( - error.message && - /failed to connect|connection error/i.test(error.message) - ) - return "WALLET_CONNECTION_ERROR"; + static identifyCustomThrownError(error: Error) { + if (error.message?.includes("CUSTOM")) return error.message; return null; } static identifyViemError(error) { - if (!error.message) return null; - if ( - /contract call failed|invalid argument|timeout|transaction failed|invalid address/i.test( - error.message - ) - ) { - if (/timeout/i.test(error.message)) return "TRANSACTION_TIMEOUT"; - if (/transaction failed/i.test(error.message)) - return "TRANSACTION_FAILED"; - if (/invalid address/i.test(error.message)) return "INVALID_ADDRESS"; - return "CONTRACT_CALL_ERROR"; - } - return null; - } - - static identifyAxiosError(error) { - if (!error.isAxiosError) return null; - if (error.code === "ECONNABORTED") return "AXIOS_TIMEOUT"; - if (!error.response) return "AXIOS_NETWORK_ERROR"; - if (error.response) return "AXIOS_RESPONSE_ERROR"; - return null; - } - - static identifyCustomThrownError(error) { - if (error instanceof Error) return "CUSTOM_THROWN_ERROR"; + if (error.version?.includes("viem")) return "VIEM_ERROR"; return null; } @@ -109,24 +59,11 @@ class ErrorHandler { if (template.includes("{message}")) { finalMessage = finalMessage.replace( "{message}", - messageFromError || "Деталі невідомі" + messageFromError || "Details not provided." ); } - if (template.includes("{statusText}") && messageFromError) { - finalMessage = finalMessage.replace("{statusText}", messageFromError); - } - return finalMessage; - } - static showNotification(message) { - // Використовуйте свою бібліотеку для нотіфікацій - // Наприклад, Vue Toastification, Toastr, або будь-яку іншу - // Приклад з використанням console.log: - console.log("Notify user:", message); - } - - static addErrorType(key, template, code) { - errorRegistry[key] = { template, code }; + return finalMessage; } } diff --git a/src/helpers/errorHandler/errorRegistry.ts b/src/helpers/errorHandler/errorRegistry.ts index e19e64057..165560438 100644 --- a/src/helpers/errorHandler/errorRegistry.ts +++ b/src/helpers/errorHandler/errorRegistry.ts @@ -1,74 +1,15 @@ -// errorRegistry.js - Реєстр шаблонів помилок export const errorRegistry = { - // Загальні помилки GENERIC_ERROR: { - template: "Щось пішло не так. Спробуйте пізніше.", - code: 1000, - }, - NETWORK_ERROR: { - template: "Проблема з мережею. Перевірте підключення до Інтернету.", - code: 1001, - }, - AUTH_ERROR: { - template: "Авторизація не вдалася. Будь ласка, увійдіть заново.", - code: 1002, - }, - CUSTOM_THROWN_ERROR: { - template: "{message}", // Шаблон для помилок, створених через throw new Error - code: 1003, - }, - - // Помилки MetaMask та Rabby - USER_REJECTION: { - template: "Користувач відхилив запит на транзакцію.", - code: 2001, - }, - WRONG_NETWORK: { - template: "Будь ласка, підключіться до правильної мережі.", - code: 2002, - }, - INSUFFICIENT_FUNDS: { - template: "Недостатньо коштів для виконання транзакції.", - code: 2003, - }, - WALLET_CONNECTION_ERROR: { - template: - "Не вдалося підключитися до гаманця. Перевірте підключення та спробуйте знову.", - code: 2004, + template: "Something went wrong. Please try again later.", }, - // Помилки Viem - CONTRACT_CALL_ERROR: { - template: - "Помилка виклику функції смарт-контракту. Перевірте параметри і спробуйте знову.", - code: 3001, - }, - TRANSACTION_TIMEOUT: { - template: - "Час очікування підтвердження транзакції закінчився. Будь ласка, спробуйте пізніше.", - code: 3002, - }, - TRANSACTION_FAILED: { - template: "Транзакція не вдалася. Перевірте контракт і спробуйте знову.", - code: 3003, - }, - INVALID_ADDRESS: { - template: "Неправильна адреса. Перевірте і спробуйте знову.", - code: 3004, + // Custom errors___________________ + CUSTOM_TEST_ERROR: { + template: "Example of custom errors.", }, + //_________________________________ - // Помилки Axios - AXIOS_NETWORK_ERROR: { - template: "Помилка мережі при спробі з'єднання з сервером.", - code: 4001, - }, - AXIOS_TIMEOUT: { - template: "Час запиту до сервера вичерпано.", - code: 4002, - }, - AXIOS_RESPONSE_ERROR: { - template: "Сервер повернув помилкову відповідь: {statusText}.", - code: 4003, - }, - // Додавайте нові типи помилок тут + VIEM_ERROR: { + template: "{message}", + } }; diff --git a/src/helpers/errorHandler/testing.ts b/src/helpers/errorHandler/testing.ts index bc8c837a9..02b292f99 100644 --- a/src/helpers/errorHandler/testing.ts +++ b/src/helpers/errorHandler/testing.ts @@ -10,15 +10,21 @@ import { } from "@/helpers/walletClienHelper"; export const testAxiosError = async () => { + const goodExample = "https://jsonplaceholder.typicode.com/pos/1"; + const badExample = "https://subgraph.satsuma-prod.com/3b2ced13c8d9/gmx/synthetics-arbitrum-stats/apid"; return axios - .get("https://jsonplaceholder.typicode.com/posts/1") + .get("https://api.yexporter.io/v1/chains/1/vaults/all") .catch((error) => { + console.log(error.isAxiosError); + console.log(error.code); + console.log(error.message); + console.log(error.response); console.log(error); }); }; export const testCustomError = async () => { - throw new Error("Custom error"); + throw new Error("CUSTOM_TEST_ERROR"); }; export const testReadContractError = async () => { @@ -30,7 +36,7 @@ export const testReadContractError = async () => { const result = await publicClient.readContract({ address: mimInfo!.address, abi: mimInfo!.abi as any, - functionName: "method", + functionName: "ddd", args: [], }); From 3b23d4dfc155c148ee727775b29cc23f7df0a686 Mon Sep 17 00:00:00 2001 From: 0xhardrefresh <0xhardrefresh@protonmail.com> Date: Mon, 25 Nov 2024 15:22:51 +0200 Subject: [PATCH 3/6] added identifyAxiosError to ErrorHandler --- src/App.vue | 36 +++++++++---------- src/helpers/errorHandler/ErrorHandler.ts | 6 +++- src/helpers/errorHandler/errorRegistry.ts | 10 ++++++ src/helpers/errorHandler/testing.ts | 43 ++++++++++------------- 4 files changed, 51 insertions(+), 44 deletions(-) diff --git a/src/App.vue b/src/App.vue index 42847b04b..2fce472e4 100644 --- a/src/App.vue +++ b/src/App.vue @@ -25,8 +25,8 @@ import { mapGetters } from "vuex"; import { defineAsyncComponent } from "vue"; import axios from "axios"; -// import ErrorHandler from "./helpers/errorHandler/ErrorHandler"; -// import {testCustomError, testReadContractError} from "./helpers/errorHandler/testing"; +import ErrorHandler from "./helpers/errorHandler/ErrorHandler"; +import {testCustomError, testReadContractError, testAxiosError} from "./helpers/errorHandler/testing"; export default { data() { @@ -114,23 +114,23 @@ export default { ), }, - // async created() { - // console.log("Start testing"); - // try { - // await testReadContractError(); - // } catch (error) { - // console.log("Cath Handler:", { - // error: error, - // isAxiosError: error.isAxiosError, - // code: error.code, - // message: error.message, - // response: error.response, - // name: error.name, - // }) - // ErrorHandler.handleError(error); - // } + async created() { + console.log("Start testing"); + try { + await testAxiosError(); + } catch (error) { + console.log("Cath Handler:", { + error: error, + isAxiosError: error.isAxiosError, + code: error.code, + message: error.message, + response: error.response, + name: error.name, + }) + ErrorHandler.handleError(error); + } - // }, + }, }; diff --git a/src/helpers/errorHandler/ErrorHandler.ts b/src/helpers/errorHandler/ErrorHandler.ts index dff28096d..e72daaf96 100644 --- a/src/helpers/errorHandler/ErrorHandler.ts +++ b/src/helpers/errorHandler/ErrorHandler.ts @@ -3,7 +3,6 @@ import { errorRegistry } from "./errorRegistry"; import { AxiosError } from "axios"; import { BaseError } from "viem"; - // 1. Custom error handler // 2. Axios (HTTP) error handler // 3. Metamask, Rabby (EIP-1193, JSON-RPC 2.0) error handler @@ -54,6 +53,11 @@ class ErrorHandler { return null; } + static identifyAxiosError(error) { + if (error.isAxios) return "AXIOS_ERROR"; + return null; + } + static getErrorMessage(template, messageFromError) { let finalMessage = template; if (template.includes("{message}")) { diff --git a/src/helpers/errorHandler/errorRegistry.ts b/src/helpers/errorHandler/errorRegistry.ts index 165560438..3b3c6a79d 100644 --- a/src/helpers/errorHandler/errorRegistry.ts +++ b/src/helpers/errorHandler/errorRegistry.ts @@ -1,3 +1,9 @@ +type AbraError = { + template: string; + isDevOnly?: boolean; + isShowToUser?: boolean; +} + export const errorRegistry = { GENERIC_ERROR: { template: "Something went wrong. Please try again later.", @@ -11,5 +17,9 @@ export const errorRegistry = { VIEM_ERROR: { template: "{message}", + }, + + AXIOS_ERROR: { + template: "Axios error", } }; diff --git a/src/helpers/errorHandler/testing.ts b/src/helpers/errorHandler/testing.ts index 02b292f99..92818b88b 100644 --- a/src/helpers/errorHandler/testing.ts +++ b/src/helpers/errorHandler/testing.ts @@ -4,23 +4,16 @@ import { getPublicClient } from "@/helpers/chains/getChainsInfo"; import mimTokenInfo from "@/configs/tokens/mim"; import { - writeContractHelper, - simulateContractHelper, - waitForTransactionReceiptHelper, - } from "@/helpers/walletClienHelper"; + writeContractHelper, + simulateContractHelper, + waitForTransactionReceiptHelper, +} from "@/helpers/walletClienHelper"; export const testAxiosError = async () => { const goodExample = "https://jsonplaceholder.typicode.com/pos/1"; - const badExample = "https://subgraph.satsuma-prod.com/3b2ced13c8d9/gmx/synthetics-arbitrum-stats/apid"; - return axios - .get("https://api.yexporter.io/v1/chains/1/vaults/all") - .catch((error) => { - console.log(error.isAxiosError); - console.log(error.code); - console.log(error.message); - console.log(error.response); - console.log(error); - }); + const badExample = + "https://subgraph.satsuma-prod.com/3b2ced13c8d9/gmx/synthetics-arbitrum-stats/apid"; + return await axios.get(badExample); }; export const testCustomError = async () => { @@ -44,15 +37,15 @@ export const testReadContractError = async () => { }; export const testWriteContractError = async () => { - const { request } = await simulateContractHelper({ - ...contract, - functionName: "approve", - args: [spender, allowanceValue], - }); - - const hash = await writeContractHelper(request); - - await waitForTransactionReceiptHelper({ - hash, - }); + const { request } = await simulateContractHelper({ + ...contract, + functionName: "approve", + args: [spender, allowanceValue], + }); + + const hash = await writeContractHelper(request); + + await waitForTransactionReceiptHelper({ + hash, + }); }; From 5f182e8727a5f6b55e2fbffc9a80230064bbcb1c Mon Sep 17 00:00:00 2001 From: 0xhardrefresh <0xhardrefresh@protonmail.com> Date: Thu, 28 Nov 2024 13:24:13 +0200 Subject: [PATCH 4/6] ErrorHandler v1 --- src/helpers/errorHandler/ErrorHandler.ts | 53 +++++++++++------------ src/helpers/errorHandler/errorRegistry.ts | 2 +- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/helpers/errorHandler/ErrorHandler.ts b/src/helpers/errorHandler/ErrorHandler.ts index e72daaf96..f7a00cc34 100644 --- a/src/helpers/errorHandler/ErrorHandler.ts +++ b/src/helpers/errorHandler/ErrorHandler.ts @@ -1,39 +1,27 @@ -// errorHandler.js - Централізована логіка обробки помилок import { errorRegistry } from "./errorRegistry"; -import { AxiosError } from "axios"; -import { BaseError } from "viem"; - -// 1. Custom error handler -// 2. Axios (HTTP) error handler -// 3. Metamask, Rabby (EIP-1193, JSON-RPC 2.0) error handler -// 4. - -// https://blog.logrocket.com/understanding-resolving-metamask-error-codes/ -// https://rabby.io/docs/integrating-rabby-wallet/ -// https://www.jsonrpc.org/specification -// https://developer.mozilla.org/ru/docs/Web/HTTP/Status -// https://viem.sh/docs/error-handling.html +import store from "@/store"; class ErrorHandler { static handleError(error: Error) { - console.log("handleError:") - // Визначення типу помилки const errorType = this.identifyErrorType(error); + + //@ts-ignore const errorData = errorRegistry[errorType] || errorRegistry.GENERIC_ERROR; - // Генеруємо повідомлення для користувача - const message = this.getErrorMessage(errorData.template, error.shortMessage ? error.shortMessage : error.message); + const message = this.getErrorMessage( + errorData.template, + //@ts-ignore + error.shortMessage ? error.shortMessage : error.message + ); + + // Show error notification + this.setErrorNotifictiom(message); - // Логування або інші дії - console.log(`Error:`, {errorType, errorData, message}); + console.log(`Error:`, { errorType, errorData, message }); } - // Основна функція, що ідентифікує тип помилки static identifyErrorType(error: Error) { - const checks = [ - this.identifyCustomThrownError, - this.identifyViemError, - ]; + const checks = [this.identifyCustomThrownError, this.identifyViemError]; for (const check of checks) { const errorType = check(error); @@ -48,17 +36,17 @@ class ErrorHandler { return null; } - static identifyViemError(error) { + static identifyViemError(error: any) { if (error.version?.includes("viem")) return "VIEM_ERROR"; return null; } - static identifyAxiosError(error) { + static identifyAxiosError(error: any) { if (error.isAxios) return "AXIOS_ERROR"; return null; } - static getErrorMessage(template, messageFromError) { + static getErrorMessage(template: string, messageFromError: string) { let finalMessage = template; if (template.includes("{message}")) { finalMessage = finalMessage.replace( @@ -69,6 +57,15 @@ class ErrorHandler { return finalMessage; } + + static setErrorNotifictiom(message: string) { + store.commit("notifications/deleteAll"); + + store.dispatch("notifications/new", { + msg: message, + type: "error", + }); + } } export default ErrorHandler; diff --git a/src/helpers/errorHandler/errorRegistry.ts b/src/helpers/errorHandler/errorRegistry.ts index 3b3c6a79d..61007db07 100644 --- a/src/helpers/errorHandler/errorRegistry.ts +++ b/src/helpers/errorHandler/errorRegistry.ts @@ -6,7 +6,7 @@ type AbraError = { export const errorRegistry = { GENERIC_ERROR: { - template: "Something went wrong. Please try again later.", + template: "Something went wrong.", }, // Custom errors___________________ From 3b9cbfb5e6b9362c46337a59a613bcb5942d6f63 Mon Sep 17 00:00:00 2001 From: 0xhardrefresh <0xhardrefresh@protonmail.com> Date: Thu, 28 Nov 2024 13:26:14 +0200 Subject: [PATCH 5/6] remove testing code --- src/App.vue | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/src/App.vue b/src/App.vue index 2fce472e4..30500ac53 100644 --- a/src/App.vue +++ b/src/App.vue @@ -25,9 +25,6 @@ import { mapGetters } from "vuex"; import { defineAsyncComponent } from "vue"; import axios from "axios"; -import ErrorHandler from "./helpers/errorHandler/ErrorHandler"; -import {testCustomError, testReadContractError, testAxiosError} from "./helpers/errorHandler/testing"; - export default { data() { return { @@ -113,24 +110,6 @@ export default { import("@/components/tenderly/TenderlyMod.vue") ), }, - - async created() { - console.log("Start testing"); - try { - await testAxiosError(); - } catch (error) { - console.log("Cath Handler:", { - error: error, - isAxiosError: error.isAxiosError, - code: error.code, - message: error.message, - response: error.response, - name: error.name, - }) - ErrorHandler.handleError(error); - } - - }, }; From edf6f41c34a85bed39196a256f62345eea4e9658 Mon Sep 17 00:00:00 2001 From: 0xhardrefresh <0xhardrefresh@protonmail.com> Date: Thu, 28 Nov 2024 13:28:59 +0200 Subject: [PATCH 6/6] delete testing file --- src/helpers/errorHandler/testing.ts | 51 ----------------------------- 1 file changed, 51 deletions(-) delete mode 100644 src/helpers/errorHandler/testing.ts diff --git a/src/helpers/errorHandler/testing.ts b/src/helpers/errorHandler/testing.ts deleted file mode 100644 index 92818b88b..000000000 --- a/src/helpers/errorHandler/testing.ts +++ /dev/null @@ -1,51 +0,0 @@ -import axios from "axios"; - -import { getPublicClient } from "@/helpers/chains/getChainsInfo"; -import mimTokenInfo from "@/configs/tokens/mim"; - -import { - writeContractHelper, - simulateContractHelper, - waitForTransactionReceiptHelper, -} from "@/helpers/walletClienHelper"; - -export const testAxiosError = async () => { - const goodExample = "https://jsonplaceholder.typicode.com/pos/1"; - const badExample = - "https://subgraph.satsuma-prod.com/3b2ced13c8d9/gmx/synthetics-arbitrum-stats/apid"; - return await axios.get(badExample); -}; - -export const testCustomError = async () => { - throw new Error("CUSTOM_TEST_ERROR"); -}; - -export const testReadContractError = async () => { - const chainId = 1; - const publicClient = getPublicClient(chainId); - - const mimInfo = mimTokenInfo.find((token) => token.chainId === chainId); - - const result = await publicClient.readContract({ - address: mimInfo!.address, - abi: mimInfo!.abi as any, - functionName: "ddd", - args: [], - }); - - console.log(result); -}; - -export const testWriteContractError = async () => { - const { request } = await simulateContractHelper({ - ...contract, - functionName: "approve", - args: [spender, allowanceValue], - }); - - const hash = await writeContractHelper(request); - - await waitForTransactionReceiptHelper({ - hash, - }); -};