{"version":3,"sources":["webpack:///./src/services/auth-service.ts","webpack:///./src/services/hive-engine-service.ts"],"names":["http","httpSe","AuthService","getHttpClient","i18n","store","toast","user","name","account","configure","config","useStandardConfiguration","withBaseUrl","FIREBASE_API_HE","FIREBASE_API_SE","this","storeSubscription","state","subscribe","chain","Steem","apps","find","x","auth","currentUser","getIdToken","Hive","username","res","fetch","json","memo","signedKey","method","body","token","key","Promise","async","resolve","window","steem_keychain","encryptedMemo","getUserAuthMemo","requestVerifyKey","response","error","message","tr","ns","overrideOptions","timeout","result","substring","verifyUserAuthMemo","data","firebaseSteem","signInWithCustomToken","hive_keychain","isWif","getPrivateKeys","posting","err","wifToPublic","memo_key","key_auths","decode","e","loginSteem","loginHive","signOut","HiveEngineService","symbol","userName","peggedToken","getFormattedCoinPairs","p","pegged_token_symbol","Error","request","CONVERTER_API_HE","from_coin","to_coin","destination","address","console","coins","pairs","tokenPairs","nonPeggedCoins","filter","coin_type","push","coinFound","y","from_coin_symbol","tp","display_name","to_coin_symbol","sort","a","b","localeCompare","limit","offset","getUser","history","h","type","to","q","quantity","quantityLocked","quantityTokens","quantityReturned","quantityUnlocked","timestamp_string","unix","timestamp","format","timestamp_month_name","timestamp_day","timestamp_year","waitMsg","location","reload","transaction_data","log","requestCustomJson","chainId","JSON","stringify","success","tx","id"],"mappings":"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","file":"app~4ebb1a2a.a90871be69caa09c52b8.chunk.js","sourcesContent":["import { Subscription } from 'rxjs';\r\nimport { lazy, autoinject } from 'aurelia-framework';\r\nimport { HttpClient, json } from 'aurelia-fetch-client';\r\nimport { environment } from 'environment';\r\nimport firebase from 'firebase/app';\r\nimport { ToastMessage, ToastService } from './toast-service';\r\nimport { I18N } from 'aurelia-i18n';\r\nimport { Store, dispatchify } from 'aurelia-store';\r\nimport hive from '@hiveio/hive-js';\r\nimport { hiveSignerJson, getAccount } from 'common/hive';\r\nimport { Chain } from 'common/enums';\r\nimport { DefaultPopupTimeOut, firebaseSteemAppName, firebaseHiveAppName } from 'common/constants';\r\nimport { logout } from 'store/actions';\r\n\r\nconst http = new HttpClient();\r\nconst httpSe = new HttpClient();\r\n\r\n@autoinject()\r\nexport class AuthService {\r\n public http: HttpClient;\r\n public state: IState;\r\n\r\n public user = {\r\n name: '',\r\n account: {}\r\n };\r\n\r\n public storeSubscription: Subscription;\r\n\r\n constructor(@lazy(HttpClient) getHttpClient: () => HttpClient,\r\n private i18n: I18N,\r\n private store: Store,\r\n private toast: ToastService) {\r\n http.configure(config => {\r\n config\r\n .useStandardConfiguration()\r\n .withBaseUrl(environment.FIREBASE_API_HE)\r\n });\r\n\r\n httpSe.configure(config => {\r\n config\r\n .useStandardConfiguration()\r\n .withBaseUrl(environment.FIREBASE_API_SE)\r\n });\r\n \r\n this.storeSubscription = this.store.state.subscribe(state => {\r\n if (state) {\r\n this.state = state;\r\n\r\n this.user = state.account as any;\r\n }\r\n });\r\n }\r\n\r\n async getIdToken(chain: Chain) {\r\n if (chain === Chain.Steem) {\r\n let firebaseSteem = firebase.apps.find(x => x.name === firebaseSteemAppName);\r\n return firebaseSteem.auth().currentUser.getIdToken();\r\n } else if (chain === Chain.Hive) {\r\n let firebaseHive = firebase.apps.find(x => x.name === firebaseHiveAppName);\r\n return firebaseHive.auth().currentUser.getIdToken();\r\n }\r\n\r\n return firebase.auth().currentUser.getIdToken();\r\n }\r\n\r\n async getUserAuthMemo(username: string, chain: Chain): Promise {\r\n let res: any;\r\n\r\n if (chain === Chain.Hive) {\r\n res = await http.fetch(`getUserAuthMemo/${username}/`);\r\n } else if (chain === Chain.Steem) {\r\n res = await httpSe.fetch(`getUserAuthMemo/${username}/`);\r\n }\r\n\r\n const obj = await res.json();\r\n\r\n return obj.memo;\r\n }\r\n\r\n async verifyUserAuthMemo(username, signedKey, chain: Chain): Promise {\r\n let res: any;\r\n if (chain === Chain.Hive) {\r\n res = await http.fetch('verifyUserAuthMemo/', {\r\n method: 'POST',\r\n body: json({\r\n username,\r\n signedKey\r\n })\r\n });\r\n } else if (chain === Chain.Steem) {\r\n res = await httpSe.fetch('verifyUserAuthMemo/', {\r\n method: 'POST',\r\n body: json({\r\n username,\r\n signedKey\r\n })\r\n });\r\n }\r\n\r\n const obj = await res.json();\r\n\r\n return obj.token;\r\n }\r\n\r\n async loginSteem(username: string, key?: string, chain?: Chain): Promise {\r\n return new Promise(async (resolve) => {\r\n if (window.steem_keychain && !key) {\r\n // Get an encrypted memo only the user can decrypt with their private key\r\n const encryptedMemo = await this.getUserAuthMemo(username, chain) as string;\r\n\r\n window.steem_keychain.requestVerifyKey(username, encryptedMemo, 'Posting', async response => {\r\n if (response.error) {\r\n const toast = new ToastMessage();\r\n\r\n toast.message = this.i18n.tr('errorLogin', {\r\n ns: 'errors'\r\n });\r\n toast.overrideOptions.timeout = DefaultPopupTimeOut;\r\n\r\n this.toast.error(toast);\r\n\r\n resolve(false);\r\n } else {\r\n // Get the return memo and remove the '#' at the start of the private memo\r\n const signedKey = (response.result as unknown as string).substring(1);\r\n\r\n // The decrypted memo is an encrypted string, so pass this to the server to get back refresh and access tokens\r\n const token = await this.verifyUserAuthMemo(response.data.username, signedKey, chain) as string;\r\n\r\n let firebaseSteem = firebase.apps.find(x => x.name === firebaseSteemAppName);\r\n await firebaseSteem.auth().signInWithCustomToken(token);\r\n\r\n resolve({ username, token });\r\n }\r\n });\r\n } else {\r\n\r\n }\r\n });\r\n };\r\n\r\n async loginHive(username: string, key?: string, chain?: Chain): Promise {\r\n return new Promise(async (resolve) => {\r\n if (window.hive_keychain && !key) {\r\n // Get an encrypted memo only the user can decrypt with their private key\r\n const encryptedMemo = await this.getUserAuthMemo(username, chain) as string;\r\n\r\n window.hive_keychain.requestVerifyKey(username, encryptedMemo, 'Posting', async response => {\r\n if (response.error) {\r\n const toast = new ToastMessage();\r\n\r\n toast.message = this.i18n.tr('errorLogin', {\r\n ns: 'errors'\r\n });\r\n toast.overrideOptions.timeout = DefaultPopupTimeOut;\r\n\r\n this.toast.error(toast);\r\n\r\n resolve(false);\r\n } else {\r\n // Get the return memo and remove the '#' at the start of the private memo\r\n const signedKey = (response.result as unknown as string).substring(1);\r\n\r\n // The decrypted memo is an encrypted string, so pass this to the server to get back refresh and access tokens\r\n const token = await this.verifyUserAuthMemo(response.data.username, signedKey, chain) as string;\r\n\r\n await firebase.auth().signInWithCustomToken(token);\r\n\r\n resolve({ username, token });\r\n }\r\n });\r\n } else {\r\n try {\r\n if (key && !hive.auth.isWif(key)) {\r\n key = hive.auth.getPrivateKeys(username, key, ['posting']).posting;\r\n }\r\n } catch (err) {\r\n const toast = new ToastMessage();\r\n\r\n toast.message = this.i18n.tr('invalidPrivateKeyOrPassword', {\r\n ns: 'errors'\r\n });\r\n toast.overrideOptions.timeout = DefaultPopupTimeOut;\r\n\r\n this.toast.error(toast);\r\n\r\n resolve(false);\r\n }\r\n\r\n try {\r\n const user = await getAccount(username);\r\n\r\n if (user) {\r\n try {\r\n if (hive.auth.wifToPublic(key) == user.memo_key || hive.auth.wifToPublic(key) === user.posting.key_auths[0][0]) {\r\n // Get an encrypted memo only the user can decrypt with their private key\r\n const encryptedMemo = await this.getUserAuthMemo(username, chain);\r\n\r\n // Decrypt the private memo to get the encrypted string\r\n const signedKey = hive.memo.decode(key, encryptedMemo).substring(1);\r\n\r\n // The decrypted memo is an encrypted string, so pass this to the server to get back refresh and access tokens\r\n const token = await this.verifyUserAuthMemo(username, signedKey, chain) as string;\r\n\r\n await firebase.auth().signInWithCustomToken(token);\r\n\r\n resolve({ username, token });\r\n } else {\r\n const toast = new ToastMessage();\r\n\r\n toast.message = this.i18n.tr('errorLogin', {\r\n ns: 'errors'\r\n });\r\n toast.overrideOptions.timeout = DefaultPopupTimeOut;\r\n\r\n this.toast.error(toast);\r\n\r\n resolve(false);\r\n }\r\n } catch (err) {\r\n const toast = new ToastMessage();\r\n\r\n toast.message = this.i18n.tr('errorLogin', {\r\n ns: 'errors'\r\n });\r\n toast.overrideOptions.timeout = DefaultPopupTimeOut;\r\n\r\n this.toast.error(toast);\r\n\r\n resolve(false);\r\n }\r\n } else {\r\n const toast = new ToastMessage();\r\n\r\n toast.message = this.i18n.tr('errorLoading', {\r\n ns: 'errors'\r\n });\r\n toast.overrideOptions.timeout = DefaultPopupTimeOut;\r\n\r\n this.toast.error(toast);\r\n\r\n resolve(false);\r\n }\r\n } catch (e) {\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n\r\n async login(username: string, key?: string, chain?: Chain): Promise {\r\n // eslint-disable-next-line no-async-promise-executor\r\n if (chain === Chain.Steem) {\r\n return this.loginSteem(username, key, chain);\r\n } else if (chain === Chain.Hive) {\r\n return this.loginHive(username, key, chain);\r\n }\r\n }\r\n\r\n async logout() { \r\n dispatchify(logout)();\r\n\r\n let firebaseSteem = firebase.apps.find(x => x.name === firebaseSteemAppName);\r\n firebaseSteem.auth().signOut();\r\n\r\n let firebaseHive = firebase.apps.find(x => x.name === firebaseHiveAppName);\r\n firebaseHive.auth().signOut();\r\n\r\n return true;\r\n }\r\n}\r\n","import { Subscription } from 'rxjs';\r\nimport { lazy, autoinject } from 'aurelia-framework';\r\nimport { HttpClient, json } from 'aurelia-fetch-client';\r\nimport { environment } from 'environment';\r\nimport firebase from 'firebase/app';\r\nimport { ToastMessage, ToastService } from './toast-service';\r\nimport { I18N } from 'aurelia-i18n';\r\nimport { Store } from 'aurelia-store';\r\nimport { loadCoins, loadCoinPairs, loadAccountHistory, checkTransaction } from 'common/hive-engine-api';\r\nimport { filterXSS } from 'xss';\r\nimport { TokenService } from './token-service';\r\nimport moment from 'moment';\r\nimport { hiveSignerJson } from '../common/hive';\r\n\r\nconst http = new HttpClient();\r\n\r\n@autoinject()\r\nexport class HiveEngineService {\r\n public http: HttpClient;\r\n public state: IState;\r\n\r\n public user = {\r\n name: '',\r\n account: {}\r\n };\r\n\r\n public storeSubscription: Subscription;\r\n\r\n constructor(@lazy(HttpClient) getHttpClient: () => HttpClient,\r\n private i18n: I18N,\r\n private store: Store,\r\n private toast: ToastService) {\r\n this.http = getHttpClient();\r\n\r\n this.http.configure(config => {\r\n config\r\n .useStandardConfiguration()\r\n });\r\n \r\n this.storeSubscription = this.store.state.subscribe(state => {\r\n if (state) {\r\n this.state = state;\r\n\r\n this.user = state.account as any; \r\n }\r\n }); \r\n } \r\n\r\n getUser() {\r\n return this.user?.name ?? null;\r\n }\r\n\r\n async getDepositAddress(symbol, userName) {\r\n const pairs = await this.getFormattedCoinPairs(); \r\n const peggedToken = pairs.find(p => p.pegged_token_symbol === symbol);\r\n \r\n if (!peggedToken) {\r\n return;\r\n }\r\n\r\n try {\r\n if (userName == null || userName == '') {\r\n throw new Error('User is unknown');\r\n }\r\n\r\n const request = await this.http.fetch(`${environment.CONVERTER_API_HE}convert/`, {\r\n method: 'POST',\r\n body: json({ from_coin: peggedToken.symbol, to_coin: peggedToken.pegged_token_symbol, destination: userName })\r\n });\r\n\r\n const response = await request.json();\r\n \r\n let result = { name: peggedToken.name, symbol: peggedToken.symbol, pegged_token_symbol: peggedToken.pegged_token_symbol, address: \"\", memo: \"\" };\r\n \r\n if (response.address) {\r\n result.address = response.address;\r\n } else if (response.account) {\r\n result.address = response.account;\r\n result.memo = response.memo;\r\n }\r\n\r\n return result;\r\n } catch (e) {\r\n console.error(e);\r\n return null;\r\n }\r\n }\r\n\r\n async getWithdrawalAddress(symbol, address) {\r\n const pairs = await this.getFormattedCoinPairs();\r\n\r\n const peggedToken = pairs.find(p => p.symbol === symbol);\r\n\r\n if (!peggedToken) {\r\n return;\r\n }\r\n\r\n try {\r\n const request = await this.http.fetch(`${environment.CONVERTER_API_HE}/convert/`, {\r\n method: 'POST',\r\n body: json({ from_coin: peggedToken.pegged_token_symbol, to_coin: symbol, destination: address })\r\n });\r\n\r\n const response = await request.json();\r\n\r\n return { ...response, ...peggedToken };\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n async getFormattedCoinPairs() {\r\n const coins = await loadCoins();\r\n const pairs = await loadCoinPairs();\r\n \r\n let tokenPairs = [];\r\n const nonPeggedCoins = coins.filter(x => x.coin_type !== 'hiveengine');\r\n \r\n const hive = { name: 'HIVE', symbol: 'HIVE', pegged_token_symbol: 'SWAP.HIVE' };\r\n tokenPairs.push(hive);\r\n\r\n for (const x of nonPeggedCoins) {\r\n // find pegged coin for each non-pegged coin\r\n const coinFound = pairs.find(y => y.from_coin_symbol === x.symbol);\r\n \r\n if (coinFound) {\r\n const tp = {\r\n name: x.display_name,\r\n symbol: x.symbol,\r\n pegged_token_symbol: coinFound.to_coin_symbol\r\n }\r\n \r\n // check if the token exists\r\n if (!tokenPairs.find(x => x.symbol == tp.symbol)) {\r\n tokenPairs.push(tp);\r\n }\r\n }\r\n }\r\n\r\n // sort the coins\r\n tokenPairs = tokenPairs.sort((a, b) => a.name.localeCompare(b.name));\r\n\r\n return tokenPairs;\r\n }\r\n\r\n async loadAccountHistoryData(symbol = \"\", limit = 10, offset = 0) {\r\n const userName = this.getUser();\r\n const history = await loadAccountHistory(userName, symbol, null, null, limit, offset);\r\n\r\n if (history) {\r\n for(let h of history) {\r\n h.memo = h.memo ? filterXSS(h.memo) : null;\r\n h.type = (h.to == userName) ? 'received' : 'sent';\r\n\r\n var q = \"\";\r\n if (h.quantity)\r\n q = h.quantity;\r\n else if (h.quantityLocked)\r\n q = h.quantityLocked;\r\n else if (h.quantityTokens)\r\n q = h.quantityTokens;\r\n else if (h.quantityReturned)\r\n q = h.quantityReturned;\r\n else if (h.quantityUnlocked)\r\n q = h.quantityUnlocked;\r\n\r\n h.quantity = q; \r\n h.timestamp_string = moment.unix(h.timestamp).format('YYYY-MM-DD HH:mm:ss');\r\n h.timestamp_month_name = moment.unix(h.timestamp).format('MMMM');\r\n h.timestamp_day = moment.unix(h.timestamp).format('DD');\r\n h.timestamp_year = moment.unix(h.timestamp).format('YYYY');\r\n }\r\n }\r\n\r\n return history;\r\n }\r\n\r\n async sendToken(symbol: string, to: string, quantity: number, memo: string, waitMsg?: string): Promise {\r\n return new Promise((resolve) => {\r\n const username = this.getUser();\r\n\r\n if (!username) {\r\n window.location.reload();\r\n return;\r\n }\r\n\r\n const transaction_data = {\r\n 'contractName': 'tokens',\r\n 'contractAction': 'transfer',\r\n 'contractPayload': {\r\n 'symbol': symbol,\r\n 'to': to,\r\n 'quantity': quantity,\r\n 'memo': memo\r\n }\r\n };\r\n\r\n console.log('SENDING: ' + symbol);\r\n\r\n if (window.hive_keychain) {\r\n window.hive_keychain.requestCustomJson(username, environment.chainId, 'Active', JSON.stringify(transaction_data), 'Token Transfer: ' + symbol, async (response) => {\r\n if (response.success && response.result) {\r\n try {\r\n let toast = new ToastMessage();\r\n\r\n if (waitMsg) {\r\n toast.message = waitMsg;\r\n } else {\r\n toast.message = this.i18n.tr('sendTokensWait', {\r\n ns: 'notifications'\r\n });\r\n }\r\n toast.overrideOptions.timeout = 5000;\r\n\r\n this.toast.success(toast);\r\n\r\n let tx = await checkTransaction(response.result.id, 3); \r\n\r\n toast.message = this.i18n.tr('tokensSent', {\r\n quantity,\r\n symbol,\r\n to,\r\n ns: 'notifications'\r\n });\r\n\r\n this.toast.success(toast);\r\n\r\n resolve(tx);\r\n } catch (e) {\r\n const toast = new ToastMessage();\r\n\r\n toast.message = this.i18n.tr('errorSubmittedTransfer', {\r\n ns: 'errors',\r\n error: e\r\n });\r\n\r\n this.toast.error(toast);\r\n\r\n resolve(false);\r\n }\r\n } else {\r\n resolve(false);\r\n // hide\r\n }\r\n });\r\n } \r\n });\r\n }\r\n}\r\n"],"sourceRoot":""}