From 4965494b0967e962adf3610c04274e043b1cb3b3 Mon Sep 17 00:00:00 2001 From: Sparkswap Date: Fri, 3 Jan 2020 04:48:49 +0000 Subject: [PATCH] Publishing client to sparkswap-desktop: v0.3.6 --- package-lock.json | 2 +- package.json | 2 +- src/common/config.ts | 1 + .../anchor-engine/anchor-engine.ts | 13 +- src/global-shared/anchor-engine/api.ts | 21 ++- src/global-shared/api.ts | 3 +- src/global-shared/fetch-json.ts | 33 +++- src/global-shared/lnd-engine/config.ts | 1 + src/global-shared/lnd-engine/connect-peer.ts | 25 +++ .../lnd-engine/create-channel.ts | 73 ++++++++ src/global-shared/lnd-engine/deadline.ts | 3 + src/global-shared/lnd-engine/index.ts | 2 + src/global-shared/lnd-engine/pay-invoice.ts | 8 +- src/global-shared/lnd-engine/utils/index.ts | 2 + .../lnd-engine/utils/loggable-pubkey.ts | 5 + .../utils/network-address-formatter.ts | 17 ++ src/global-shared/parsers.ts | 9 + .../types/lnd-engine/client/index.ts | 126 +++++++++++++- src/global-shared/types/server.ts | 6 + src/global-shared/util.ts | 2 +- src/global-shared/validation.ts | 14 +- src/node/content-security-policies.ts | 11 +- src/node/data/events.ts | 25 +++ src/node/data/index.ts | 8 +- .../migrations/0002-create-events-table.sql | 11 ++ src/node/data/migrations/index.ts | 3 +- src/node/data/trades.ts | 10 +- src/node/router.ts | 5 +- src/node/util.ts | 10 +- src/web/custom.d.ts | 5 + src/web/domain/history.ts | 32 +++- src/web/domain/main-request.ts | 16 +- src/web/domain/proof-of-keys.ts | 55 ++++++ src/web/domain/server.ts | 9 +- src/web/ui/App.css | 13 +- src/web/ui/App.tsx | 2 + src/web/ui/Balances.tsx | 2 +- src/web/ui/History.tsx | 64 ++++++- src/web/ui/PayInvoice.tsx | 24 ++- src/web/ui/Trade.tsx | 2 +- src/web/ui/assets/sparkswap-tile.jpg | Bin 0 -> 89040 bytes src/web/ui/assets/twitter.svg | 58 +++++++ src/web/ui/components/ExternalSource.tsx | 1 + src/web/ui/components/ValidatedInput.tsx | 68 ++++++++ src/web/ui/components/index.ts | 4 +- src/web/ui/onboarding/deposit-dialog.tsx | 2 +- src/web/ui/onboarding/form-field.tsx | 8 +- .../ui/onboarding/register-sparkswap-kyc.tsx | 81 ++++++--- src/web/ui/proof-of-keys-dialog.css | 25 +++ src/web/ui/proof-of-keys-dialog.tsx | 161 ++++++++++++++++++ src/web/ui/proof-of-keys.tsx | 48 ++++++ 51 files changed, 1048 insertions(+), 83 deletions(-) create mode 100644 src/global-shared/lnd-engine/config.ts create mode 100644 src/global-shared/lnd-engine/connect-peer.ts create mode 100644 src/global-shared/lnd-engine/create-channel.ts create mode 100644 src/global-shared/lnd-engine/deadline.ts create mode 100644 src/global-shared/lnd-engine/utils/index.ts create mode 100644 src/global-shared/lnd-engine/utils/loggable-pubkey.ts create mode 100644 src/global-shared/lnd-engine/utils/network-address-formatter.ts create mode 100644 src/global-shared/parsers.ts create mode 100644 src/node/data/events.ts create mode 100644 src/node/data/migrations/0002-create-events-table.sql create mode 100644 src/web/domain/proof-of-keys.ts create mode 100644 src/web/ui/assets/sparkswap-tile.jpg create mode 100755 src/web/ui/assets/twitter.svg create mode 100644 src/web/ui/components/ValidatedInput.tsx create mode 100644 src/web/ui/proof-of-keys-dialog.css create mode 100644 src/web/ui/proof-of-keys-dialog.tsx create mode 100644 src/web/ui/proof-of-keys.tsx diff --git a/package-lock.json b/package-lock.json index 3d683c0..e9e6867 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sparkswap-desktop", - "version": "0.3.5", + "version": "0.3.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2628322..45c00f0 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "author": "Sparkswap (https://github.com/sparkswap)", "description": "Sparkswap Desktop: the only way to buy Bitcoin instantly", "productName": "Sparkswap", - "version": "0.3.5", + "version": "0.3.6", "license": "MIT", "private": true, "main": "./build/electron.js", diff --git a/src/common/config.ts b/src/common/config.ts index 0bef47f..9d00e63 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -4,6 +4,7 @@ export const IS_TEST = process.env.REACT_APP_ENV === 'test' export const API_URL = IS_PRODUCTION ? 'https://stack.sparkswap.com' : 'http://localhost:3000' export const WEBSOCKETS_URL = IS_PRODUCTION ? 'wss://stack.sparkswap.com' : 'ws://localhost:3000' +export const PROOF_HOST = IS_PRODUCTION ? 'https://sparkswap.com' : 'http://localhost:3001' export const ZAPIER_HOOK = 'https://hooks.zapier.com/hooks/catch/5808043/o2fl9bt/' export const IP_API_URL = 'https://ipapi.co/json' diff --git a/src/global-shared/anchor-engine/anchor-engine.ts b/src/global-shared/anchor-engine/anchor-engine.ts index 0e911da..5dfd06f 100644 --- a/src/global-shared/anchor-engine/anchor-engine.ts +++ b/src/global-shared/anchor-engine/anchor-engine.ts @@ -135,9 +135,16 @@ export class AnchorEngine { `timeFromNow: ${timeFromNow}, finalDelta: ${finalDelta}`) } - const newEscrow = await api.createEscrow(this.apiKey, hash, recipientId, amount, expiration) - this.logger.debug(`Escrow for swap (${hash}) created`) - return newEscrow + try { + const newEscrow = await api.createEscrow(this.apiKey, hash, recipientId, amount, expiration) + this.logger.debug(`Escrow for swap (${hash}) created`) + return newEscrow + } catch (e) { + if (e.code && Object.values(api.CreateEscrowErrorCodes).includes(e.code)) { + throw new PermanentSwapError(`Error while creating escrow: ${e.reason}`) + } + throw e + } } private async waitForEscrowEnd (startedEscrow: api.Escrow): Promise { diff --git a/src/global-shared/anchor-engine/api.ts b/src/global-shared/anchor-engine/api.ts index e8358ec..d64e238 100644 --- a/src/global-shared/anchor-engine/api.ts +++ b/src/global-shared/anchor-engine/api.ts @@ -22,6 +22,23 @@ export enum EscrowStatus { complete = 'complete' } +export class AnchorError extends Error { + param?: string + code?: string + error?: string + reason?: string +} + +// see: https://www.anchorusd.com/9c0cba91e667a08e467f038b6e23e3c4/api/index.html#/?id=create-escrow +export enum CreateEscrowErrorCodes { + insufficientFunds = 'insufficient_funds', + recipientNotFound = 'not_found', + positiveDurationRequired = 'positive_duration_required', + duplicateTimeout = 'duplicate_timeout_parameters', + invalidHashFormat = 'invalid_format', + futureTimeoutRequired = 'future_timestamp_required' +} + // see: https://www.anchorusd.com/9c0cba91e667a08e467f038b6e23e3c4/api/index.html#/?id=the-escrow-object // Note: Hashes and preimages are hex on Anchor, but we use base64. So there needs to be a conversion // prior to sending to the Anchor API or receiving from it. @@ -173,7 +190,9 @@ export async function createEscrow (apiKey: string, hash: SwapHash, recipientId: amount: Amount, expiration: Date): Promise { const duration = Math.floor((expiration.getTime() - (new Date()).getTime()) / 1000) if (duration <= 0) { - throw new Error(`Escrow duration is too short (${duration}s)`) + const error = new AnchorError(`Escrow duration is too short (${duration}s)`) + error.code = CreateEscrowErrorCodes.positiveDurationRequired + throw error } const res = await request( apiKey, diff --git a/src/global-shared/api.ts b/src/global-shared/api.ts index e304bf6..80ecbcc 100644 --- a/src/global-shared/api.ts +++ b/src/global-shared/api.ts @@ -16,5 +16,6 @@ export const API_ENDPOINTS: { [key: string]: string } = { VERIFY_PHONE: '/verify-phone', START_BERBIX: '/start-berbix', FINISH_BERBIX: '/finish-berbix', - SUBMIT_PHOTO_ID: '/submit-photo-id' + SUBMIT_PHOTO_ID: '/submit-photo-id', + GET_PROOF: '/proof-of-keys' } diff --git a/src/global-shared/fetch-json.ts b/src/global-shared/fetch-json.ts index 7bae29c..2b756e7 100644 --- a/src/global-shared/fetch-json.ts +++ b/src/global-shared/fetch-json.ts @@ -1,12 +1,27 @@ import fetch, { Headers, RequestInit } from 'node-fetch' import logger from './logger' +interface FetchJsonErrorOpts { + status?: number, + code?: string, + error?: string, + reason?: string +} + class FetchJsonError extends Error { - statusCode?: number + status?: number + code?: string + error?: string + reason?: string - constructor (message?: string, statusCode?: number) { + constructor (message?: string, opts?: FetchJsonErrorOpts) { super(message) - this.statusCode = statusCode + if (opts) { + this.status = opts.status + this.code = opts.code + this.error = opts.error + this.reason = opts.reason + } } } @@ -46,7 +61,7 @@ Promise<{ ok: boolean, status: number, json: unknown }> { return { ok: res.ok, status: res.status, json } } catch (e) { const message = `Error while requesting "${httpOptions.method} ${url}": ${res.status} ${res.statusText}` - throw new FetchJsonError(message, res.status) + throw new FetchJsonError(message, { status: res.status }) } } @@ -71,7 +86,15 @@ export default async function fetchJSON (url: string, httpOptions: RequestInit, if (!ok && !(options.ignoreCodes && options.ignoreCodes.includes(status))) { const message = isUnknownJSON(json) ? getErrorMessage(json) : '' - throw new FetchJsonError(`Error while requesting "${httpOptions.method} ${url}": ${message}`, status) + const opts = { status } + if (isUnknownJSON(json)) { + Object.assign(opts, { + code: json.code, + error: json.error, + reason: json.reason + }) + } + throw new FetchJsonError(`Error while requesting "${httpOptions.method} ${url}": ${message}`, opts) } if (isUnknownJSON(json)) { diff --git a/src/global-shared/lnd-engine/config.ts b/src/global-shared/lnd-engine/config.ts new file mode 100644 index 0000000..93b5594 --- /dev/null +++ b/src/global-shared/lnd-engine/config.ts @@ -0,0 +1 @@ +export const SECONDS_PER_BLOCK = 600 diff --git a/src/global-shared/lnd-engine/connect-peer.ts b/src/global-shared/lnd-engine/connect-peer.ts new file mode 100644 index 0000000..8175d42 --- /dev/null +++ b/src/global-shared/lnd-engine/connect-peer.ts @@ -0,0 +1,25 @@ +import { LndActionOptions, GrpcError } from '../types/lnd-engine/client' +import { deadline } from './deadline' +import { promisify } from 'util' + +function alreadyConnected (err: GrpcError): boolean { + return (err && err.code === 2 && err.details != null && err.details.includes('already connected to peer')) +} + +export async function connectPeer (publicKey: string, host: string, { client, logger }: LndActionOptions): Promise { + const connect = promisify(client.connectPeer).bind(client) + const addr = { + pubkey: publicKey, + host + } + + try { + await connect({ addr }, { deadline: deadline() }) + } catch (e) { + if (alreadyConnected(e)) { + logger.debug(`Peer already connected: ${publicKey}`) + return + } + throw e + } +} diff --git a/src/global-shared/lnd-engine/create-channel.ts b/src/global-shared/lnd-engine/create-channel.ts new file mode 100644 index 0000000..30aa2ca --- /dev/null +++ b/src/global-shared/lnd-engine/create-channel.ts @@ -0,0 +1,73 @@ +import { + LndActionOptions, + OpenChannelResponse, + PendingUpdateResponse, + ChannelOpenResponse +} from '../types/lnd-engine/client' +import { SECONDS_PER_BLOCK } from './config' +import { connectPeer } from './connect-peer' +import { + parse as parseAddress, + loggablePubKey +} from './utils' + +// Default number of seconds before our first confirmation. (30 minutes) +const DEFAULT_CONFIRMATION_DELAY = 1800 + +interface CreateChannelOptions { + targetTime?: number, + privateChan?: boolean +} + +function isPendingUpdateResponse (res: OpenChannelResponse): res is PendingUpdateResponse { + return Object.keys(res).includes('chanPending') +} + +function isChannelOpenUpdateResponse (res: OpenChannelResponse): res is ChannelOpenResponse { + return Object.keys(res).includes('chanOpen') +} + +export async function createChannel (paymentChannelNetworkAddress: string, fundingAmount: number, { + targetTime = DEFAULT_CONFIRMATION_DELAY, + privateChan = false +}: CreateChannelOptions, +{ client, logger }: LndActionOptions): Promise { + const targetConf = Math.max(Math.floor(targetTime / SECONDS_PER_BLOCK), 1) + const { publicKey, host } = parseAddress(paymentChannelNetworkAddress) + const loggablePublicKey = loggablePubKey(publicKey) + + logger.debug(`Attempting to create a channel with ${loggablePublicKey}`) + + if (host) { + await connectPeer(publicKey, host, { client, logger }) + } else { + logger.debug(`Skipping connect peer. Host is missing for pubkey ${loggablePublicKey}`) + } + + logger.debug(`Successfully connected to peer: ${loggablePublicKey}`) + + return new Promise((resolve, reject) => { + try { + const call = client.openChannel({ + nodePubkey: Buffer.from(publicKey, 'hex'), + localFundingAmount: fundingAmount, + targetConf, + private: privateChan + }) + + call.on('data', data => { + if (isPendingUpdateResponse(data)) { + return resolve() + } + + if (isChannelOpenUpdateResponse(data)) { + return resolve() + } + }) + + call.on('error', reject) + } catch (e) { + reject(e) + } + }) +} diff --git a/src/global-shared/lnd-engine/deadline.ts b/src/global-shared/lnd-engine/deadline.ts new file mode 100644 index 0000000..2ed2ae9 --- /dev/null +++ b/src/global-shared/lnd-engine/deadline.ts @@ -0,0 +1,3 @@ +export function deadline (duration = 30): number { + return new Date().setSeconds(new Date().getSeconds() + duration) +} diff --git a/src/global-shared/lnd-engine/index.ts b/src/global-shared/lnd-engine/index.ts index 760e10a..be409b6 100644 --- a/src/global-shared/lnd-engine/index.ts +++ b/src/global-shared/lnd-engine/index.ts @@ -1 +1,3 @@ +export { deadline } from './deadline' export { payInvoice } from './pay-invoice' +export { SECONDS_PER_BLOCK } from './config' diff --git a/src/global-shared/lnd-engine/pay-invoice.ts b/src/global-shared/lnd-engine/pay-invoice.ts index b4a97d6..11f869a 100644 --- a/src/global-shared/lnd-engine/pay-invoice.ts +++ b/src/global-shared/lnd-engine/pay-invoice.ts @@ -1,6 +1,5 @@ -import { LndEngineClient } from 'lnd-engine' -import { LoggerInterface } from '../logger' import { SendPaymentState } from '../types/lnd-engine/client/router' +import { LndActionOptions } from '../types/lnd-engine/client' // Default value of invoice timeout taken from the original `sendPayment` Lightning rpc // which is 60 seconds. @@ -10,11 +9,6 @@ const INVOICE_TIMEOUT_IN_SECONDS = 60 // value for an `unlimited` fee limit from LND const INVOICE_FEE_LIMIT = '9223372036854775807' -interface LndActionOptions { - client: LndEngineClient, - logger: LoggerInterface -} - export function payInvoice (paymentRequest: string, { client, logger }: LndActionOptions): Promise { return new Promise((resolve, reject) => { logger.debug('Attempting to pay invoice') diff --git a/src/global-shared/lnd-engine/utils/index.ts b/src/global-shared/lnd-engine/utils/index.ts new file mode 100644 index 0000000..a871e76 --- /dev/null +++ b/src/global-shared/lnd-engine/utils/index.ts @@ -0,0 +1,2 @@ +export { parse } from './network-address-formatter' +export { loggablePubKey } from './loggable-pubkey' diff --git a/src/global-shared/lnd-engine/utils/loggable-pubkey.ts b/src/global-shared/lnd-engine/utils/loggable-pubkey.ts new file mode 100644 index 0000000..1599ed5 --- /dev/null +++ b/src/global-shared/lnd-engine/utils/loggable-pubkey.ts @@ -0,0 +1,5 @@ +import { Nullable } from '../../types' + +export function loggablePubKey (pubkey: Nullable): Nullable { + return pubkey ? `${pubkey.slice(0, 15)}...` : null +} diff --git a/src/global-shared/lnd-engine/utils/network-address-formatter.ts b/src/global-shared/lnd-engine/utils/network-address-formatter.ts new file mode 100644 index 0000000..f0c1aa6 --- /dev/null +++ b/src/global-shared/lnd-engine/utils/network-address-formatter.ts @@ -0,0 +1,17 @@ +const DELIMITER = ':' +const NETWORK_TYPE = 'bolt' + +interface ParsedAddress { + publicKey: string, + host?: string +} + +export function parse (paymentChannelNetworkAddress: string): ParsedAddress { + const [networkType, networkAddress] = paymentChannelNetworkAddress.split(DELIMITER, 2) + if (networkType !== NETWORK_TYPE) { + throw new Error(`Unable to parse address for payment channel network type of '${networkType}'`) + } + + const [publicKey, host] = networkAddress.split('@', 2) + return { publicKey, host } +} diff --git a/src/global-shared/parsers.ts b/src/global-shared/parsers.ts new file mode 100644 index 0000000..e3b8e92 --- /dev/null +++ b/src/global-shared/parsers.ts @@ -0,0 +1,9 @@ +export function parsePhoneNumber (phone: string): string { + const digits = phone.split('-').join('').split(' ').join('') + return digits.startsWith('+') ? digits : '+1' + digits +} + +export function parseSSN (ssn: string): string { + const digits = ssn.split('-').join('').split(' ').join('') + return [digits.slice(0, 3), digits.slice(3, 5), digits.slice(5)].join('-') +} diff --git a/src/global-shared/types/lnd-engine/client/index.ts b/src/global-shared/types/lnd-engine/client/index.ts index ccac68c..49f698e 100644 --- a/src/global-shared/types/lnd-engine/client/index.ts +++ b/src/global-shared/types/lnd-engine/client/index.ts @@ -1,5 +1,129 @@ import { LndRouter } from './router' +import { LndEngineClient } from 'lnd-engine' +import { LoggerInterface } from '../../../logger' + +export interface UTXO { + amountSat: string, + address: string +} + +export enum AddressType { + WITNESS_PUBKEY_HASH = 0, + NESTED_PUBKEY_HASH = 1 +} + +interface ListUnspentRequest { + minConfs: number, + maxConfs: number +} + +interface ListUnspentResponse { + utxos: UTXO[] +} + +export interface AddrToAmount { + [index: string]: string +} + +interface SendManyRequest { + AddrToAmount: AddrToAmount, + satPerByte?: string +} + +interface SendManyResponse { + txid: string +} + +interface NewAddressResponse { + address: string, + type?: AddressType +} + +interface EstimateFeeRequest { + AddrToAmount: AddrToAmount, + targetConf?: number +} + +interface EstimateFeeResposne { + feeSat: string, + feerateSatPerByte: string +} + +interface GrpcOptions { + deadline: number +} + +export interface LndActionOptions { + client: LndEngineClient, + logger: LoggerInterface +} + +interface LightningAddress { + pubkey: string, + host?: string +} + +interface ConnectPeerRequest { + addr: LightningAddress +} + +export interface GrpcError extends Error { + code: number, + details?: string +} + +interface OpenChannelRequest { + nodePubkey: Buffer, + localFundingAmount: number, + targetConf: number, + private: boolean +} + +interface PendingUpdate { + txid: Buffer, + outputIndex: number +} + +interface ChannelPoint { + fundingTxidBytes: Buffer +} + +interface ChannelOpenUpdate { + channelPoint: ChannelPoint +} + +export interface PendingUpdateResponse { + chanPending: PendingUpdate +} + +export interface ChannelOpenResponse { + chanOpen: ChannelOpenUpdate +} + +export type OpenChannelResponse = PendingUpdateResponse | ChannelOpenResponse + +interface OpenChannelResponseCall { + on(event: 'data', listener: (chunk: OpenChannelResponse) => void): this, + on(event: 'status', listener: (chunk: unknown) => void): this, + on(event: 'error', listener: (chunk: Error) => void): this, + end (): this +} + +interface SignMessageRequest { + msg: Buffer +} + +interface SignMessageResponse { + signature: string +} export interface Client { - router: LndRouter + router: LndRouter, + listUnspent: (req: ListUnspentRequest, opts: GrpcOptions, cb: (err: GrpcError, res: ListUnspentResponse) => void) => void, + sendMany: (req: SendManyRequest, opts: GrpcOptions, cb: (err: GrpcError, res: SendManyResponse) => void) => void, + newAddress: (req: {}, opts: GrpcOptions, cb: (err: GrpcError, res: NewAddressResponse) => void) => void, + estimateFee: (req: EstimateFeeRequest, opts: GrpcOptions, cb: (err: GrpcError, res: EstimateFeeResposne) => void) => void, + connectPeer: (req: ConnectPeerRequest, opts: GrpcOptions, cb: (err: GrpcError, res: {}) => void) => void, + openChannel (req: OpenChannelRequest): OpenChannelResponseCall, + signMessage: (req: SignMessageRequest, opts: GrpcOptions, cb: (err: GrpcError, res: SignMessageResponse) => void) => void } diff --git a/src/global-shared/types/server.ts b/src/global-shared/types/server.ts index 8a633a6..d88c53b 100644 --- a/src/global-shared/types/server.ts +++ b/src/global-shared/types/server.ts @@ -70,3 +70,9 @@ export interface VerifyPhoneResponse { export interface JurisdictionWhitelistResponse { regions: string[] } + +export interface ProofOfKeysResponse { + publicId: string, + message: string, + signature: string +} diff --git a/src/global-shared/util.ts b/src/global-shared/util.ts index 08428b4..49be759 100644 --- a/src/global-shared/util.ts +++ b/src/global-shared/util.ts @@ -2,7 +2,7 @@ import { createHash } from 'crypto' import { SwapHash, SwapPreimage } from './types' export function fail (error: Error): void { - console.log(error) + console.error(error) process.exit(1) } diff --git a/src/global-shared/validation.ts b/src/global-shared/validation.ts index 3f7f08d..8b25a4f 100644 --- a/src/global-shared/validation.ts +++ b/src/global-shared/validation.ts @@ -25,6 +25,12 @@ export function isValidSSN (ssn: string): boolean { if (area.length !== 3 || group.length !== 2 || serial.length !== 4) { return false } + if (area === '000' || group === '00' || serial === '0000') { + return false + } + if (area === '666' || area[0] === '9') { + return false + } return true } @@ -38,7 +44,7 @@ export function isValidBirthdate (birthdate: string): boolean { if (!isDigits(year) || !isDigits(month) || !isDigits(day)) { return false } - const oldestYear = 1850 // oldest birth year that Cognito allows + const oldestYear = 1850 const currentYear = (new Date()).getFullYear() if (parseInt(year, 10) < oldestYear || parseInt(year, 10) > currentYear) { return false @@ -52,12 +58,16 @@ export function isValidBirthdate (birthdate: string): boolean { return true } +export function isValidPostalCode (postalCode: string): boolean { + return isDigits(postalCode) && postalCode.length === 5 +} + export function isValidAddress (address: Address): boolean { if (address.street.length === 0 || address.city.length === 0 || address.state.length === 0 || address.country.length === 0) { return false } - if (!isDigits(address.postalCode) || address.postalCode.length !== 5) { + if (!isValidPostalCode(address.postalCode)) { return false } return true diff --git a/src/node/content-security-policies.ts b/src/node/content-security-policies.ts index f0c59d0..761fc12 100644 --- a/src/node/content-security-policies.ts +++ b/src/node/content-security-policies.ts @@ -14,7 +14,16 @@ const CONNECT_SRC_EXT = IS_PRODUCTION ? '' : `localhost:* ws://localhost:*` // https://docs.helpscout.com/article/815-csp-settings-for-beacon // Beacon removed rules (these aren't necessary for the contact form): // connect-src: wss://*.pusher.com *.sumologic.com sentry.io -const APP_CONTENT_SECURITY_POLICY = `connect-src https://ipapi.co https://hooks.zapier.com https://beaconapi.helpscout.net https://chatapi.helpscout.net https://d3hb14vkzrxvla.cloudfront.net ${CONNECT_SRC_EXT}; style-src 'unsafe-inline' https://fonts.googleapis.com https://beacon-v2.helpscout.net https://djtflbt20bdde.cloudfront.net; font-src https://fonts.gstatic.com; base-uri https://docs.helpscout.com; frame-src https://beacon-v2.helpscout.net https://verify.berbix.com; object-src https://beacon-v2.helpscout.net; img-src https://d33v4339jhl8k0.cloudfront.net ${IMG_SRC_EXT}; media-src https://beacon-v2.helpscout.net; script-src 'self' https://beacon-v2.helpscout.net https://d12wqas9hcki3z.cloudfront.net https://d33v4339jhl8k0.cloudfront.net ${SCRIPT_SRC_EXT}` +const APP_CONTENT_SECURITY_POLICY = ` + connect-src https://ipapi.co https://hooks.zapier.com https://beaconapi.helpscout.net https://chatapi.helpscout.net https://d3hb14vkzrxvla.cloudfront.net ${CONNECT_SRC_EXT}; + style-src 'unsafe-inline' https://fonts.googleapis.com https://beacon-v2.helpscout.net https://djtflbt20bdde.cloudfront.net; + font-src https://fonts.gstatic.com; + base-uri https://docs.helpscout.com; + frame-src https://beacon-v2.helpscout.net https://verify.berbix.com; + object-src https://beacon-v2.helpscout.net; + img-src https://d33v4339jhl8k0.cloudfront.net ${IMG_SRC_EXT}; + media-src https://beacon-v2.helpscout.net; + script-src 'self' https://beacon-v2.helpscout.net https://d12wqas9hcki3z.cloudfront.net https://d33v4339jhl8k0.cloudfront.net ${SCRIPT_SRC_EXT}` const ANCHOR_PROD_WHITELIST = 'production.plaid.com:*' const ANCHOR_DEV_WHITELIST = 'sandbox.plaid.com:* development.plaid.com:*' diff --git a/src/node/data/events.ts b/src/node/data/events.ts new file mode 100644 index 0000000..3a1edb8 --- /dev/null +++ b/src/node/data/events.ts @@ -0,0 +1,25 @@ +import { Database } from 'better-sqlite3' + +const PROOF_OF_KEYS_EVENT = 'shownProofOfKeys' + +export function hasShownProofOfKeys (db: Database): boolean { + const statement = db.prepare(` + SELECT COUNT(id) + FROM events + WHERE type = @eventType + `) + + return Boolean(statement.pluck().get({ eventType: PROOF_OF_KEYS_EVENT })) +} + +export function markProofOfKeysShown (db: Database): void { + const statement = db.prepare(` + INSERT INTO events ( + type + ) VALUES ( + @eventType + ) + `) + + statement.run({ eventType: PROOF_OF_KEYS_EVENT }) +} diff --git a/src/node/data/index.ts b/src/node/data/index.ts index bd4bfe4..0959702 100644 --- a/src/node/data/index.ts +++ b/src/node/data/index.ts @@ -8,6 +8,10 @@ import { failTrade, updater as tradeUpdater } from './trades' +import { + markProofOfKeysShown, + hasShownProofOfKeys +} from './events' export { initialize, @@ -18,5 +22,7 @@ export { getPendingTrades, completeTrade, failTrade, - tradeUpdater + tradeUpdater, + markProofOfKeysShown, + hasShownProofOfKeys } diff --git a/src/node/data/migrations/0002-create-events-table.sql b/src/node/data/migrations/0002-create-events-table.sql new file mode 100644 index 0000000..a5abdb6 --- /dev/null +++ b/src/node/data/migrations/0002-create-events-table.sql @@ -0,0 +1,11 @@ +CREATE TABLE eventTypes ( + name VARCHAR(100) PRIMARY KEY NOT NULL +); + +INSERT INTO eventTypes(name) VALUES('shownProofOfKeys'); + +CREATE TABLE events ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + type VARCHAR(100) NOT NULL REFERENCES eventTypes(name), + timestamp DATETIME NOT NULL DEFAULT current_timestamp +); diff --git a/src/node/data/migrations/index.ts b/src/node/data/migrations/index.ts index 72a0ace..10235a6 100644 --- a/src/node/data/migrations/index.ts +++ b/src/node/data/migrations/index.ts @@ -2,7 +2,8 @@ import { join as pathJoin } from 'path' import { readdirSync } from 'fs' const migrationFilePaths = [ - pathJoin(__dirname, '0001-create-trades-table.sql') + pathJoin(__dirname, '0001-create-trades-table.sql'), + pathJoin(__dirname, '0002-create-events-table.sql') ] const version = migrationFilePaths.length diff --git a/src/node/data/trades.ts b/src/node/data/trades.ts index 23cd047..820da11 100644 --- a/src/node/data/trades.ts +++ b/src/node/data/trades.ts @@ -155,7 +155,7 @@ WHERE id = @id updater.emit('update', id) } -export function getTrades (db: Database, since = new Date(0), limit = 100): Trade[] { +export function getTrades (db: Database, olderThanTradeId = Number.MAX_SAFE_INTEGER, limit = 100): Trade[] { const statement = db.prepare(` SELECT id, @@ -171,14 +171,12 @@ SELECT preimage, failureCode FROM trades -WHERE startTime >= datetime(@sinceTimestamp, 'unixepoch', 'localtime') -ORDER BY datetime(startTime) DESC +WHERE id < @olderThanTradeId +ORDER BY id DESC LIMIT @limit `) - const sinceTimestamp = Math.round(since.getTime() / 1000) - - const dbTrades = statement.all({ sinceTimestamp, limit }) + const dbTrades = statement.all({ olderThanTradeId, limit }) return dbTrades.map(deserializeTrade) } diff --git a/src/node/router.ts b/src/node/router.ts index c65cf10..a2bcd55 100644 --- a/src/node/router.ts +++ b/src/node/router.ts @@ -132,11 +132,14 @@ export class Router { listen('getBalance', (asset: string) => this.getBalance(valueToAsset(asset))) listen('openLink', ({ link }: { link: string}) => openLink(link)) listen('trade:execute', (quote: Quote) => executeTrade(this.db, this.engines, quote)) - listen('trade:getTrades', () => store.getTrades(this.db)) + listen('trade:getTrades', ({ limit, olderThanTradeId }: { limit: number, olderThanTradeId?: number }) => store.getTrades(this.db, olderThanTradeId, limit)) + listen('trade:getTrade', ({ id }: { id: number }) => store.getTrade(this.db, id)) listen('auth:getAuth', () => getAuth()) listen('anchor:startDeposit', () => this.anchorClient.startDeposit()) listenSync('getWebviewPreloadPath', () => path.join(__dirname, 'webview-preload.js')) listen('ntp:getTime', () => getNetworkTime()) + listen('pok:hasShown', () => store.hasShownProofOfKeys(this.db)) + listen('pok:markShown', () => store.markProofOfKeysShown(this.db)) } close (): void { diff --git a/src/node/util.ts b/src/node/util.ts index 65ab286..41e2da0 100644 --- a/src/node/util.ts +++ b/src/node/util.ts @@ -4,13 +4,19 @@ import { getAuth } from './auth' import { serverRequest as baseRequest } from '../common/utils' import { UnknownJSON } from '../global-shared/fetch-json' import { shell } from 'electron' -import { IS_TEST } from '../common/config' +import { IS_TEST, IS_PRODUCTION } from '../common/config' export function serverRequest (path: string, data: object = {}): Promise { return baseRequest(path, data, getAuth) } // TODO: make a whitelist of links and use that instead of just enforcing https/mailto +const PROTOCOL_WHITELIST = ['https:', 'mailto:'] + +if (!IS_PRODUCTION) { + PROTOCOL_WHITELIST.push('http:') +} + export function openLink (link: string): void { const url = new URL(link) @@ -19,7 +25,7 @@ export function openLink (link: string): void { return } - if (url.protocol === 'https:' || url.protocol === 'mailto:') { + if (PROTOCOL_WHITELIST.includes(url.protocol)) { shell.openExternal(link) } else { logger.warn(`tried to open insecure link: ${link}`) diff --git a/src/web/custom.d.ts b/src/web/custom.d.ts index 7b08fe9..9143a76 100644 --- a/src/web/custom.d.ts +++ b/src/web/custom.d.ts @@ -11,6 +11,11 @@ declare module '*.png' { export default pngSrc } +declare module '*.jpg' { + const jpgSrc: string + export default jpgSrc +} + declare module '*.txt' { const contents: string export default contents diff --git a/src/web/domain/history.ts b/src/web/domain/history.ts index f39cb8e..df530d7 100644 --- a/src/web/domain/history.ts +++ b/src/web/domain/history.ts @@ -1,20 +1,38 @@ -import { getTrades } from './main-request' -import { Trade } from '../../common/types' +import { getTrades, getTrade } from './main-request' +import { Trade, TradeStatus } from '../../common/types' import { EventEmitter } from 'events' import { ipcRenderer } from '../electron' -export let trades: Trade[] = [] +export const trades: Map = new Map() export const updater = new EventEmitter() -async function updateTrades (): Promise { - trades = await getTrades() +export let canLoadMore = false + +const TRADE_LIMIT = 100 + +// Returns a boolean indicating whether there additional trades that +// can be loaded. +export async function loadTrades (olderThanTradeId?: number): Promise { + const tradesArr = await getTrades(TRADE_LIMIT, olderThanTradeId) + tradesArr.forEach(trade => trades.set(trade.id, trade)) + + canLoadMore = tradesArr.length === TRADE_LIMIT + // the emit needs to go after setting `canLoadMore` so consumers + // can get the updated state when the updated trades go out updater.emit('update', trades) + return canLoadMore } async function subscribeTrades (): Promise { - await updateTrades() - ipcRenderer.on('tradeUpdate', (_event: Event, _id: number) => updateTrades()) + await loadTrades() + ipcRenderer.on('tradeUpdate', async (_event: Event, id: number): Promise => { + const trade = await getTrade(id) + trades.set(trade.id, trade) + updater.emit('update', trades) + const tradeStatusName = TradeStatus[trade.status] + updater.emit(`trade:${tradeStatusName}`, trade) + }) } subscribeTrades() diff --git a/src/web/domain/main-request.ts b/src/web/domain/main-request.ts index 5c08f31..8441f4e 100644 --- a/src/web/domain/main-request.ts +++ b/src/web/domain/main-request.ts @@ -61,8 +61,12 @@ function deserializeTrade (wireTrade: UnknownObject): Trade { } } -export async function getTrades (): Promise { - return (await mainRequest('trade:getTrades') as UnknownObject[]).map(deserializeTrade) +export async function getTrades (limit: number, olderThanTradeId?: number): Promise { + return (await mainRequest('trade:getTrades', { limit, olderThanTradeId }) as UnknownObject[]).map(deserializeTrade) +} + +export async function getTrade (id: number): Promise { + return deserializeTrade(await mainRequest('trade:getTrade', { id }) as UnknownObject) } export async function startDeposit (): Promise { @@ -89,4 +93,12 @@ export function handleLightningPaymentUri (fn: paymentUriHandler): void { }) } +export async function hasShownProofOfKeys (): Promise { + return await mainRequest('pok:hasShown') as boolean +} + +export async function markProofOfKeysShown (): Promise { + await mainRequest('pok:markShown') +} + export default mainRequest diff --git a/src/web/domain/proof-of-keys.ts b/src/web/domain/proof-of-keys.ts new file mode 100644 index 0000000..9fe151e --- /dev/null +++ b/src/web/domain/proof-of-keys.ts @@ -0,0 +1,55 @@ +import { markProofOfKeysShown, hasShownProofOfKeys } from './main-request' +import logger from '../../global-shared/logger' +import { getProofOfKeys } from './server' +import { updater as historyUpdater } from './history' +import { TradeStatus } from '../../common/types' +import { EventEmitter } from 'events' + +export let showProofOfKeys = false + +export const updater = new EventEmitter() + +const HISTORY_EVENT = `trade:${TradeStatus[TradeStatus.COMPLETE]}` +const PROOF_DATE = new Date('1/3/2020') + +export async function doneWithProofOfKeys (): Promise { + showProofOfKeys = false + updater.emit('update', showProofOfKeys) + try { + await markProofOfKeysShown() + } catch (e) { + logger.error(`Failed to mark proof of keys done: ${e}`) + } +} + +async function onTradeComplete (): Promise { + if (new Date() >= PROOF_DATE) { + try { + const { publicId } = await getProofOfKeys() + // only show the update if the proof generated successfully + if (publicId) { + showProofOfKeys = true + updater.emit('update', showProofOfKeys) + historyUpdater.removeListener(HISTORY_EVENT, onTradeComplete) + } else { + logger.error('Proof of keys ID was unavailable, skipping dialog') + } + } catch (e) { + logger.error(`Failed to show proof of keys on trade complete: ${e}`) + } + } +} + +async function subscribeProofOfKeys (): Promise { + try { + if (await hasShownProofOfKeys()) { + logger.debug('Skipping proof of keys listener setup') + } else { + historyUpdater.on(HISTORY_EVENT, onTradeComplete) + } + } catch (e) { + logger.error(`Failed to initialize proof of keys: ${e}`) + } +} + +subscribeProofOfKeys() diff --git a/src/web/domain/server.ts b/src/web/domain/server.ts index 0812a9d..a8e1725 100644 --- a/src/web/domain/server.ts +++ b/src/web/domain/server.ts @@ -9,7 +9,8 @@ import { JurisdictionWhitelistResponse, KYCUploadRequest, KYCUploadResponse, - VerifyPhoneResponse + VerifyPhoneResponse, + ProofOfKeysResponse } from '../../global-shared/types/server' import { UnknownJSON, isUnknownJSON } from '../../global-shared/fetch-json' @@ -93,3 +94,9 @@ export async function getApprovedJurisdictions (): Promise { + const res = await serverRequest(API_ENDPOINTS.GET_PROOF) + + return res as unknown as ProofOfKeysResponse +} diff --git a/src/web/ui/App.css b/src/web/ui/App.css index c4b8fab..ef0e740 100644 --- a/src/web/ui/App.css +++ b/src/web/ui/App.css @@ -1,3 +1,5 @@ +@import url("https://fonts.googleapis.com/css?family=Encode+Sans&text=₿"); + html { height: 100%; } @@ -17,7 +19,9 @@ body.sparkswap { to top right, rgba(27, 34, 42, 1), rgba(41, 52, 59, 1) ); - background-attachment: fixed + background-attachment: fixed; + font-family: -apple-system, "BlinkMacSystemFont", "Segoe UI", "Roboto", "Oxygen", + "Ubuntu", "Cantarell", "Open Sans", "Helvetica Neue", "Icons16", sans-serif, "Encode Sans"; } .App { @@ -161,6 +165,13 @@ body.sparkswap { /* Dialogs */ +.bp3-portal { + z-index: 1; +} +.bp3-portal.portal-behind { + z-index: 0; +} + .bp3-dark.sparkswap .bp3-dialog { width: 360px; background-color: rgba(16, 22, 26, 0.85); diff --git a/src/web/ui/App.tsx b/src/web/ui/App.tsx index 34d4fc0..8f83570 100644 --- a/src/web/ui/App.tsx +++ b/src/web/ui/App.tsx @@ -22,6 +22,7 @@ import { getAuth, openLinkInBrowser, startDeposit } from '../domain/main-request import { ReviewStatus, URL } from '../../global-shared/types' import { ReactComponent as Logo } from './assets/icon-dark.svg' import { Button, IActionProps } from '@blueprintjs/core' +import { ProofOfKeysDialog } from './proof-of-keys-dialog' interface OnboardingStep { stage: OnboardingStage, @@ -205,6 +206,7 @@ class App extends React.Component<{}, AppState> { + {
{this.renderBalance(Asset.BTC)} - + {this.renderConverted(Asset.BTC)}
diff --git a/src/web/ui/History.tsx b/src/web/ui/History.tsx index 9e87fe9..fe937b7 100644 --- a/src/web/ui/History.tsx +++ b/src/web/ui/History.tsx @@ -1,9 +1,15 @@ import React, { ReactNode } from 'react' import './History.css' -import { HTMLTable, H4, Spinner } from '@blueprintjs/core' +import { HTMLTable, H4, Spinner, Button } from '@blueprintjs/core' import { Trade, TradeStatus } from '../../common/types' import { formatDate, formatAmount } from './formatters' -import { trades, updater as tradeUpdater } from '../domain/history' +import { showErrorToast } from './AppToaster' +import { + trades, + updater as tradeUpdater, + loadTrades, + canLoadMore as canLoadMoreTrades +} from '../domain/history' interface HistoryRowProps { trade: Trade @@ -58,19 +64,66 @@ class HistoryRow extends React.PureComponent { } interface HistoryState { - trades: Trade[] + trades: Trade[], + loading: boolean, + canLoadMore: boolean +} + +function mapToArr (tradesMap: Map): Trade[] { + return Array.from(tradesMap.values()).sort((a, b) => { + return b.id - a.id + }) } class History extends React.PureComponent<{}, HistoryState> { constructor (props: object) { super(props) + this.state = { - trades + trades: mapToArr(trades), + loading: false, + canLoadMore: canLoadMoreTrades } } componentDidMount (): void { - tradeUpdater.on('update', trades => this.setState({ trades })) + tradeUpdater.on('update', trades => { + this.setState({ + trades: mapToArr(trades), + canLoadMore: canLoadMoreTrades + }) + }) + } + + handleLoadMore = async (): Promise => { + this.setState({ loading: true }) + const { trades } = this.state + try { + const lastTradeId = trades.length ? trades[trades.length - 1].id : undefined + const canLoadMore = await loadTrades(lastTradeId) + this.setState({ canLoadMore }) + } catch (e) { + showErrorToast(`Error while loading additional trades: ${e.message}`) + } finally { + this.setState({ loading: false }) + } + } + + renderLoadMore (): React.ReactNode { + if (!this.state.canLoadMore) { + return + } + + return ( + + ) } render (): React.ReactNode { @@ -93,6 +146,7 @@ class History extends React.PureComponent<{}, HistoryState> { {trades.map((trade) => )} + {this.renderLoadMore()}
diff --git a/src/web/ui/PayInvoice.tsx b/src/web/ui/PayInvoice.tsx index 608cad5..c819ef3 100644 --- a/src/web/ui/PayInvoice.tsx +++ b/src/web/ui/PayInvoice.tsx @@ -10,8 +10,13 @@ import logger from '../../global-shared/logger' import { Asset, Unit, Amount, Nullable } from '../../global-shared/types' import { SpinnerSuccess } from './components' import { formatAmount, formatAsset } from './formatters' +import { isUSDXSufficient } from '../domain/balance' import './PayInvoice.css' +interface PayInvoiceProps { + onDeposit: Function +} + interface PayInvoiceState { isDialogOpen: boolean, paymentRequest: string, @@ -36,8 +41,8 @@ const initialState: PayInvoiceState = { secondsRemaining: 0 } -class PayInvoice extends React.Component<{}, PayInvoiceState> { - constructor (props: {}) { +class PayInvoice extends React.Component { + constructor (props: PayInvoiceProps) { super(props) this.state = initialState @@ -172,6 +177,21 @@ class PayInvoice extends React.Component<{}, PayInvoiceState> { if (this.state.quote === null) { throw new Error(`Quote not loaded`) } + const usdxAmount = this.state.quote.sourceAmount.asset === Asset.USDX + ? this.state.quote.sourceAmount + : this.state.quote.destinationAmount + + if (!isUSDXSufficient(usdxAmount.value)) { + showErrorToast('Insufficient USD', { + onClick: () => this.props.onDeposit(), + text: 'Deposit' + }) + this.setState({ + isPaying: false + }) + return + } + await executeTrade(this.state.quote) } diff --git a/src/web/ui/Trade.tsx b/src/web/ui/Trade.tsx index 869f02d..51e64ef 100644 --- a/src/web/ui/Trade.tsx +++ b/src/web/ui/Trade.tsx @@ -307,7 +307,7 @@ class Trade extends React.Component { }) this.countdown() } catch (e) { - if (e.statusCode === 403) { + if (e.status === 403) { showSupportToast('Your account must be approved prior to trading') } else { showSupportToast('Failed to get price: ' + e.message) diff --git a/src/web/ui/assets/sparkswap-tile.jpg b/src/web/ui/assets/sparkswap-tile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..036f8f8236cc1b5d163a5f1aaffd625085ab272d GIT binary patch literal 89040 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%0DZGfkLUuy;T0J$`8+F-sAsR@8G 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 + + +image/svg+xml \ No newline at end of file diff --git a/src/web/ui/components/ExternalSource.tsx b/src/web/ui/components/ExternalSource.tsx index f628469..ec9a030 100644 --- a/src/web/ui/components/ExternalSource.tsx +++ b/src/web/ui/components/ExternalSource.tsx @@ -17,6 +17,7 @@ export class ExternalButton extends React.Component { return (