diff --git a/.gitignore b/.gitignore index 76add87..b512c09 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -node_modules -dist \ No newline at end of file +node_modules \ No newline at end of file diff --git a/package.json b/package.json index 5433742..caccf73 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,7 @@ "build:web": "tsc --project tsconfig.web.json", "build:server": "tsc --project tsconfig.server.json", "build:shared": "tsc --project tsconfig.shared.json", - "build": "npm run build:web && npm run build:server && npm run build:shared", - "postinstall": "npm run build" + "build": "npm run build:web && npm run build:server && npm run build:shared" }, "repository": { "type": "git", diff --git a/server/dist/index.d.ts b/server/dist/index.d.ts new file mode 100644 index 0000000..8cb74fe --- /dev/null +++ b/server/dist/index.d.ts @@ -0,0 +1,2 @@ +import ServerWallet from "./server"; +export { ServerWallet }; diff --git a/server/dist/index.js b/server/dist/index.js new file mode 100644 index 0000000..96da16d --- /dev/null +++ b/server/dist/index.js @@ -0,0 +1,3 @@ +import ServerWallet from "./server"; +export { ServerWallet }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/server/dist/index.js.map b/server/dist/index.js.map new file mode 100644 index 0000000..bfeb055 --- /dev/null +++ b/server/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,UAAU,CAAC;AACpC,OAAO,EAAC,YAAY,EAAC,CAAC"} \ No newline at end of file diff --git a/server/dist/server.d.ts b/server/dist/server.d.ts new file mode 100644 index 0000000..cb334e7 --- /dev/null +++ b/server/dist/server.d.ts @@ -0,0 +1,38 @@ +import { AuthData, BalanceInfo, TxInfo, AliasDetails } from "./types"; +import { APIAsset } from "./types"; +interface ConstructorParams { + walletUrl: string; + daemonUrl: string; + walletAuthToken?: string; +} +interface GetTxsParams { + count: number; + offset: number; + exclude_mining_txs?: boolean; + exclude_unconfirmed?: boolean; + order?: string; + update_provision_info?: boolean; +} +declare class ServerWallet { + private walletUrl; + private daemonUrl; + private walletAuthToken; + constructor(params: ConstructorParams); + private generateRandomString; + private createJWSToken; + private generateAccessToken; + private fetchDaemon; + private fetchWallet; + updateWalletRpcUrl(rpcUrl: string): Promise; + updateDaemonRpcUrl(rpcUrl: string): Promise; + getAssetsList(): Promise; + getAssetDetails(assetId: string): Promise; + getAssetInfo(assetId: string): Promise; + sendTransfer(assetId: string, address: string, amount: string): Promise; + getAliasByAddress(address: string): Promise; + getBalances(): Promise; + validateWallet(authData: AuthData): Promise; + getTxs(params: GetTxsParams): Promise; + getAliasDetails(alias: string): Promise; +} +export default ServerWallet; diff --git a/server/dist/server.js b/server/dist/server.js new file mode 100644 index 0000000..992b32b --- /dev/null +++ b/server/dist/server.js @@ -0,0 +1,283 @@ +import axios from "axios"; +import Big from "big.js"; +import { ZANO_ASSET_ID, ZanoError } from "./utils"; +import forge from "node-forge"; +class ServerWallet { + walletUrl; + daemonUrl; + walletAuthToken; + constructor(params) { + this.walletUrl = params.walletUrl; + this.daemonUrl = params.daemonUrl; + this.walletAuthToken = params.walletAuthToken || ""; + } + generateRandomString(length) { + const bytes = forge.random.getBytesSync(Math.ceil(length / 2)); + const hexString = forge.util.bytesToHex(bytes); + return hexString.substring(0, length); + } + createJWSToken(payload, secretStr) { + const header = { alg: "HS256", typ: "JWT" }; + const encodedHeader = Buffer.from(JSON.stringify(header)) + .toString("base64") + .replace(/=/g, ""); + const encodedPayload = Buffer.from(JSON.stringify(payload)) + .toString("base64") + .replace(/=/g, ""); + const signature = forge.hmac.create(); + signature.start("sha256", secretStr); + signature.update(`${encodedHeader}.${encodedPayload}`); + const encodedSignature = forge.util + .encode64(signature.digest().getBytes()) + .replace(/=/g, ""); + return `${encodedHeader}.${encodedPayload}.${encodedSignature}`; + } + generateAccessToken(httpBody) { + // Calculate the SHA-256 hash of the HTTP body + const md = forge.md.sha256.create(); + md.update(httpBody); + const bodyHash = md.digest().toHex(); + // Example payload + const payload = { + body_hash: bodyHash, + user: "zano_extension", + salt: this.generateRandomString(64), + exp: Math.floor(Date.now() / 1000) + 60, // Expires in 1 minute + }; + return this.createJWSToken(payload, this.walletAuthToken); + } + async fetchDaemon(method, params) { + const data = { + jsonrpc: "2.0", + id: 0, + method: method, + params: params, + }; + const headers = { + "Content-Type": "application/json", + "Zano-Access-Token": this.generateAccessToken(JSON.stringify(data)), + }; + return axios.post(this.daemonUrl, data, { headers }); + } + async fetchWallet(method, params) { + const data = { + jsonrpc: "2.0", + id: 0, + method: method, + params: params, + }; + const headers = { + "Content-Type": "application/json", + "Zano-Access-Token": this.generateAccessToken(JSON.stringify(data)), + }; + return axios.post(this.walletUrl, data, { headers }); + } + async updateWalletRpcUrl(rpcUrl) { + this.walletUrl = rpcUrl; + } + async updateDaemonRpcUrl(rpcUrl) { + this.daemonUrl = rpcUrl; + } + async getAssetsList() { + const count = 100; + let offset = 0; + let allAssets = []; + let keepFetching = true; + while (keepFetching) { + try { + const response = await this.fetchDaemon("get_assets_list", { + count, + offset, + }); + const assets = response.data.result.assets; + if (assets.length < count) { + keepFetching = false; + } + allAssets = allAssets.concat(assets); + offset += count; + } + catch (error) { + throw new ZanoError("Failed to fetch assets list", "ASSETS_FETCH_ERROR"); + } + } + return allAssets; + } + async getAssetDetails(assetId) { + const assets = await this.getAssetsList(); + const asset = assets.find((a) => a.asset_id === assetId); + if (!asset) { + throw new ZanoError(`Asset with ID ${assetId} not found`, "ASSET_NOT_FOUND"); + } + return asset; + } + async getAssetInfo(assetId) { + try { + const response = await this.fetchDaemon("get_asset_info", { + asset_id: assetId, + }); + if (response.data.result) { + return response.data.result; + } + else { + throw new ZanoError(`Error fetching info for asset ID ${assetId}`, "ASSET_INFO_ERROR"); + } + } + catch (error) { + console.error(error); + throw new ZanoError("Failed to fetch asset info", "ASSET_INFO_FETCH_ERROR"); + } + } + async sendTransfer(assetId, address, amount) { + let decimalPoint; + let auditable; + if (assetId === ZANO_ASSET_ID) { + decimalPoint = 12; + } + else { + const asset = await this.getAssetDetails(assetId); + decimalPoint = asset.decimal_point; + } + try { + const response = await this.fetchWallet("getaddress", {}); + auditable = response.data.result.address.startsWith("a"); + } + catch (error) { + throw new ZanoError("Failed to fetch address", "ADDRESS_FETCH_ERROR"); + } + const bigAmount = new Big(amount) + .times(new Big(10).pow(decimalPoint)) + .toString(); + try { + const response = await this.fetchWallet("transfer", { + destinations: [{ address, amount: bigAmount, asset_id: assetId }], + fee: "10000000000", + mixin: auditable ? 0 : 15, + }); + if (response.data.result) { + return response.data.result; + } + else if (response.data.error && + response.data.error.message === "WALLET_RPC_ERROR_CODE_NOT_ENOUGH_MONEY") { + throw new ZanoError("Not enough funds", "NOT_ENOUGH_FUNDS"); + } + else { + throw new ZanoError("Error sending transfer", "TRANSFER_ERROR"); + } + } + catch (error) { + if (error instanceof ZanoError) { + throw error; + } + else { + throw new ZanoError("Failed to send transfer", "TRANSFER_SEND_ERROR"); + } + } + } + async getAliasByAddress(address) { + try { + const response = await this.fetchDaemon("get_alias_by_address", address); + if (response.data.result) { + return response.data.result; + } + else { + throw new ZanoError(`Error fetching alias for address ${address}`, "ALIAS_FETCH_ERROR"); + } + } + catch (error) { + throw new ZanoError("Failed to fetch alias", "ALIAS_FETCH_ERROR"); + } + } + async getBalances() { + try { + const response = await this.fetchWallet("getbalance", {}); + const balancesData = response.data.result.balances; + const balances = balancesData.map((asset) => ({ + name: asset.asset_info.full_name, + ticker: asset.asset_info.ticker, + id: asset.asset_info.asset_id, + amount: new Big(asset.unlocked) + .div(new Big(10).pow(asset.asset_info.decimal_point)) + .toString(), + awaiting_in: new Big(asset.awaiting_in).toString(), + awaiting_out: new Big(asset.awaiting_out).toString(), + total: new Big(asset.total).toString(), + unlocked: new Big(asset.unlocked).toString(), + asset_info: asset.asset_info, + })); + return balances.sort((a, b) => { + if (a.id === ZANO_ASSET_ID) + return -1; + if (b.id === ZANO_ASSET_ID) + return 1; + return 0; + }); + } + catch (error) { + throw new ZanoError("Failed to fetch balances", "BALANCES_FETCH_ERROR"); + } + } + async validateWallet(authData) { + const { message, address, signature } = authData; + const alias = authData.alias || undefined; + const pkey = authData.pkey || undefined; + if (!message || (!alias && !pkey) || !signature) { + return false; + } + const validationParams = { + buff: Buffer.from(message).toString("base64"), + sig: signature, + }; + if (alias) { + validationParams["alias"] = alias; + } + else { + validationParams["pkey"] = pkey; + } + const response = await this.fetchDaemon("validate_signature", validationParams); + const valid = response?.data?.result?.status === "OK"; + if (!valid) { + return false; + } + if (alias) { + const aliasDetailsResponse = await this.fetchDaemon("get_alias_details", { + alias: alias, + }); + const aliasDetails = aliasDetailsResponse?.data?.result?.alias_details; + const aliasAddress = aliasDetails?.address; + const addressValid = !!aliasAddress && aliasAddress === address; + if (!addressValid) { + return false; + } + } + return valid; + } + async getTxs(params) { + const txs = await this.fetchWallet("get_recent_txs_and_info2", { + count: params.count, + exclude_mining_txs: params.exclude_mining_txs || false, + exclude_unconfirmed: params.exclude_unconfirmed || false, + offset: params.offset, + order: params.order || "FROM_END_TO_BEGIN", + update_provision_info: params.update_provision_info || true, + }); + return txs.data.result; + } + async getAliasDetails(alias) { + try { + const response = await this.fetchDaemon("get_alias_details", { + alias, + }); + if (response.data.result) { + return response.data.result; + } + else { + throw new ZanoError(`Error fetching alias ${alias}`, "ALIAS_FETCH_ERROR"); + } + } + catch { + throw new ZanoError("Failed to fetch alias", "ALIAS_FETCH_ERROR"); + } + } +} +export default ServerWallet; +//# sourceMappingURL=server.js.map \ No newline at end of file diff --git a/server/dist/server.js.map b/server/dist/server.js.map new file mode 100644 index 0000000..33f608c --- /dev/null +++ b/server/dist/server.js.map @@ -0,0 +1 @@ +{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/server/dist/types.d.ts b/server/dist/types.d.ts new file mode 100644 index 0000000..b7ec04d --- /dev/null +++ b/server/dist/types.d.ts @@ -0,0 +1,100 @@ +export interface BaseAuthData { + address: string; + signature: string; + message: string; +} +export interface AliasAuth extends BaseAuthData { + alias: string; +} +export interface PkeyAuth extends BaseAuthData { + pkey: string; +} +export type AuthData = AliasAuth | PkeyAuth; +export interface ValidationParams { + buff: string; + sig: string; + alias?: string; + pkey?: string; +} +export interface APIAsset { + asset_id: string; + current_supply: number; + decimal_point: number; + full_name: string; + hidden_supply: boolean; + meta_info: string; + owner: string; + ticker: string; + total_max_supply: number; +} +export interface APIBalance { + asset_info: APIAsset; + awaiting_in: number; + awaiting_out: number; + total: number; + unlocked: number; +} +export interface BalanceInfo { + name: string; + ticker: string; + id: string; + amount: string; + awaiting_in: string; + awaiting_out: string; + total: string; + unlocked: string; + asset_info: APIAsset; +} +export interface SubTransfer { + amount: number; + asset_id: string; + is_income: boolean; +} +export interface EmployedEntry { + amount: number; + asset_id: string; + index: number; +} +export interface Transfer { + employed_entries: { + receive: EmployedEntry[]; + spent: EmployedEntry[]; + }; + subtransfers: SubTransfer[]; + comment: string; + fee: number; + height: number; + is_mining: boolean; + is_mixing: boolean; + is_service: boolean; + payment_id: string; + show_sender: boolean; + timestamp: number; + transfer_internal_index: number; + tx_blob_size: number; + tx_hash: string; + tx_type: number; + unlock_time: number; + remote_addresses: string[] | undefined; + remote_aliases: string[] | undefined; +} +export interface TxInfo { + last_item_index: number; + pi: { + balance: number; + curent_height: number; + transfer_entries_count: number; + transfers_count: number; + unlocked_balance: number; + }; + total_transfers: number; + transfers: Transfer[]; +} +export interface AliasDetails { + alias_details: { + address: string; + comment: string; + tracking_key: string; + }; + status: 'OK' | 'NOT_FOUND'; +} diff --git a/server/dist/types.js b/server/dist/types.js new file mode 100644 index 0000000..718fd38 --- /dev/null +++ b/server/dist/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/server/dist/types.js.map b/server/dist/types.js.map new file mode 100644 index 0000000..c768b79 --- /dev/null +++ b/server/dist/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/server/dist/utils.d.ts b/server/dist/utils.d.ts new file mode 100644 index 0000000..890d1bb --- /dev/null +++ b/server/dist/utils.d.ts @@ -0,0 +1,6 @@ +export declare const ZANO_ASSET_ID = "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a"; +export declare class ZanoError extends Error { + code: string; + name: string; + constructor(message: string, code: string); +} diff --git a/server/dist/utils.js b/server/dist/utils.js new file mode 100644 index 0000000..bd74ce9 --- /dev/null +++ b/server/dist/utils.js @@ -0,0 +1,11 @@ +export const ZANO_ASSET_ID = "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a"; +export class ZanoError extends Error { + code; + name; + constructor(message, code) { + super(message); + this.name = "ZanoError"; + this.code = code; + } +} +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/server/dist/utils.js.map b/server/dist/utils.js.map new file mode 100644 index 0000000..54bd13f --- /dev/null +++ b/server/dist/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,kEAAkE,CAAC;AAEhG,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEzB,IAAI,CAAS;IACb,IAAI,CAAS;IAEpB,YAAY,OAAe,EAAE,IAAY;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ"} \ No newline at end of file diff --git a/shared/dist/index.d.ts b/shared/dist/index.d.ts new file mode 100644 index 0000000..178cd64 --- /dev/null +++ b/shared/dist/index.d.ts @@ -0,0 +1 @@ +export * from "./utils"; diff --git a/shared/dist/index.js b/shared/dist/index.js new file mode 100644 index 0000000..d6932cf --- /dev/null +++ b/shared/dist/index.js @@ -0,0 +1,2 @@ +export * from "./utils"; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/shared/dist/index.js.map b/shared/dist/index.js.map new file mode 100644 index 0000000..db67174 --- /dev/null +++ b/shared/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"} \ No newline at end of file diff --git a/shared/dist/utils.d.ts b/shared/dist/utils.d.ts new file mode 100644 index 0000000..aa8a21a --- /dev/null +++ b/shared/dist/utils.d.ts @@ -0,0 +1,7 @@ +export declare function validateTokensInput(input: string | number, decimal_point?: number): { + valid: boolean; + error: string; +} | { + valid: boolean; + error?: undefined; +}; diff --git a/shared/dist/utils.js b/shared/dist/utils.js new file mode 100644 index 0000000..828a85b --- /dev/null +++ b/shared/dist/utils.js @@ -0,0 +1,70 @@ +import Decimal from "decimal.js"; +export function validateTokensInput(input, decimal_point = 12) { + if (typeof input === 'number') { + input = input.toString(); + } + if (input === "") { + return { + valid: false, + error: 'Invalid input', + }; + } + input = input.replace(/[^0-9.,]/g, ''); + const MAX_NUMBER = new Decimal(2).pow(64).minus(1); + if (decimal_point < 0 || decimal_point > 18) { + return { + valid: false, + error: 'Invalid decimal point', + }; + } + const dotInput = input.replace(/,/g, ''); + const decimalDevider = new Decimal(10).pow(decimal_point); + const maxAllowedNumber = MAX_NUMBER.div(decimalDevider); + const minAllowedNumber = new Decimal(1).div(decimalDevider); + const rounded = (() => { + if (dotInput.replace('.', '').length > 20) { + const decimalParts = dotInput.split('.'); + if (decimalParts.length === 2 && decimalParts[1].length > 1) { + const beforeDotLength = decimalParts[0].length; + const roundedInput = new Decimal(dotInput).toFixed(Math.max(20 - beforeDotLength, 0)); + if (roundedInput.replace(/./g, '').length <= 20) { + return roundedInput; + } + } + return false; + } + else { + return dotInput; + } + })(); + const decimalsAmount = dotInput.split('.')[1]?.length || 0; + if (decimalsAmount > decimal_point) { + return { + valid: false, + error: 'Invalid amount - too many decimal points', + }; + } + if (rounded === false) { + return { + valid: false, + error: 'Invalid amount - number is too big or has too many decimal points', + }; + } + const dotInputDecimal = new Decimal(rounded); + if (dotInputDecimal.gt(maxAllowedNumber)) { + return { + valid: false, + error: 'Invalid amount - number is too big', + }; + } + if (dotInputDecimal.lt(minAllowedNumber)) { + return { + valid: false, + error: 'Invalid amount - number is too small', + }; + } + return { + valid: true + }; +} +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/shared/dist/utils.js.map b/shared/dist/utils.js.map new file mode 100644 index 0000000..3bebaff --- /dev/null +++ b/shared/dist/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/web/dist/hooks.d.ts b/web/dist/hooks.d.ts new file mode 100644 index 0000000..58bc392 --- /dev/null +++ b/web/dist/hooks.d.ts @@ -0,0 +1,3 @@ +import ZanoWallet, { ZanoWalletParams } from './zanoWallet'; +declare function useZanoWallet(params: ZanoWalletParams): ZanoWallet | null; +export { useZanoWallet }; diff --git a/web/dist/hooks.js b/web/dist/hooks.js new file mode 100644 index 0000000..fd4c039 --- /dev/null +++ b/web/dist/hooks.js @@ -0,0 +1,14 @@ +import ZanoWallet from './zanoWallet'; +import { useEffect, useState } from 'react'; +function useZanoWallet(params) { + const [zanoWallet, setZanoWallet] = useState(null); + useEffect(() => { + if (typeof window === 'undefined') { + return; + } + setZanoWallet(new ZanoWallet(params)); + }, []); + return zanoWallet; +} +export { useZanoWallet }; +//# sourceMappingURL=hooks.js.map \ No newline at end of file diff --git a/web/dist/hooks.js.map b/web/dist/hooks.js.map new file mode 100644 index 0000000..bfc6ef0 --- /dev/null +++ b/web/dist/hooks.js.map @@ -0,0 +1 @@ +{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,UAAgC,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,SAAS,aAAa,CAAC,MAAwB;IAC3C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO;QACX,CAAC;QAED,aAAa,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"} \ No newline at end of file diff --git a/web/dist/index.d.ts b/web/dist/index.d.ts new file mode 100644 index 0000000..11bec1c --- /dev/null +++ b/web/dist/index.d.ts @@ -0,0 +1,5 @@ +import zanoWallet from "./zanoWallet"; +import { useZanoWallet } from "./hooks"; +export { useZanoWallet }; +export * from "./types"; +export { zanoWallet }; diff --git a/web/dist/index.js b/web/dist/index.js new file mode 100644 index 0000000..5804e85 --- /dev/null +++ b/web/dist/index.js @@ -0,0 +1,6 @@ +import zanoWallet from "./zanoWallet"; +import { useZanoWallet } from "./hooks"; +export { useZanoWallet }; +export * from "./types"; +export { zanoWallet }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/web/dist/index.js.map b/web/dist/index.js.map new file mode 100644 index 0000000..400732b --- /dev/null +++ b/web/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AACtC,OAAO,EAAC,aAAa,EAAC,CAAC;AAEvB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAC,UAAU,EAAC,CAAC"} \ No newline at end of file diff --git a/web/dist/types.d.ts b/web/dist/types.d.ts new file mode 100644 index 0000000..80a4c77 --- /dev/null +++ b/web/dist/types.d.ts @@ -0,0 +1,32 @@ +export interface Asset { + name: string; + ticker: string; + assetId: string; + decimalPoint: number; + balance: string; + unlockedBalance: string; +} +export interface Transfer { + amount: string; + assetId: string; + incoming: boolean; +} +export interface Transaction { + isConfirmed: boolean; + txHash: string; + blobSize: number; + timestamp: number; + height: number; + paymentId: string; + comment: string; + fee: string; + isInitiator: boolean; + transfers: Transfer[]; +} +export interface Wallet { + address: string; + alias: string; + balance: string; + assets: Asset[]; + transactions: Transaction[]; +} diff --git a/web/dist/types.js b/web/dist/types.js new file mode 100644 index 0000000..718fd38 --- /dev/null +++ b/web/dist/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/web/dist/types.js.map b/web/dist/types.js.map new file mode 100644 index 0000000..c768b79 --- /dev/null +++ b/web/dist/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/web/dist/zanoWallet.d.ts b/web/dist/zanoWallet.d.ts new file mode 100644 index 0000000..dc572be --- /dev/null +++ b/web/dist/zanoWallet.d.ts @@ -0,0 +1,37 @@ +import { Wallet } from './types'; +export interface ZanoWalletParams { + authPath: string; + useLocalStorage?: boolean; + aliasRequired?: boolean; + customLocalStorageKey?: string; + customNonce?: string; + customServerPath?: string; + disableServerRequest?: boolean; + onConnectStart?: (...params: any) => any; + onConnectEnd?: (...params: any) => any; + onConnectError?: (...params: any) => any; + beforeConnect?: (...params: any) => any; + onLocalConnectEnd?: (...params: any) => any; +} +interface WalletCredentials { + nonce: string; + signature: string; + publicKey: string; + address: string; +} +declare class ZanoWallet { + private DEFAULT_LOCAL_STORAGE_KEY; + private localStorageKey; + private params; + private zanoWallet; + constructor(params: ZanoWalletParams); + private handleError; + getSavedWalletCredentials(): WalletCredentials | undefined; + setWalletCredentials(credentials: WalletCredentials | undefined): void; + cleanWalletCredentials(): void; + connect(): Promise; + getWallet(): Promise; + getAddressByAlias(alias: string): Promise; + createAlias(alias: string): Promise; +} +export default ZanoWallet; diff --git a/web/dist/zanoWallet.js b/web/dist/zanoWallet.js new file mode 100644 index 0000000..f8c3422 --- /dev/null +++ b/web/dist/zanoWallet.js @@ -0,0 +1,144 @@ +import { v4 as uuidv4 } from 'uuid'; +class ZanoWallet { + DEFAULT_LOCAL_STORAGE_KEY = "wallet"; + localStorageKey; + params; + zanoWallet; + constructor(params) { + if (typeof window === 'undefined') { + throw new Error('ZanoWallet can only be used in the browser'); + } + if (!window.zano) { + console.error('ZanoWallet requires the ZanoWallet extension to be installed'); + } + this.params = params; + this.zanoWallet = window.zano; + this.localStorageKey = params.customLocalStorageKey || this.DEFAULT_LOCAL_STORAGE_KEY; + } + handleError({ message }) { + if (this.params.onConnectError) { + this.params.onConnectError(message); + } + else { + console.error(message); + } + } + getSavedWalletCredentials() { + const savedWallet = localStorage.getItem(this.localStorageKey); + if (!savedWallet) + return undefined; + try { + return JSON.parse(savedWallet); + } + catch { + return undefined; + } + } + setWalletCredentials(credentials) { + if (credentials) { + localStorage.setItem(this.localStorageKey, JSON.stringify(credentials)); + } + else { + localStorage.removeItem(this.localStorageKey); + } + } + cleanWalletCredentials() { + this.setWalletCredentials(undefined); + } + async connect() { + if (this.params.beforeConnect) { + await this.params.beforeConnect(); + } + if (this.params.onConnectStart) { + this.params.onConnectStart(); + } + const walletData = (await window.zano.request('GET_WALLET_DATA')).data; + if (!walletData?.address) { + return this.handleError({ message: 'Companion is offline' }); + } + if (!walletData?.alias && this.params.aliasRequired) { + return this.handleError({ message: 'Alias not found' }); + } + let nonce = ""; + let signature = ""; + let publicKey = ""; + const existingWallet = this.params.useLocalStorage ? this.getSavedWalletCredentials() : undefined; + const existingWalletValid = existingWallet && existingWallet.address === walletData.address; + console.log('existingWalletValid', existingWalletValid); + console.log('existingWallet', existingWallet); + console.log('walletData', walletData); + if (existingWalletValid) { + nonce = existingWallet.nonce; + signature = existingWallet.signature; + publicKey = existingWallet.publicKey; + } + else { + const generatedNonce = this.params.customNonce || uuidv4(); + const signResult = await this.zanoWallet.request('REQUEST_MESSAGE_SIGN', { + message: generatedNonce + }, null); + if (!signResult?.data?.result) { + return this.handleError({ message: 'Failed to sign message' }); + } + nonce = generatedNonce; + signature = signResult.data.result.sig; + publicKey = signResult.data.result.pkey; + } + const serverData = { + alias: walletData.alias, + address: walletData.address, + signature, + pkey: publicKey, + message: nonce, + isSavedData: existingWalletValid + }; + if (this.params.onLocalConnectEnd) { + this.params.onLocalConnectEnd(serverData); + } + if (!this.params.disableServerRequest) { + const result = await fetch(this.params.customServerPath || "/api/auth", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + data: serverData + }) + }) + .then(res => res.json()) + .catch((e) => ({ + success: false, + error: e.message + })); + if (!result?.success || !result?.data) { + return this.handleError({ message: result.error }); + } + if (!existingWalletValid && this.params.useLocalStorage) { + this.setWalletCredentials({ + publicKey, + signature, + nonce, + address: walletData.address + }); + } + if (this.params.onConnectEnd) { + this.params.onConnectEnd({ + ...serverData, + token: result.data.token + }); + } + } + return true; + } + async getWallet() { + return (await this.zanoWallet.request('GET_WALLET_DATA'))?.data; + } + async getAddressByAlias(alias) { + return ((await this.zanoWallet.request('GET_ALIAS_DETAILS', { alias })) || undefined); + } + async createAlias(alias) { + return ((await this.zanoWallet.request('CREATE_ALIAS', { alias })) || undefined).data; + } +} +export default ZanoWallet; +//# sourceMappingURL=zanoWallet.js.map \ No newline at end of file diff --git a/web/dist/zanoWallet.js.map b/web/dist/zanoWallet.js.map new file mode 100644 index 0000000..2ba8e76 --- /dev/null +++ b/web/dist/zanoWallet.js.map @@ -0,0 +1 @@ +{"version":3,"file":"zanoWallet.js","sourceRoot":"","sources":["../src/zanoWallet.ts"],"names":[],"mappings":"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"} \ No newline at end of file