From 244b6df76a8e7bf672d0e7c9af20cd109bbbba0d Mon Sep 17 00:00:00 2001 From: Github Actions Date: Mon, 22 Jan 2024 15:09:34 +0200 Subject: [PATCH 01/16] add idb logger --- package.json | 2 +- src/AppStore.ts | 16 ++- src/logger/IndexedDBLogger.factory.ts | 9 ++ src/logger/IndexedDBLogger.ts | 195 ++++++++++++++++++++++++++ yarn.lock | 22 +-- 5 files changed, 219 insertions(+), 25 deletions(-) create mode 100644 src/logger/IndexedDBLogger.factory.ts create mode 100644 src/logger/IndexedDBLogger.ts diff --git a/package.json b/package.json index 6e3a90d..08d57a8 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "preview": "vite preview" }, "dependencies": { - "@fireblocks/ncw-js-sdk": "10.0.7", + "@fireblocks/ncw-js-sdk": "11.0.0-rc.2", "base58-js": "^2.0.0", "classnames": "^2.3.2", "js-base64": "^3.7.5", diff --git a/src/AppStore.ts b/src/AppStore.ts index 7221185..9bf1b40 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -1,7 +1,8 @@ import { - ConsoleLogger, - FireblocksNCW, + ConsoleLoggerFactory, + FireblocksNCWFactory, IEventsHandler, + IFireblocksNCW, IJoinWalletEvent, IKeyBackupEvent, IKeyDescriptor, @@ -11,6 +12,7 @@ import { TEnv, TEvent, TMPCAlgorithm, + version, } from "@fireblocks/ncw-js-sdk"; import { create } from "zustand"; import { IAppState, IPassphraseInfo, TPassphrases, TAppMode, INewTransactionData } from "./IAppState"; @@ -21,6 +23,7 @@ import { PasswordEncryptedLocalStorage } from "./services/PasswordEncryptedLocal import { IAuthManager } from "./auth/IAuthManager"; import { FirebaseAuthManager } from "./auth/FirebaseAuthManager"; import { decode } from "js-base64"; +import { IndexedDBLoggerFactory } from "./logger/IndexedDBLogger.factory"; export type TAsyncActionStatus = "not_started" | "started" | "success" | "failed"; export type TFireblocksNCWStatus = "sdk_not_ready" | "initializing_sdk" | "sdk_available" | "sdk_initialization_failed"; @@ -29,7 +32,7 @@ export type TRequestDecodedData = { email: string; requestId: string; platform: export const useAppStore = create()((set, get) => { let apiService: ApiService | null = null; let txsUnsubscriber: (() => void) | null = null; - let fireblocksNCW: FireblocksNCW | null = null; + let fireblocksNCW: IFireblocksNCW | null = null; const authManager: IAuthManager = new FirebaseAuthManager(); authManager.onUserChanged((user) => { set({ loggedUser: user }); @@ -46,7 +49,7 @@ export const useAppStore = create()((set, get) => { }; return { - fireblocksNCWSdkVersion: FireblocksNCW.version, + fireblocksNCWSdkVersion: version, automateInitialization: ENV_CONFIG.AUTOMATE_INITIALIZATION, joinExistingWalletMode: false, loggedUser: authManager.loggedUser, @@ -360,13 +363,14 @@ export const useAppStore = create()((set, get) => { return Promise.resolve(password || ""); }); - fireblocksNCW = await FireblocksNCW.initialize({ + fireblocksNCW = await FireblocksNCWFactory({ env: ENV_CONFIG.NCW_SDK_ENV as TEnv, + logLevel: "INFO", deviceId, messagesHandler, eventsHandler, secureStorageProvider, - logger: new ConsoleLogger(), + logger: await IndexedDBLoggerFactory({ deviceId, logger: ConsoleLoggerFactory() }), }); txsUnsubscriber = apiService.listenToTxs(deviceId, (tx: ITransactionData) => { diff --git a/src/logger/IndexedDBLogger.factory.ts b/src/logger/IndexedDBLogger.factory.ts new file mode 100644 index 0000000..e294dc6 --- /dev/null +++ b/src/logger/IndexedDBLogger.factory.ts @@ -0,0 +1,9 @@ +import { IIndexedDBLoggerOptions, IndexedDBLogger } from "./IndexedDBLogger"; + +export function IndexedDBLoggerFactory(options: IIndexedDBLoggerOptions): Promise { + if (!IndexedDBLogger.isIndexedDBAvailable()) { + throw new Error("IndexedDB is not available"); + } + + return IndexedDBLogger.initialize(options); +} diff --git a/src/logger/IndexedDBLogger.ts b/src/logger/IndexedDBLogger.ts new file mode 100644 index 0000000..a7dcf53 --- /dev/null +++ b/src/logger/IndexedDBLogger.ts @@ -0,0 +1,195 @@ +import { ILogger, NullLoggerFactory, TLogLevel } from "@fireblocks/ncw-js-sdk"; + +const DB_NAME = "fireblocks-ncw-sdk-logs"; +const TABLE_NAME = "logs"; +const DEVICE_ID_INDEX = "deviceIdIndex"; + +export interface LogEntry { + timestamp: string; + deviceId: string; + level: TLogLevel; + message: string; + data?: any; +} +export interface IIndexedDBLoggerOptions { + deviceId: string; + logger?: ILogger; + dbName?: string; + tableName?: string; +} + +export class IndexedDBLogger implements ILogger { + private _dbInstance: IDBDatabase | null = null; + private _dbName: string; + private _tableName: string; + private _deviceId: string; + private _logger: ILogger; + + constructor(options: IIndexedDBLoggerOptions) { + this._deviceId = options.deviceId; + this._logger = options.logger ?? NullLoggerFactory(); + this._dbName = options.dbName ?? DB_NAME; + this._tableName = options.tableName ?? TABLE_NAME; + } + + public static async initialize(options: IIndexedDBLoggerOptions): Promise { + const logger = new IndexedDBLogger(options); + await logger._initializeDB(); + return logger; + } + + public static isIndexedDBAvailable(): boolean { + try { + return Boolean(globalThis.indexedDB) === true; + } catch (e) { + return false; + } + } + + public log(level: TLogLevel, message: string, data?: any): void { + this._logger.log(level, message, data); + + this._saveLog({ + level, + message, + data, + deviceId: this._deviceId, + timestamp: new Date().toISOString(), + }); + } + + public collect(limit: number | null): Promise { + return new Promise((resolve, reject) => { + const request = indexedDB.open(this._dbName, 1); + + request.onsuccess = (event) => { + const db = (event.target as IDBOpenDBRequest).result; + + const transaction = db.transaction(this._tableName, "readonly"); + const store = transaction.objectStore(this._tableName); + + const index = store.index(DEVICE_ID_INDEX); + const range = IDBKeyRange.only(this._deviceId); + const cursorRequest = index.openCursor(range, "prev"); + + const result: LogEntry[] = []; + + cursorRequest.onsuccess = (event) => { + const cursor = (event.target as IDBRequest).result; + if (!cursor || result.length === limit) { + resolve(result); + } else { + result.push(cursor.value); + cursor.continue(); + } + }; + + cursorRequest.onerror = () => { + reject("Error retrieving logs from IndexedDB"); + }; + }; + + request.onerror = () => { + reject("Error opening IndexedDB"); + }; + }); + } + + public clear(limit: number | null): Promise { + return new Promise((resolve, reject) => { + if (!this._dbInstance) { + reject("IndexedDB is not initialized"); + return; + } + + const transaction = this._dbInstance.transaction(this._tableName, "readwrite"); + const store = transaction.objectStore(this._tableName); + + const index = store.index(DEVICE_ID_INDEX); + const range = IDBKeyRange.only(this._deviceId); + const cursorRequest = index.openCursor(range); + + let deleted = 0; + cursorRequest.onsuccess = (event) => { + const cursor = (event.target as IDBRequest).result; + if (!cursor || deleted === limit) { + resolve(deleted); + } else { + store.delete(cursor.primaryKey); + deleted++; + cursor.continue(); + } + }; + + cursorRequest.onerror = () => { + reject("Error retrieving logs from IndexedDB"); + }; + }); + } + + public count(): Promise { + return new Promise((resolve, reject) => { + if (!this._dbInstance) { + reject("IndexedDB is not initialized"); + return; + } + + const transaction = this._dbInstance.transaction(this._tableName, "readonly"); + const store = transaction.objectStore(this._tableName); + + const index = store.index(DEVICE_ID_INDEX); + const range = IDBKeyRange.only(this._deviceId); + const countRequest = index.count(range); + + countRequest.onsuccess = (event) => { + const result = (event.target as IDBRequest).result; + resolve(result); + }; + + countRequest.onerror = () => { + reject("Error retrieving logs from IndexedDB"); + }; + }); + } + + private _saveLog(logEntry: LogEntry): void { + if (!this._dbInstance) { + this._logger.log("ERROR", "IndexedDB is not initialized"); + return; + } + const transaction = this._dbInstance.transaction(this._tableName, "readwrite"); + const store = transaction.objectStore(this._tableName); + + const addRequest = store.add(logEntry); + + addRequest.onsuccess = () => { + this._logger.log("VERBOSE", "Message saved to IndexedDB"); + }; + + addRequest.onerror = () => { + this._logger.log("ERROR", "Error saving message to IndexedDB"); + }; + } + + private _initializeDB(): Promise { + return new Promise((resolve, reject) => { + const request = indexedDB.open(this._dbName, 1); + + request.onupgradeneeded = (event) => { + const db = (event.target as IDBOpenDBRequest).result; + const objectStore = db.createObjectStore(this._tableName, { keyPath: "id", autoIncrement: true }); + + objectStore.createIndex(DEVICE_ID_INDEX, "deviceId"); + }; + + request.onsuccess = (event) => { + this._dbInstance = (event.target as IDBOpenDBRequest).result; + resolve(); + }; + + request.onerror = () => { + reject("Error opening IndexedDB"); + }; + }); + } +} diff --git a/yarn.lock b/yarn.lock index 4243d14..ec40233 100644 --- a/yarn.lock +++ b/yarn.lock @@ -745,14 +745,12 @@ dependencies: "@types/emscripten" "^1.39.7" -"@fireblocks/ncw-js-sdk@10.0.7": - version "10.0.7" - resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-10.0.7.tgz#f30378ea09d7f8e134300e1c3ac6d3b73ce9ce0a" - integrity sha512-ElhzaKSh/JkbW00+mhhotaUeH2a51dGlIk4OV2Rnv8g2s1lVopV36v8XMh0kl0WPNo5UXp3XpypH0OcyOVL96g== +"@fireblocks/ncw-js-sdk@11.0.0-rc.2": + version "11.0.0-rc.2" + resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-11.0.0-rc.2.tgz#2d9ec27026c93fb33de4510ba78072c083aa96d4" + integrity sha512-TQDZrrBVxOleBrpXrA4f333Mo3S+LXuF4UzswkZsoIF4cfcfKdOX9qX3sJx028lOOLLqYDNHDazK3USXr1S/uA== dependencies: "@fireblocks/ncw-js-infra" "^1.0.17" - "@types/jwt-decode" "^3.1.0" - "@types/node-forge" "^1.3.4" jwt-decode "^3.1.2" node-forge "^1.3.1" @@ -1011,13 +1009,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/jwt-decode@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/jwt-decode/-/jwt-decode-3.1.0.tgz#eb1b24f436962b8857beaf8addfd542de56670a2" - integrity sha512-tthwik7TKkou3mVnBnvVuHnHElbjtdbM63pdBCbZTirCt3WAdM73Y79mOri7+ljsS99ZVwUFZHLMxJuJnv/z1w== - dependencies: - jwt-decode "*" - "@types/node-forge@^1.3.4": version "1.3.10" resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.10.tgz#62a19d4f75a8b03290578c2b04f294b1a5a71b07" @@ -2049,11 +2040,6 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jwt-decode@*: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b" - integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== - jwt-decode@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" From 68129a9cecad37558afa6d37b8b48fa9be6eadce Mon Sep 17 00:00:00 2001 From: Github Actions Date: Mon, 22 Jan 2024 16:53:36 +0200 Subject: [PATCH 02/16] download logs --- src/AppStore.ts | 36 +++++++++++++- src/IAppState.ts | 7 ++- .../FireblocksNCWExampleActions.tsx | 2 + src/components/Logs.tsx | 21 +++++++++ src/logger/IndexedDBLogger.ts | 47 +++++++++---------- 5 files changed, 84 insertions(+), 29 deletions(-) create mode 100644 src/components/Logs.tsx diff --git a/src/AppStore.ts b/src/AppStore.ts index 9bf1b40..8cd6839 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -70,9 +70,10 @@ export const useAppStore = create()((set, get) => { keysStatus: null, passphrase: null, passphrases: null, - regeneratePassphrase: () => {}, accounts: [], supportedAssets: {}, + logger: null, + regeneratePassphrase: () => {}, initAppStore: () => { try { apiService = new ApiService(ENV_CONFIG.BACKEND_BASE_URL, authManager); @@ -362,6 +363,8 @@ export const useAppStore = create()((set, get) => { } return Promise.resolve(password || ""); }); + const logger = await IndexedDBLoggerFactory({ deviceId, logger: ConsoleLoggerFactory() }); + set((state) => ({ ...state, logger })); fireblocksNCW = await FireblocksNCWFactory({ env: ENV_CONFIG.NCW_SDK_ENV as TEnv, @@ -370,7 +373,7 @@ export const useAppStore = create()((set, get) => { messagesHandler, eventsHandler, secureStorageProvider, - logger: await IndexedDBLoggerFactory({ deviceId, logger: ConsoleLoggerFactory() }), + logger, }); txsUnsubscriber = apiService.listenToTxs(deviceId, (tx: ITransactionData) => { @@ -687,5 +690,34 @@ export const useAppStore = create()((set, get) => { ), })); }, + collectLogs: async () => { + const { logger } = get(); + if (!logger) { + return; + } + const logs = await logger.collect(null); + + // Download logs + const downloadLink = document.createElement("a"); + downloadLink.href = URL.createObjectURL(new Blob([JSON.stringify(logs)], { type: "text/plain" })); + downloadLink.download = "logs.txt"; + downloadLink.click(); + }, + clearLogs: async () => { + const { logger } = get(); + if (!logger) { + return; + } + const clearedLogsNum = await logger.clear(null); + logger.log("INFO", `Cleared logs: ${clearedLogsNum}`); + }, + countLogs: async () => { + const { logger } = get(); + if (!logger) { + return; + } + const numberOfLogs = await logger.count(); + logger.log("INFO", `Number of logs: ${numberOfLogs}`); + }, }; }); diff --git a/src/IAppState.ts b/src/IAppState.ts index c357d9b..604c802 100644 --- a/src/IAppState.ts +++ b/src/IAppState.ts @@ -1,4 +1,4 @@ -import { IKeyDescriptor, TMPCAlgorithm, IFullKey } from "@fireblocks/ncw-js-sdk"; +import { IKeyDescriptor, TMPCAlgorithm, IFullKey, ILogger } from "@fireblocks/ncw-js-sdk"; import { TAsyncActionStatus, TFireblocksNCWStatus } from "./AppStore"; import { IAssetAddress, @@ -10,6 +10,7 @@ import { TPassphraseLocation, } from "./services/ApiService"; import { IUser } from "./auth/IAuthManager"; +import { IndexedDBLogger } from "./logger/IndexedDBLogger"; export interface IAssetInfo { asset: IWalletAsset; @@ -67,6 +68,7 @@ export interface IAppState { accounts: TAccount[]; passphrases: TPassphrases | null; supportedAssets: Record; + logger: IndexedDBLogger | null; initAppStore: () => void; disposeAppStore: () => void; getGoogleDriveCredentials: () => Promise; @@ -117,4 +119,7 @@ export interface IAppState { refreshSupportedAssets: (accountId: number) => Promise; refreshAddress: (accountId: number, assetId: string) => Promise; addAsset: (accountId: number, assetId: string) => Promise; + countLogs: () => void; + clearLogs: () => void; + collectLogs: () => void; } diff --git a/src/components/FireblocksNCWExampleActions.tsx b/src/components/FireblocksNCWExampleActions.tsx index 55b77fb..25a545d 100644 --- a/src/components/FireblocksNCWExampleActions.tsx +++ b/src/components/FireblocksNCWExampleActions.tsx @@ -8,6 +8,7 @@ import { Transactions } from "./Transactions"; import { Web3 } from "./Web3"; import { useAppStore } from "../AppStore"; import { JoinExistingWallet } from "./JoinExistingWallet"; +import { Logs } from "./logs"; export const FireblocksNCWExampleActions: React.FC = () => { const { keysStatus, joinExistingWalletMode } = useAppStore(); @@ -26,6 +27,7 @@ export const FireblocksNCWExampleActions: React.FC = () => { + )} diff --git a/src/components/Logs.tsx b/src/components/Logs.tsx new file mode 100644 index 0000000..4e62dcd --- /dev/null +++ b/src/components/Logs.tsx @@ -0,0 +1,21 @@ +import React from "react"; + +import { useAppStore } from "../AppStore"; +import { Card, ICardAction } from "./ui/Card"; + +export const Logs: React.FC = () => { + const { collectLogs, clearLogs, countLogs } = useAppStore(); + const collectLogsAction: ICardAction = { + label: "Collect Logs", + action: collectLogs, + }; + const clearLogsAction: ICardAction = { + label: "Clear Logs", + action: clearLogs, + }; + const countLogsAction: ICardAction = { + label: "Count Logs", + action: countLogs, + }; + return ; +}; diff --git a/src/logger/IndexedDBLogger.ts b/src/logger/IndexedDBLogger.ts index a7dcf53..bdb5020 100644 --- a/src/logger/IndexedDBLogger.ts +++ b/src/logger/IndexedDBLogger.ts @@ -25,7 +25,7 @@ export class IndexedDBLogger implements ILogger { private _deviceId: string; private _logger: ILogger; - constructor(options: IIndexedDBLoggerOptions) { + private constructor(options: IIndexedDBLoggerOptions) { this._deviceId = options.deviceId; this._logger = options.logger ?? NullLoggerFactory(); this._dbName = options.dbName ?? DB_NAME; @@ -60,37 +60,32 @@ export class IndexedDBLogger implements ILogger { public collect(limit: number | null): Promise { return new Promise((resolve, reject) => { - const request = indexedDB.open(this._dbName, 1); - - request.onsuccess = (event) => { - const db = (event.target as IDBOpenDBRequest).result; - - const transaction = db.transaction(this._tableName, "readonly"); - const store = transaction.objectStore(this._tableName); + if (!this._dbInstance) { + reject("IndexedDB is not initialized"); + return; + } - const index = store.index(DEVICE_ID_INDEX); - const range = IDBKeyRange.only(this._deviceId); - const cursorRequest = index.openCursor(range, "prev"); + const transaction = this._dbInstance.transaction(this._tableName, "readonly"); + const store = transaction.objectStore(this._tableName); - const result: LogEntry[] = []; + const index = store.index(DEVICE_ID_INDEX); + const range = IDBKeyRange.only(this._deviceId); + const cursorRequest = index.openCursor(range, "prev"); - cursorRequest.onsuccess = (event) => { - const cursor = (event.target as IDBRequest).result; - if (!cursor || result.length === limit) { - resolve(result); - } else { - result.push(cursor.value); - cursor.continue(); - } - }; + const result: LogEntry[] = []; - cursorRequest.onerror = () => { - reject("Error retrieving logs from IndexedDB"); - }; + cursorRequest.onsuccess = (event) => { + const cursor = (event.target as IDBRequest).result; + if (!cursor || result.length === limit) { + resolve(result); + } else { + result.push(cursor.value); + cursor.continue(); + } }; - request.onerror = () => { - reject("Error opening IndexedDB"); + cursorRequest.onerror = () => { + reject("Error retrieving logs from IndexedDB"); }; }); } From 846992359ec30fe60c80a7ba5eb6e33e830ed347 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Mon, 22 Jan 2024 17:59:18 +0200 Subject: [PATCH 03/16] logs --- src/AppStore.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/AppStore.ts b/src/AppStore.ts index 8cd6839..0f67789 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -695,12 +695,14 @@ export const useAppStore = create()((set, get) => { if (!logger) { return; } - const logs = await logger.collect(null); + const limitInput = await prompt("Enter number of logs to collect (empty for all)"); + const limit = limitInput ? parseInt(limitInput) : null; + const logs = await logger.collect(limit); + const logsString = logs.map((log) => JSON.stringify(log)).join("\n"); - // Download logs const downloadLink = document.createElement("a"); - downloadLink.href = URL.createObjectURL(new Blob([JSON.stringify(logs)], { type: "text/plain" })); - downloadLink.download = "logs.txt"; + downloadLink.href = URL.createObjectURL(new Blob([logsString], { type: "text/plain" })); + downloadLink.download = `${Date.now()}_ncw-sdk-logs.log`; downloadLink.click(); }, clearLogs: async () => { @@ -708,7 +710,9 @@ export const useAppStore = create()((set, get) => { if (!logger) { return; } - const clearedLogsNum = await logger.clear(null); + const limitInput = await prompt("Enter number of logs to clear (empty for all)"); + const limit = limitInput ? parseInt(limitInput) : null; + const clearedLogsNum = await logger.clear(limit); logger.log("INFO", `Cleared logs: ${clearedLogsNum}`); }, countLogs: async () => { From 0d54a30f662023e02c5f5531204f0b2f66f5fc93 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Tue, 23 Jan 2024 14:47:00 +0200 Subject: [PATCH 04/16] fixes --- package.json | 2 +- src/AppStore.ts | 2 +- src/IAppState.ts | 2 +- src/components/FireblocksNCWExampleActions.tsx | 2 +- yarn.lock | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 08d57a8..de1f3a3 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "preview": "vite preview" }, "dependencies": { - "@fireblocks/ncw-js-sdk": "11.0.0-rc.2", + "@fireblocks/ncw-js-sdk": "11.0.0", "base58-js": "^2.0.0", "classnames": "^2.3.2", "js-base64": "^3.7.5", diff --git a/src/AppStore.ts b/src/AppStore.ts index 0f67789..97dc463 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -70,10 +70,10 @@ export const useAppStore = create()((set, get) => { keysStatus: null, passphrase: null, passphrases: null, + regeneratePassphrase: () => {}, accounts: [], supportedAssets: {}, logger: null, - regeneratePassphrase: () => {}, initAppStore: () => { try { apiService = new ApiService(ENV_CONFIG.BACKEND_BASE_URL, authManager); diff --git a/src/IAppState.ts b/src/IAppState.ts index 604c802..fc6d231 100644 --- a/src/IAppState.ts +++ b/src/IAppState.ts @@ -1,4 +1,4 @@ -import { IKeyDescriptor, TMPCAlgorithm, IFullKey, ILogger } from "@fireblocks/ncw-js-sdk"; +import { IKeyDescriptor, TMPCAlgorithm, IFullKey } from "@fireblocks/ncw-js-sdk"; import { TAsyncActionStatus, TFireblocksNCWStatus } from "./AppStore"; import { IAssetAddress, diff --git a/src/components/FireblocksNCWExampleActions.tsx b/src/components/FireblocksNCWExampleActions.tsx index 25a545d..9b862c7 100644 --- a/src/components/FireblocksNCWExampleActions.tsx +++ b/src/components/FireblocksNCWExampleActions.tsx @@ -8,7 +8,7 @@ import { Transactions } from "./Transactions"; import { Web3 } from "./Web3"; import { useAppStore } from "../AppStore"; import { JoinExistingWallet } from "./JoinExistingWallet"; -import { Logs } from "./logs"; +import { Logs } from "./Logs"; export const FireblocksNCWExampleActions: React.FC = () => { const { keysStatus, joinExistingWalletMode } = useAppStore(); diff --git a/yarn.lock b/yarn.lock index ec40233..2cdeff1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -745,10 +745,10 @@ dependencies: "@types/emscripten" "^1.39.7" -"@fireblocks/ncw-js-sdk@11.0.0-rc.2": - version "11.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-11.0.0-rc.2.tgz#2d9ec27026c93fb33de4510ba78072c083aa96d4" - integrity sha512-TQDZrrBVxOleBrpXrA4f333Mo3S+LXuF4UzswkZsoIF4cfcfKdOX9qX3sJx028lOOLLqYDNHDazK3USXr1S/uA== +"@fireblocks/ncw-js-sdk@11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-11.0.0.tgz#50e035d879ee133a82d0180d4ed652cb8248ee66" + integrity sha512-NBxtvXYuB7uHMzqLJrLWp/1SMbJ/49bXLAs397oUdnuvhTGU920cCcV9NFwVgvzcNqYal0DfTQMVdvv4Zh65Nw== dependencies: "@fireblocks/ncw-js-infra" "^1.0.17" jwt-decode "^3.1.2" From 437e3fb3aaa41513d7448d7a20d51c3dd836f5da Mon Sep 17 00:00:00 2001 From: Github Actions Date: Thu, 25 Jan 2024 16:11:21 +0200 Subject: [PATCH 05/16] wip --- .env | 20 +++++++++---------- src/AppStore.ts | 8 ++++++-- src/components/BackupAndRecover.tsx | 2 +- .../FireblocksNCWExampleActions.tsx | 2 +- src/components/GenerateMPCKeys.tsx | 20 +++++++++++++++++-- src/components/JoinExistingWallet.tsx | 16 +++++++++++++++ 6 files changed, 52 insertions(+), 16 deletions(-) diff --git a/.env b/.env index c5ea3d2..21c8e33 100644 --- a/.env +++ b/.env @@ -1,15 +1,15 @@ # VITE_AUTOMATE_INITIALIZATION=true # SANDBOX -VITE_BACKEND_BASE_URL=https://ncw-demo-dev.2uaqu5aka49io.eu-central-1.cs.amazonlightsail.com -VITE_NCW_SDK_ENV=sandbox -VITE_CLOUDKIT_APITOKEN=18be8b0ef50c77b1adf9b3795948806d4ee3e1fb23a3d30ee6bd672d2db21a56 -VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo -VITE_CLOUDKIT_ENV=production +# VITE_BACKEND_BASE_URL=https://ncw-demo-dev.2uaqu5aka49io.eu-central-1.cs.amazonlightsail.com +# VITE_NCW_SDK_ENV=sandbox +# VITE_CLOUDKIT_APITOKEN=18be8b0ef50c77b1adf9b3795948806d4ee3e1fb23a3d30ee6bd672d2db21a56 +# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo +# VITE_CLOUDKIT_ENV=production # DEV9 -# VITE_BACKEND_BASE_URL=https://dev9-ncw-demo.waterballoons.xyz -# VITE_NCW_SDK_ENV=dev9 -# VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd -# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo -# VITE_CLOUDKIT_ENV=development +VITE_BACKEND_BASE_URL=https://dev9-ncw-demo.waterballoons.xyz +VITE_NCW_SDK_ENV=dev9 +VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd +VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo +VITE_CLOUDKIT_ENV=development diff --git a/src/AppStore.ts b/src/AppStore.ts index 97dc463..446c748 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -368,7 +368,7 @@ export const useAppStore = create()((set, get) => { fireblocksNCW = await FireblocksNCWFactory({ env: ENV_CONFIG.NCW_SDK_ENV as TEnv, - logLevel: "INFO", + logLevel: "DEBUG", deviceId, messagesHandler, eventsHandler, @@ -528,7 +528,11 @@ export const useAppStore = create()((set, get) => { if (!fireblocksNCW) { throw new Error("fireblocksNCW is not initialized"); } - const ALGORITHMS = new Set(["MPC_CMP_ECDSA_SECP256K1"]); + const ALGORITHMS = new Set([ + // + // "MPC_CMP_ECDSA_SECP256K1", + "MPC_CMP_EDDSA_ED25519", + ]); await fireblocksNCW.generateMPCKeys(ALGORITHMS); }, stopMpcDeviceSetup: async () => { diff --git a/src/components/BackupAndRecover.tsx b/src/components/BackupAndRecover.tsx index 40341f9..2274796 100644 --- a/src/components/BackupAndRecover.tsx +++ b/src/components/BackupAndRecover.tsx @@ -196,7 +196,7 @@ export const BackupAndRecover: React.FC = () => { }; const secP256K1Status = keysStatus?.MPC_CMP_ECDSA_SECP256K1?.keyStatus ?? null; - const ed25519Status = keysStatus?.MPC_EDDSA_ED25519?.keyStatus ?? null; + const ed25519Status = keysStatus?.MPC_CMP_EDDSA_ED25519?.keyStatus ?? null; const hasReadyAlgo = secP256K1Status === "READY" || ed25519Status === "READY"; const googleBackupAction: ICardAction = { diff --git a/src/components/FireblocksNCWExampleActions.tsx b/src/components/FireblocksNCWExampleActions.tsx index 9b862c7..64ed80c 100644 --- a/src/components/FireblocksNCWExampleActions.tsx +++ b/src/components/FireblocksNCWExampleActions.tsx @@ -13,7 +13,7 @@ import { Logs } from "./Logs"; export const FireblocksNCWExampleActions: React.FC = () => { const { keysStatus, joinExistingWalletMode } = useAppStore(); const secP256K1Status = keysStatus?.MPC_CMP_ECDSA_SECP256K1?.keyStatus ?? null; - const ed25519Status = keysStatus?.MPC_EDDSA_ED25519?.keyStatus ?? null; + const ed25519Status = keysStatus?.MPC_CMP_EDDSA_ED25519?.keyStatus ?? null; const hasAKey = secP256K1Status === "READY" || ed25519Status === "READY"; diff --git a/src/components/GenerateMPCKeys.tsx b/src/components/GenerateMPCKeys.tsx index ddd9f28..b7f7c24 100644 --- a/src/components/GenerateMPCKeys.tsx +++ b/src/components/GenerateMPCKeys.tsx @@ -54,6 +54,7 @@ export const GenerateMPCKeys: React.FC = () => { }; const secP256K1Status = keysStatus?.MPC_CMP_ECDSA_SECP256K1?.keyStatus ?? null; + const ed25519Status = keysStatus?.MPC_CMP_EDDSA_ED25519?.keyStatus ?? null; const statusToProgress = (status: TKeyStatus | null) => { switch (status) { case "INITIATED": @@ -71,11 +72,12 @@ export const GenerateMPCKeys: React.FC = () => { } }; const secP256K1Ready = secP256K1Status === "READY"; + const ed25519Ready = ed25519Status === "READY"; const generateAction: IActionButtonProps = { label: "Generate MPC Keys", action: doGenerateMPCKeys, - isDisabled: isGenerateInProgress || secP256K1Ready, + isDisabled: isGenerateInProgress || (secP256K1Ready && ed25519Ready), isInProgress: isGenerateInProgress, }; @@ -89,7 +91,7 @@ export const GenerateMPCKeys: React.FC = () => { const approveJoinWalletAction: IActionButtonProps = { label: "Approve Join Wallet", action: approveJoinWallet, - isDisabled: (isStopInProgress || isGenerateInProgress) && secP256K1Ready, + isDisabled: (isStopInProgress || isGenerateInProgress) && (ed25519Ready || secP256K1Ready), }; const stopApproveWalletAction: IActionButtonProps = { label: "Stop Approve Join Wallet", @@ -130,6 +132,20 @@ export const GenerateMPCKeys: React.FC = () => { + + + + ECDSA ED25519 + + + + + + {generateMPCKeysResult && ( diff --git a/src/components/JoinExistingWallet.tsx b/src/components/JoinExistingWallet.tsx index 17a6d41..9442489 100644 --- a/src/components/JoinExistingWallet.tsx +++ b/src/components/JoinExistingWallet.tsx @@ -43,6 +43,7 @@ export const JoinExistingWallet: React.FC = () => { }; const secP256K1Status = keysStatus?.MPC_CMP_ECDSA_SECP256K1?.keyStatus ?? null; + const ed25519Status = keysStatus?.MPC_CMP_EDDSA_ED25519?.keyStatus ?? null; const statusToProgress = (status: TKeyStatus | null) => { switch (status) { case "INITIATED": @@ -60,6 +61,7 @@ export const JoinExistingWallet: React.FC = () => { } }; const secP256K1Ready = secP256K1Status === "READY"; + const ed25519Ready = secP256K1Status === "READY"; const generateAction: IActionButtonProps = { label: "Join", @@ -112,6 +114,20 @@ export const JoinExistingWallet: React.FC = () => { + + + + ECDSA ED25519 + + + + + + {joinExistingWalletResult && ( From c99ac125eece0a3db6fbf48d393e16753151e021 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Thu, 25 Jan 2024 16:21:50 +0200 Subject: [PATCH 06/16] fixes --- src/AppStore.ts | 14 ++++++-------- src/IAppState.ts | 8 +++----- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/AppStore.ts b/src/AppStore.ts index 446c748..57cb5db 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -7,12 +7,13 @@ import { IKeyBackupEvent, IKeyDescriptor, IKeyRecoveryEvent, + ILogger, IMessagesHandler, SigningInProgressError, TEnv, TEvent, TMPCAlgorithm, - version, + version as fireblocksNCWSdkVersion, } from "@fireblocks/ncw-js-sdk"; import { create } from "zustand"; import { IAppState, IPassphraseInfo, TPassphrases, TAppMode, INewTransactionData } from "./IAppState"; @@ -24,11 +25,13 @@ import { IAuthManager } from "./auth/IAuthManager"; import { FirebaseAuthManager } from "./auth/FirebaseAuthManager"; import { decode } from "js-base64"; import { IndexedDBLoggerFactory } from "./logger/IndexedDBLogger.factory"; +import { IndexedDBLogger } from "./logger/IndexedDBLogger"; export type TAsyncActionStatus = "not_started" | "started" | "success" | "failed"; export type TFireblocksNCWStatus = "sdk_not_ready" | "initializing_sdk" | "sdk_available" | "sdk_initialization_failed"; export type TRequestDecodedData = { email: string; requestId: string; platform: string }; +let logger: IndexedDBLogger | null = null; export const useAppStore = create()((set, get) => { let apiService: ApiService | null = null; let txsUnsubscriber: (() => void) | null = null; @@ -49,7 +52,7 @@ export const useAppStore = create()((set, get) => { }; return { - fireblocksNCWSdkVersion: version, + fireblocksNCWSdkVersion, automateInitialization: ENV_CONFIG.AUTOMATE_INITIALIZATION, joinExistingWalletMode: false, loggedUser: authManager.loggedUser, @@ -73,7 +76,6 @@ export const useAppStore = create()((set, get) => { regeneratePassphrase: () => {}, accounts: [], supportedAssets: {}, - logger: null, initAppStore: () => { try { apiService = new ApiService(ENV_CONFIG.BACKEND_BASE_URL, authManager); @@ -363,8 +365,7 @@ export const useAppStore = create()((set, get) => { } return Promise.resolve(password || ""); }); - const logger = await IndexedDBLoggerFactory({ deviceId, logger: ConsoleLoggerFactory() }); - set((state) => ({ ...state, logger })); + logger = await IndexedDBLoggerFactory({ deviceId, logger: ConsoleLoggerFactory() }); fireblocksNCW = await FireblocksNCWFactory({ env: ENV_CONFIG.NCW_SDK_ENV as TEnv, @@ -695,7 +696,6 @@ export const useAppStore = create()((set, get) => { })); }, collectLogs: async () => { - const { logger } = get(); if (!logger) { return; } @@ -710,7 +710,6 @@ export const useAppStore = create()((set, get) => { downloadLink.click(); }, clearLogs: async () => { - const { logger } = get(); if (!logger) { return; } @@ -720,7 +719,6 @@ export const useAppStore = create()((set, get) => { logger.log("INFO", `Cleared logs: ${clearedLogsNum}`); }, countLogs: async () => { - const { logger } = get(); if (!logger) { return; } diff --git a/src/IAppState.ts b/src/IAppState.ts index fc6d231..67a9181 100644 --- a/src/IAppState.ts +++ b/src/IAppState.ts @@ -10,7 +10,6 @@ import { TPassphraseLocation, } from "./services/ApiService"; import { IUser } from "./auth/IAuthManager"; -import { IndexedDBLogger } from "./logger/IndexedDBLogger"; export interface IAssetInfo { asset: IWalletAsset; @@ -68,7 +67,6 @@ export interface IAppState { accounts: TAccount[]; passphrases: TPassphrases | null; supportedAssets: Record; - logger: IndexedDBLogger | null; initAppStore: () => void; disposeAppStore: () => void; getGoogleDriveCredentials: () => Promise; @@ -119,7 +117,7 @@ export interface IAppState { refreshSupportedAssets: (accountId: number) => Promise; refreshAddress: (accountId: number, assetId: string) => Promise; addAsset: (accountId: number, assetId: string) => Promise; - countLogs: () => void; - clearLogs: () => void; - collectLogs: () => void; + countLogs: () => Promise; + clearLogs: () => Promise; + collectLogs: () => Promise; } From 1c42339fef7ad44e00cecc252d1f316602b355e4 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Mon, 29 Jan 2024 16:23:44 +0200 Subject: [PATCH 07/16] w --- .env | 20 ++++++++++---------- src/AppStore.ts | 2 +- src/components/GenerateMPCKeys.tsx | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.env b/.env index 21c8e33..c5ea3d2 100644 --- a/.env +++ b/.env @@ -1,15 +1,15 @@ # VITE_AUTOMATE_INITIALIZATION=true # SANDBOX -# VITE_BACKEND_BASE_URL=https://ncw-demo-dev.2uaqu5aka49io.eu-central-1.cs.amazonlightsail.com -# VITE_NCW_SDK_ENV=sandbox -# VITE_CLOUDKIT_APITOKEN=18be8b0ef50c77b1adf9b3795948806d4ee3e1fb23a3d30ee6bd672d2db21a56 -# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo -# VITE_CLOUDKIT_ENV=production +VITE_BACKEND_BASE_URL=https://ncw-demo-dev.2uaqu5aka49io.eu-central-1.cs.amazonlightsail.com +VITE_NCW_SDK_ENV=sandbox +VITE_CLOUDKIT_APITOKEN=18be8b0ef50c77b1adf9b3795948806d4ee3e1fb23a3d30ee6bd672d2db21a56 +VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo +VITE_CLOUDKIT_ENV=production # DEV9 -VITE_BACKEND_BASE_URL=https://dev9-ncw-demo.waterballoons.xyz -VITE_NCW_SDK_ENV=dev9 -VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd -VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo -VITE_CLOUDKIT_ENV=development +# VITE_BACKEND_BASE_URL=https://dev9-ncw-demo.waterballoons.xyz +# VITE_NCW_SDK_ENV=dev9 +# VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd +# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo +# VITE_CLOUDKIT_ENV=development diff --git a/src/AppStore.ts b/src/AppStore.ts index e22dd51..7937cfc 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -531,7 +531,7 @@ export const useAppStore = create()((set, get) => { } const ALGORITHMS = new Set([ // - // "MPC_CMP_ECDSA_SECP256K1", + "MPC_CMP_ECDSA_SECP256K1", "MPC_CMP_EDDSA_ED25519", ]); await fireblocksNCW.generateMPCKeys(ALGORITHMS); diff --git a/src/components/GenerateMPCKeys.tsx b/src/components/GenerateMPCKeys.tsx index 290731d..a2d19b7 100644 --- a/src/components/GenerateMPCKeys.tsx +++ b/src/components/GenerateMPCKeys.tsx @@ -135,7 +135,7 @@ export const GenerateMPCKeys: React.FC = () => { - ECDSA ED25519 + EDDSA ED25519 Date: Sun, 18 Feb 2024 16:07:51 +0200 Subject: [PATCH 08/16] env --- .env | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.env b/.env index c5ea3d2..21c8e33 100644 --- a/.env +++ b/.env @@ -1,15 +1,15 @@ # VITE_AUTOMATE_INITIALIZATION=true # SANDBOX -VITE_BACKEND_BASE_URL=https://ncw-demo-dev.2uaqu5aka49io.eu-central-1.cs.amazonlightsail.com -VITE_NCW_SDK_ENV=sandbox -VITE_CLOUDKIT_APITOKEN=18be8b0ef50c77b1adf9b3795948806d4ee3e1fb23a3d30ee6bd672d2db21a56 -VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo -VITE_CLOUDKIT_ENV=production +# VITE_BACKEND_BASE_URL=https://ncw-demo-dev.2uaqu5aka49io.eu-central-1.cs.amazonlightsail.com +# VITE_NCW_SDK_ENV=sandbox +# VITE_CLOUDKIT_APITOKEN=18be8b0ef50c77b1adf9b3795948806d4ee3e1fb23a3d30ee6bd672d2db21a56 +# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo +# VITE_CLOUDKIT_ENV=production # DEV9 -# VITE_BACKEND_BASE_URL=https://dev9-ncw-demo.waterballoons.xyz -# VITE_NCW_SDK_ENV=dev9 -# VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd -# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo -# VITE_CLOUDKIT_ENV=development +VITE_BACKEND_BASE_URL=https://dev9-ncw-demo.waterballoons.xyz +VITE_NCW_SDK_ENV=dev9 +VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd +VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo +VITE_CLOUDKIT_ENV=development From c52dca6dbab702ebd07693fc56d643e886c8683e Mon Sep 17 00:00:00 2001 From: Yuval Niezni Date: Sun, 3 Mar 2024 18:32:41 +0200 Subject: [PATCH 09/16] version --- .env | 7 +++++++ package.json | 2 +- src/AppStore.ts | 9 ++++++--- yarn.lock | 18 +++++++++--------- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/.env b/.env index 21c8e33..21d0661 100644 --- a/.env +++ b/.env @@ -13,3 +13,10 @@ VITE_NCW_SDK_ENV=dev9 VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo VITE_CLOUDKIT_ENV=development + +# LOCAL +# VITE_BACKEND_BASE_URL=http://localhost:3000 +# VITE_NCW_SDK_ENV=dev9 +# VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd +# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo +# VITE_CLOUDKIT_ENV=development diff --git a/package.json b/package.json index a9bb9c3..9330e26 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "preview": "vite preview" }, "dependencies": { - "@fireblocks/ncw-js-sdk": "12.0.0", + "@fireblocks/ncw-js-sdk": "12.0.1-beta.2", "base58-js": "^2.0.0", "classnames": "^2.3.2", "js-base64": "^3.7.5", diff --git a/src/AppStore.ts b/src/AppStore.ts index 7937cfc..67ce2ad 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -369,7 +369,7 @@ export const useAppStore = create()((set, get) => { fireblocksNCW = await FireblocksNCWFactory({ env: ENV_CONFIG.NCW_SDK_ENV as TEnv, - logLevel: "INFO", + logLevel: "VERBOSE", deviceId, messagesHandler, eventsHandler, @@ -534,7 +534,9 @@ export const useAppStore = create()((set, get) => { "MPC_CMP_ECDSA_SECP256K1", "MPC_CMP_EDDSA_ED25519", ]); - await fireblocksNCW.generateMPCKeys(ALGORITHMS); + const start = Date.now(); + const res = await fireblocksNCW.generateMPCKeys(ALGORITHMS); + console.log(`@@@ DEBUGS | generateMPCKeys: | took: ${Date.now() - start}`, res); }, stopMpcDeviceSetup: async () => { if (!fireblocksNCW) { @@ -546,7 +548,8 @@ export const useAppStore = create()((set, get) => { if (!fireblocksNCW) { throw new Error("fireblocksNCW is not initialized"); } - return fireblocksNCW.takeover(); + const result = await fireblocksNCW.takeover(); + return result; }, exportFullKeys: (chainCode: string, cloudKeyShares: Map) => { if (!fireblocksNCW) { diff --git a/yarn.lock b/yarn.lock index 6c6cb9f..796ccc2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -738,19 +738,19 @@ resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz#cd9897680d0a2f1bce8d8c23a590e5874f4617c5" integrity sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg== -"@fireblocks/ncw-js-infra@1.0.17": - version "1.0.17" - resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-infra/-/ncw-js-infra-1.0.17.tgz#e7de3e3c9d2da37dd3e30ef0b4a9044ef7da6d8a" - integrity sha512-nhg5fGGG1DkEz7DA7Qz46S+fqf2fKNHhxxUwabMEm8u18pzs3eeI232ZYXBE26tx/6MEbzMXFQyk14DnWLCJcQ== +"@fireblocks/ncw-js-infra@1.0.19-beta.2": + version "1.0.19-beta.2" + resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-infra/-/ncw-js-infra-1.0.19-beta.2.tgz#4e948ff37d209ff13dc4edc4738e2de7c5092423" + integrity sha512-y2VIAjVPrrSgeJ2FNAfc7z/i9uymp+7I2i4wLlVSPV35hJcJo6e+Um0oViWamUcbmEHz2ljTEJDdJmmfDm0TYg== dependencies: "@types/emscripten" "^1.39.7" -"@fireblocks/ncw-js-sdk@12.0.0": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-12.0.0.tgz#7754ac7251910c27e757ac7129abab853486a3b4" - integrity sha512-UOWOY30JQeJBBqpEgZ6+HwbCOAaSatK+M6HkA9FSdqdvknwL4uo5cvf5pRboIuASX82EK3+oEF+hcAShmvFaQQ== +"@fireblocks/ncw-js-sdk@12.0.1-beta.2": + version "12.0.1-beta.2" + resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-12.0.1-beta.2.tgz#a844ba0197c3d2a3852d88589c31337e3a68149e" + integrity sha512-rh9RuOKWymvOZqBHTF8m6WAJNECRr7aoBuBBGsD8HU5CPfHWkT/apyDvSYxtPcMRvmkY4TPZ5noyGF4ZovPyrw== dependencies: - "@fireblocks/ncw-js-infra" "1.0.17" + "@fireblocks/ncw-js-infra" "1.0.19-beta.2" jwt-decode "^3.1.2" node-forge "^1.3.1" From 971c7dc093575ea179bfffd325775c4db837ae43 Mon Sep 17 00:00:00 2001 From: Yuval Niezni Date: Mon, 4 Mar 2024 18:15:49 +0200 Subject: [PATCH 10/16] upgrade version --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 9330e26..c59f13a 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "preview": "vite preview" }, "dependencies": { - "@fireblocks/ncw-js-sdk": "12.0.1-beta.2", + "@fireblocks/ncw-js-sdk": "12.0.1-beta.3", "base58-js": "^2.0.0", "classnames": "^2.3.2", "js-base64": "^3.7.5", diff --git a/yarn.lock b/yarn.lock index 796ccc2..98bc0c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -738,19 +738,19 @@ resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz#cd9897680d0a2f1bce8d8c23a590e5874f4617c5" integrity sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg== -"@fireblocks/ncw-js-infra@1.0.19-beta.2": - version "1.0.19-beta.2" - resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-infra/-/ncw-js-infra-1.0.19-beta.2.tgz#4e948ff37d209ff13dc4edc4738e2de7c5092423" - integrity sha512-y2VIAjVPrrSgeJ2FNAfc7z/i9uymp+7I2i4wLlVSPV35hJcJo6e+Um0oViWamUcbmEHz2ljTEJDdJmmfDm0TYg== +"@fireblocks/ncw-js-infra@1.0.19-beta.3": + version "1.0.19-beta.3" + resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-infra/-/ncw-js-infra-1.0.19-beta.3.tgz#273e0706fa7c1d9d73679be8bd793e68b329d234" + integrity sha512-taGZDLMycR6TPsdFoqHtVnSg5qg6iJ04f5js6bBYgl7ETR1V98qwnPRHrM0JgRbL0noOu33WqzPuQpJkOz6f1A== dependencies: "@types/emscripten" "^1.39.7" -"@fireblocks/ncw-js-sdk@12.0.1-beta.2": - version "12.0.1-beta.2" - resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-12.0.1-beta.2.tgz#a844ba0197c3d2a3852d88589c31337e3a68149e" - integrity sha512-rh9RuOKWymvOZqBHTF8m6WAJNECRr7aoBuBBGsD8HU5CPfHWkT/apyDvSYxtPcMRvmkY4TPZ5noyGF4ZovPyrw== +"@fireblocks/ncw-js-sdk@12.0.1-beta.3": + version "12.0.1-beta.3" + resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-12.0.1-beta.3.tgz#5e984b44f71c984cf645546aa950136c07d50345" + integrity sha512-/ojLd7uz4GVzCOQUXcUOEmYlIVx2utA2bZaaoByuSyNuw8qJL05frEwdJ6ScY9+OyWXdVkk4N9SwplxQzfAbDA== dependencies: - "@fireblocks/ncw-js-infra" "1.0.19-beta.2" + "@fireblocks/ncw-js-infra" "1.0.19-beta.3" jwt-decode "^3.1.2" node-forge "^1.3.1" From e6efbffed863b840a88d6f120aea9be1447d9ca5 Mon Sep 17 00:00:00 2001 From: Yuval Niezni Date: Sun, 24 Mar 2024 14:04:53 +0200 Subject: [PATCH 11/16] version --- .env | 8 ++++++++ package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.env b/.env index 21d0661..543af65 100644 --- a/.env +++ b/.env @@ -2,6 +2,7 @@ # SANDBOX # VITE_BACKEND_BASE_URL=https://ncw-demo-dev.2uaqu5aka49io.eu-central-1.cs.amazonlightsail.com +# VITE_BACKEND_BASE_URL=https://api-sb.ncw-demo.com # multi algo tenant # VITE_NCW_SDK_ENV=sandbox # VITE_CLOUDKIT_APITOKEN=18be8b0ef50c77b1adf9b3795948806d4ee3e1fb23a3d30ee6bd672d2db21a56 # VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo @@ -20,3 +21,10 @@ VITE_CLOUDKIT_ENV=development # VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd # VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo # VITE_CLOUDKIT_ENV=development + +# RENTBLOCKS +# VITE_BACKEND_BASE_URL=http://localhost:5860 +# VITE_NCW_SDK_ENV=rentblocks +# VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd +# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo +# VITE_CLOUDKIT_ENV=development diff --git a/package.json b/package.json index c59f13a..6ad5ae7 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "preview": "vite preview" }, "dependencies": { - "@fireblocks/ncw-js-sdk": "12.0.1-beta.3", + "@fireblocks/ncw-js-sdk": "12.0.1-beta.4", "base58-js": "^2.0.0", "classnames": "^2.3.2", "js-base64": "^3.7.5", diff --git a/yarn.lock b/yarn.lock index 98bc0c6..9018954 100644 --- a/yarn.lock +++ b/yarn.lock @@ -745,10 +745,10 @@ dependencies: "@types/emscripten" "^1.39.7" -"@fireblocks/ncw-js-sdk@12.0.1-beta.3": - version "12.0.1-beta.3" - resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-12.0.1-beta.3.tgz#5e984b44f71c984cf645546aa950136c07d50345" - integrity sha512-/ojLd7uz4GVzCOQUXcUOEmYlIVx2utA2bZaaoByuSyNuw8qJL05frEwdJ6ScY9+OyWXdVkk4N9SwplxQzfAbDA== +"@fireblocks/ncw-js-sdk@12.0.1-beta.4": + version "12.0.1-beta.4" + resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-12.0.1-beta.4.tgz#e9897fdbc79ad6a89175e28c6eb2f1ee4fcf6aa0" + integrity sha512-KidtHVBeWE3Bx+zm69ggwg1qRF9YMna+XFREizbgPt2TJghQzuDEkVKWy4fYf3WzNJD+sc1uR6nmr2hbzztzBA== dependencies: "@fireblocks/ncw-js-infra" "1.0.19-beta.3" jwt-decode "^3.1.2" From 8b7703f08c504cf73b792c29a66e84ea3ca3602b Mon Sep 17 00:00:00 2001 From: Yuval Niezni Date: Thu, 4 Apr 2024 15:28:04 +0300 Subject: [PATCH 12/16] wip --- src/AppStore.ts | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/AppStore.ts b/src/AppStore.ts index 67ce2ad..6483e77 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -586,14 +586,19 @@ export const useAppStore = create()((set, get) => { if (!deviceId) { throw new Error("deviceId is not set"); } - const address = await apiService.addAsset(deviceId, accountId, assetId); - const asset = await apiService.getAsset(deviceId, accountId, assetId); - set((state) => ({ - ...state, - accounts: state.accounts.map((assets, index) => - index === accountId ? { ...assets, ...{ [assetId]: { asset, address } } } : assets, - ), - })); + try { + const address = await apiService.addAsset(deviceId, accountId, assetId); + console.log("@@@ DEBUGS | addAsset: | address:", address); + const asset = await apiService.getAsset(deviceId, accountId, assetId); + set((state) => ({ + ...state, + accounts: state.accounts.map((assets, index) => + index === accountId ? { ...assets, ...{ [assetId]: { asset, address } } } : assets, + ), + })); + } catch (error) { + console.log("@@@ DEBUGS | addAsset: | error:", error); + } }, refreshAccounts: async () => { @@ -629,6 +634,7 @@ export const useAppStore = create()((set, get) => { throw new Error("deviceId is not set"); } const assets = await apiService.getAssets(deviceId, accountId); + console.log("@@@ DEBUGS | refreshAssets: | assets:", assets); const reduced = assets.reduce>((acc, asset) => { acc[asset.id] = { asset }; return acc; From 7dd1f809ebdf3e1dbd43039e8737c5db6744f5ab Mon Sep 17 00:00:00 2001 From: Yuval Niezni Date: Wed, 10 Apr 2024 17:47:34 +0300 Subject: [PATCH 13/16] bump ncw-js-sdk --- package.json | 2 +- src/AppStore.ts | 26 ++++++++++---------------- src/services/ApiService.ts | 6 ++++-- yarn.lock | 18 +++++++++--------- 4 files changed, 24 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 6ad5ae7..f2e26e5 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "preview": "vite preview" }, "dependencies": { - "@fireblocks/ncw-js-sdk": "12.0.1-beta.4", + "@fireblocks/ncw-js-sdk": "12.1.1", "base58-js": "^2.0.0", "classnames": "^2.3.2", "js-base64": "^3.7.5", diff --git a/src/AppStore.ts b/src/AppStore.ts index 6483e77..97a02db 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -548,8 +548,7 @@ export const useAppStore = create()((set, get) => { if (!fireblocksNCW) { throw new Error("fireblocksNCW is not initialized"); } - const result = await fireblocksNCW.takeover(); - return result; + return fireblocksNCW.takeover(); }, exportFullKeys: (chainCode: string, cloudKeyShares: Map) => { if (!fireblocksNCW) { @@ -586,19 +585,14 @@ export const useAppStore = create()((set, get) => { if (!deviceId) { throw new Error("deviceId is not set"); } - try { - const address = await apiService.addAsset(deviceId, accountId, assetId); - console.log("@@@ DEBUGS | addAsset: | address:", address); - const asset = await apiService.getAsset(deviceId, accountId, assetId); - set((state) => ({ - ...state, - accounts: state.accounts.map((assets, index) => - index === accountId ? { ...assets, ...{ [assetId]: { asset, address } } } : assets, - ), - })); - } catch (error) { - console.log("@@@ DEBUGS | addAsset: | error:", error); - } + const address = await apiService.addAsset(deviceId, accountId, assetId); + const asset = await apiService.getAsset(deviceId, accountId, assetId); + set((state) => ({ + ...state, + accounts: state.accounts.map((assets, index) => + index === accountId ? { ...assets, ...{ [assetId]: { asset, address } } } : assets, + ), + })); }, refreshAccounts: async () => { @@ -634,7 +628,6 @@ export const useAppStore = create()((set, get) => { throw new Error("deviceId is not set"); } const assets = await apiService.getAssets(deviceId, accountId); - console.log("@@@ DEBUGS | refreshAssets: | assets:", assets); const reduced = assets.reduce>((acc, asset) => { acc[asset.id] = { asset }; return acc; @@ -696,6 +689,7 @@ export const useAppStore = create()((set, get) => { throw new Error("deviceId is not set"); } const address = await apiService.getAddress(deviceId, accountId, assetId); + console.log("@@@ DEBUGS | refreshAddress: | address:", address) set((state) => ({ ...state, diff --git a/src/services/ApiService.ts b/src/services/ApiService.ts index 5215637..c48abb4 100644 --- a/src/services/ApiService.ts +++ b/src/services/ApiService.ts @@ -407,10 +407,12 @@ export class ApiService { body: JSON.stringify(body ?? {}), }); + const responseJson = await response.json(); if (!response.ok) { - throw new Error(`A call to "${path}" failed with status ${response.status}`); + throw new Error( + `A call to "${path}" failed with status ${response.status}, data: ${JSON.stringify(responseJson)}`, + ); } - const responseJson = await response.json(); return responseJson; } diff --git a/yarn.lock b/yarn.lock index 9018954..a2ef55a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -738,19 +738,19 @@ resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz#cd9897680d0a2f1bce8d8c23a590e5874f4617c5" integrity sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg== -"@fireblocks/ncw-js-infra@1.0.19-beta.3": - version "1.0.19-beta.3" - resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-infra/-/ncw-js-infra-1.0.19-beta.3.tgz#273e0706fa7c1d9d73679be8bd793e68b329d234" - integrity sha512-taGZDLMycR6TPsdFoqHtVnSg5qg6iJ04f5js6bBYgl7ETR1V98qwnPRHrM0JgRbL0noOu33WqzPuQpJkOz6f1A== +"@fireblocks/ncw-js-infra@1.0.19": + version "1.0.19" + resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-infra/-/ncw-js-infra-1.0.19.tgz#b95ce94c930b9d89565164138b17e5531662d4cd" + integrity sha512-ROogCO7li4Ouevunm4sBiw/4hNuUxynxNPSUymKPV3GrKJBSRaTp6+/KXnDkYG2PHW3vlowE/ndKXSMVx1wUEg== dependencies: "@types/emscripten" "^1.39.7" -"@fireblocks/ncw-js-sdk@12.0.1-beta.4": - version "12.0.1-beta.4" - resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-12.0.1-beta.4.tgz#e9897fdbc79ad6a89175e28c6eb2f1ee4fcf6aa0" - integrity sha512-KidtHVBeWE3Bx+zm69ggwg1qRF9YMna+XFREizbgPt2TJghQzuDEkVKWy4fYf3WzNJD+sc1uR6nmr2hbzztzBA== +"@fireblocks/ncw-js-sdk@12.1.1": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@fireblocks/ncw-js-sdk/-/ncw-js-sdk-12.1.1.tgz#8657cc4c5d774bcb0e5edc92d4c893c2b938d4d8" + integrity sha512-IDO7rRxLUxCOMCA7qa9GKAUKegzwQ92kI5MRQ38kIpAwDbqLj7pANoCn+Modb2OJN57yHwbXVjdDH8wcoWc+7Q== dependencies: - "@fireblocks/ncw-js-infra" "1.0.19-beta.3" + "@fireblocks/ncw-js-infra" "1.0.19" jwt-decode "^3.1.2" node-forge "^1.3.1" From 5dcac35369fdfc516e2fb758bf8ff6b21984ceca Mon Sep 17 00:00:00 2001 From: Yuval Niezni Date: Thu, 11 Apr 2024 11:00:31 +0300 Subject: [PATCH 14/16] cleanup --- .env | 30 ++++-------------------------- src/AppStore.ts | 7 ++----- 2 files changed, 6 insertions(+), 31 deletions(-) diff --git a/.env b/.env index 543af65..27d2474 100644 --- a/.env +++ b/.env @@ -1,30 +1,8 @@ # VITE_AUTOMATE_INITIALIZATION=true # SANDBOX -# VITE_BACKEND_BASE_URL=https://ncw-demo-dev.2uaqu5aka49io.eu-central-1.cs.amazonlightsail.com -# VITE_BACKEND_BASE_URL=https://api-sb.ncw-demo.com # multi algo tenant -# VITE_NCW_SDK_ENV=sandbox -# VITE_CLOUDKIT_APITOKEN=18be8b0ef50c77b1adf9b3795948806d4ee3e1fb23a3d30ee6bd672d2db21a56 -# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo -# VITE_CLOUDKIT_ENV=production - -# DEV9 -VITE_BACKEND_BASE_URL=https://dev9-ncw-demo.waterballoons.xyz -VITE_NCW_SDK_ENV=dev9 -VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd +VITE_BACKEND_BASE_URL=https://api-sb.ncw-demo.com +VITE_NCW_SDK_ENV=sandbox +VITE_CLOUDKIT_APITOKEN=18be8b0ef50c77b1adf9b3795948806d4ee3e1fb23a3d30ee6bd672d2db21a56 VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo -VITE_CLOUDKIT_ENV=development - -# LOCAL -# VITE_BACKEND_BASE_URL=http://localhost:3000 -# VITE_NCW_SDK_ENV=dev9 -# VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd -# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo -# VITE_CLOUDKIT_ENV=development - -# RENTBLOCKS -# VITE_BACKEND_BASE_URL=http://localhost:5860 -# VITE_NCW_SDK_ENV=rentblocks -# VITE_CLOUDKIT_APITOKEN=572a0b5cfcb8992031640d1a14fd0ac3bb7c774cc929a0e23cb00af415da51cd -# VITE_CLOUDKIT_CONTAINER_ID=iCloud.com.fireblocks.ncw.demo -# VITE_CLOUDKIT_ENV=development +VITE_CLOUDKIT_ENV=production diff --git a/src/AppStore.ts b/src/AppStore.ts index 97a02db..7937cfc 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -369,7 +369,7 @@ export const useAppStore = create()((set, get) => { fireblocksNCW = await FireblocksNCWFactory({ env: ENV_CONFIG.NCW_SDK_ENV as TEnv, - logLevel: "VERBOSE", + logLevel: "INFO", deviceId, messagesHandler, eventsHandler, @@ -534,9 +534,7 @@ export const useAppStore = create()((set, get) => { "MPC_CMP_ECDSA_SECP256K1", "MPC_CMP_EDDSA_ED25519", ]); - const start = Date.now(); - const res = await fireblocksNCW.generateMPCKeys(ALGORITHMS); - console.log(`@@@ DEBUGS | generateMPCKeys: | took: ${Date.now() - start}`, res); + await fireblocksNCW.generateMPCKeys(ALGORITHMS); }, stopMpcDeviceSetup: async () => { if (!fireblocksNCW) { @@ -689,7 +687,6 @@ export const useAppStore = create()((set, get) => { throw new Error("deviceId is not set"); } const address = await apiService.getAddress(deviceId, accountId, assetId); - console.log("@@@ DEBUGS | refreshAddress: | address:", address) set((state) => ({ ...state, From 52e159774c9f50c8fa030a27433e0e4c0f2bdfee Mon Sep 17 00:00:00 2001 From: Yuval Niezni Date: Thu, 11 Apr 2024 11:18:41 +0300 Subject: [PATCH 15/16] comment --- src/AppStore.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/AppStore.ts b/src/AppStore.ts index 7937cfc..868c62d 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -525,6 +525,10 @@ export const useAppStore = create()((set, get) => { set((state) => ({ ...state, web3Connections: state.web3Connections.filter((s) => s.id !== sessionId) })); }, + /** + * By default, tenants are not enabled with EdDSA so you may remove `MPC_CMP_EDDSA_ED25519` when calling generateMPCKeys + * Please ask your CSM or in the https://community.fireblocks.com/ to enable your tenant to support EdDSA if you wish to work with EdDSA chains. + */ generateMPCKeys: async () => { if (!fireblocksNCW) { throw new Error("fireblocksNCW is not initialized"); From 73e279aa03673808983c98dde159025f13c47d8f Mon Sep 17 00:00:00 2001 From: Yuval Niezni Date: Thu, 11 Apr 2024 11:51:16 +0300 Subject: [PATCH 16/16] tenant -> workspace --- src/AppStore.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AppStore.ts b/src/AppStore.ts index 868c62d..d61dcc5 100644 --- a/src/AppStore.ts +++ b/src/AppStore.ts @@ -526,8 +526,8 @@ export const useAppStore = create()((set, get) => { set((state) => ({ ...state, web3Connections: state.web3Connections.filter((s) => s.id !== sessionId) })); }, /** - * By default, tenants are not enabled with EdDSA so you may remove `MPC_CMP_EDDSA_ED25519` when calling generateMPCKeys - * Please ask your CSM or in the https://community.fireblocks.com/ to enable your tenant to support EdDSA if you wish to work with EdDSA chains. + * By default, workspaces are not enabled with EdDSA so you may remove `MPC_CMP_EDDSA_ED25519` when calling generateMPCKeys + * Please ask your CSM or in the https://community.fireblocks.com/ to enable your workspace to support EdDSA if you wish to work with EdDSA chains. */ generateMPCKeys: async () => { if (!fireblocksNCW) {