UNPKG

newpay-wallet-js

Version:

407 lines (370 loc) 17.3 kB
import {Apis} from "bitsharesjs-ws"; import {ChainStore, key} from "bitsharesjs/es"; import Utils from "./lib/common/utils.js"; import Immutable from "immutable"; import iDB from './idb-instance.js'; import WalletManagerStore from './WalletManagerStore.js'; import AccountStore from './AccountStore.js'; import WalletDb from "./WalletDb.js"; // -------for test------- //Apis.instance("wss://bitshares.openledger.info/ws", true).init_promise.then((res) => { /* Apis.instance("wss://bit.btsabc.org/ws", true).init_promise.then((res) => { console.log("connected to:", res[0].network); ChainStore.init().then(() => { //ChainStore.subscribe(updateState); //ChainStore.subscribe(getObject); // ChainStore.subscribe(getBitcrabAccount); // ChainStore.subscribe(listAccountBalances); ChainStore.subscribe(listAccountHistory); }) });*/ //-----------------for test--------- class QueryChainStore{ constructor() { this.state = this._getInitialState() } _getInitialState() { return { new_wallet: undefined,// pending restore current_wallet: undefined, wallet_names: Immutable.Set() } } static getInstance() { if (!QueryChainStore.instance) { QueryChainStore.instance = new QueryChainStore(); } return QueryChainStore.instance; } listAccountBalances_old(name){ var bal =[]; //name = "dylan-1234567"; return Apis.instance().db_api().exec( "get_named_account_balances", [name,[]], ).then( (balance_objects) => { var balanceJson = balance_objects; return balanceJson; }).then(balance_objects=>{ //console.log("balanceJson2:",balance_object); balance_objects.map((balance_object)=>{ //console.log("balance_object:",balance_object) bal.push( Apis.instance().db_api().exec("get_objects", [[balance_object.asset_id]]).then((asset)=>{ let amount = Number(balance_object.amount); amount = Utils.get_asset_amount(amount,asset[0]); let result = Object.assign({},balance_object,{"amount":amount,"precision":asset[0].precision,"symbol":asset[0].symbol}); return result; }) ) //var asset = ChainStore.getAsset(balance_object.asset_id); //let amount = Number(balance_object.amount); //amount = Utils.get_asset_amount(amount,asset); //return Object.assign({},balance_object,{"amount":amount,"precision":asset.toJS().precision,"symbol":asset.toJS().symbol}) }) return Promise.all(bal); }) } listAccountBalances(name){ var bal =[]; //name = "dylan-1234567"; return Apis.instance().db_api().exec( "get_named_account_balances", [name,[]], ).then( (balance_objects) => { var balanceJson = balance_objects; return balanceJson; }).then(balance_objects=>{ //console.log("balanceJson2:",balance_object); balance_objects.map((balance_object)=>{ //console.log("balance_object:",balance_object) bal.push( Apis.instance().db_api().exec("get_objects", [[balance_object.asset_id]]).then((asset)=>{ let str_symbol = asset[0].symbol; if(asset[0].bitasset_data_id){ let excludeList = ["BTWTY", "BANCOR", "BTCSHA", "CROWDFUN", "DRAGON", "TESTME"]; if(excludeList.indexOf(asset[0].symbol) === -1){ str_symbol = "bit"+str_symbol } } let amount = Number(balance_object.amount); amount = Utils.get_asset_amount(amount,asset[0]); let result = Object.assign({},balance_object,{"amount":amount,"precision":asset[0].precision,"symbol":str_symbol}); return result; }) ) //var asset = ChainStore.getAsset(balance_object.asset_id); //let amount = Number(balance_object.amount); //amount = Utils.get_asset_amount(amount,asset); //return Object.assign({},balance_object,{"amount":amount,"precision":asset.toJS().precision,"symbol":asset.toJS().symbol}) }) return Promise.all(bal); }) } /** * 获取所有历史记录 * 0 代表转账记录,4:订单撮合,1:限价单,5:创建账户 */ listAccountHistory(name){ //name = "dylan-1234567"; //name = "1.2.446822" let trans_type = 0 var accountInfo= ChainStore.getAccount(name); //console.log("accountInfo:"+ JSON.stringify(accountInfo)) if(accountInfo){ ChainStore.fetchRecentHistory(accountInfo).then((history_objects)=>{ //console.log("history_objects:",JSON.stringify(history_objects)); return JSON.stringify(history_objects); }) }else{ console.log("accountInfo null"); } } //默认为0 , 0 代表转账记录,4:订单撮合,1:限价单,5:创建账户 listAccountHistory2(name, trans_type =0){ //name = "dylan-1234567"; var accountInfo= ChainStore.getAccount(name); //console.log("accountInfo:"+ JSON.stringify(accountInfo)) if(accountInfo){ let accountInfoJson = accountInfo.toJS(); var historys = accountInfoJson.history; // console.log("history:",historys); if( historys ){ var historyJson if(trans_type==100){ historyJson = JSON.stringify(historys); }else if(trans_type=="0"){ var historyArr =[]; historys.map((history)=>{ if(history.op[0]==trans_type){ historyArr.push(history.op); } }) historyJson = JSON.stringify(historyArr); } console.log("historyJson:",historyJson); return historyJson; } } } lookupAccounts(name, limit){ return Apis.instance().db_api().exec("lookup_accounts", [ name, limit ]); } getDatabaseName(current_wallet = "default"){ let chain_id = Apis.instance().chain_id; return [ "graphene_v2", chain_id ? chain_id.substring(0, 6) : "", current_wallet ].join("_"); } getRootDatabaseName(){ let chain_id = Apis.instance().chain_id; let chain_substring = chain_id ? chain_id.substring(0, 6) : ""; return "graphene_db" + "_"+ chain_substring } deleteDatabase(databaseName){ var req = iDB.impl.deleteDatabase(databaseName); return req; } importBrainkey22(wallet_name, waleet_pw, brainkey_plaintext){ } importBrainkey(wallet_name, waleet_pw, brainkey_plaintext, callbackFun){ let private_key = key.get_brainPrivateKey( brainkey_plaintext); let pubkey = private_key.toPublicKey().toPublicKeyString(); return Apis.instance().db_api().exec("get_key_references", [[pubkey]]).then((res)=>{ if(!res || !res.length){ return Promise.reject("账号不存在!"); } let new_curAccountID = res[0][0]; return Apis.instance().db_api().exec("get_accounts", [[new_curAccountID]]).then((acc_result)=>{ let new_curAccountName = acc_result[0].name; let key = "account"; let curAccount = localStorage.getItem(key); // let pro = new Promise((resolve, reject) =>{ // let databaseName = this.getDatabaseName(); // iDB.impl.deleteDatabase(databaseName); // localStorage.removeItem(key); // iDB.close(); // return iDB.init_instance().init_promise.then(()=>{ // let setRoot1 = iDB.root.setProperty("wallet_names", []); // let setRoot2 = iDB.root.setProperty("current_wallet", ""); // let setRoot3 = iDB.root.setProperty("AddressIndex", null); // return Promise.all([ setRoot1, setRoot2, setRoot3 ]).then(()=>{ // return WalletManagerStore.init().then(()=>{ // return WalletManagerStore.onSetWallet(wallet_name, waleet_pw, brainkey_plaintext).then(()=>{ // let owner_private = WalletDb.generateNextKey(); // let active_private = WalletDb.generateNextKey(); // let transaction = WalletDb.transaction_update_keys(); // let p = WalletDb.saveKeys( // [ owner_private, active_private], // //[ owner_private, active_private, memo_private ], // transaction // ); // return p.catch( (error) => { // WalletDb.decrementBrainKeySequence(); // WalletDb.decrementBrainKeySequence(); // transaction.abort(); // reject(); // }).then(()=>{ // AccountStore.onCreateAccount(new_curAccountName); // resolve(); // }); // }) // }) // }) // }) // }) if(callbackFun){ return callbackFun(new_curAccountName).then((res)=>{ if(res.flag === 0){ console.log("callbackFun success"); return this._doImportBrainkey(wallet_name, waleet_pw, brainkey_plaintext, new_curAccountName); }else{ console.log("callbackFun fail"); return Promise.reject(res.value); } }).catch((call_err)=>{ return Promise.reject(call_err); }) }else{ console.log("NO callbackFun success"); return this._doImportBrainkey(wallet_name, waleet_pw, brainkey_plaintext, new_curAccountName); } }) }).catch((err)=>{ return Promise.reject(err); }) } _doImportBrainkey(wallet_name, waleet_pw, brainkey_plaintext, new_curAccountName){ return new Promise((resolve, reject) =>{ let databaseName = this.getDatabaseName(); iDB.impl.deleteDatabase(databaseName); let key = "__graphene__"+AccountStore._getCurrentAccountKey(); localStorage.removeItem(key); iDB.close(); return iDB.init_instance().init_promise.then(()=>{ let setRoot1 = iDB.root.setProperty("wallet_names", []); let setRoot2 = iDB.root.setProperty("current_wallet", ""); let setRoot3 = iDB.root.setProperty("AddressIndex", null); return Promise.all([ setRoot1, setRoot2, setRoot3 ]).then(()=>{ return WalletManagerStore.init().then(()=>{ return WalletManagerStore.onSetWallet(wallet_name, waleet_pw, brainkey_plaintext).then(()=>{ let owner_private = WalletDb.generateNextKey(); let active_private = WalletDb.generateNextKey(); let transaction = WalletDb.transaction_update_keys(); let p = WalletDb.saveKeys( [ owner_private, active_private], //[ owner_private, active_private, memo_private ], transaction ); return p.catch( (error) => { WalletDb.decrementBrainKeySequence(); WalletDb.decrementBrainKeySequence(); transaction.abort(); reject(); }).then(()=>{ AccountStore.onCreateAccount(new_curAccountName); resolve(); }); }) }) }) }) }) } //查询交易列表 getTransferList(name, start, limit = 5){ if(start == "" || start == null){ start = "1.11.0" }else{ let start_index = start.lastIndexOf(".")+1; var start_num = parseInt(start.slice(start_index)) - 1; start = "1.11."+start_num; } return Apis.instance().db_api().exec("get_account_by_name", [name]).then((res_account)=>{ return Apis.instance().history_api().exec("get_account_history", [res_account.id, "1.11.0", 5, start]).then((res)=>{ return Promise.all(res.map(this.getTransferListResult)).then((res_obj)=>{ return res_obj.filter(function(item){ return item !== null; }) }) }); }) } getTransferListResult(res){ if (res.op[0] != 0) { return null } let result = {}; let history_id = res.id; let form_id = res.op[1].from; let to_id = res.op[1].to; let amount_asset_id = res.op[1].amount.asset_id; let amount = res.op[1].amount.amount; let block_num = res.block_num; let trx_in_block = res.trx_in_block; return new Promise((resolve, reject)=>{ Apis.instance().db_api().exec("get_objects", [[form_id, to_id, amount_asset_id], true]).then((r)=>{ result["history_id"] = history_id; result["from_name"] = r[0].name; result["from_id"] = form_id; result["to_name"] = r[1].name; result["to_id"] = to_id; result["amount_id"] = amount_asset_id; result["amount_name"] = r[2].symbol; result["amount_precision"] = r[2].precision; result["amount"] = amount; result["real_amount"] = amount / Math.pow(10,r[2].precision) result["block_num"] = block_num; result["trx_in_block"] = trx_in_block; resolve(result); }) }) } is_account_name_error(value, allow_too_short=null){ var i, label, len, length, ref, suffix; if (allow_too_short == null) { allow_too_short = false; } suffix = "账户名称"; if (this.is_empty(value)) { return suffix + "不能为空."; } length = value.length; if (!allow_too_short && length < 3) { return suffix + "长度要大于3."; } if (length > 63) { return suffix + "长度要小于63."; } if (/\./.test(value)) { suffix = "账户名称应该"; } ref = value.split('.'); for (i = 0, len = ref.length; i < len; i++) { label = ref[i]; if (!/^[~a-z]/.test(label)) { return suffix + "以字母开头."; } if (!/^[~a-z0-9-]*$/.test(label)) { return suffix + "只有字母、数字或破折号."; } if (/--/.test(label)) { return suffix + "只有一个破折号."; } if (!/[a-z0-9]$/.test(label)) { return suffix + "以字母或数字结尾."; } if (!(label.length >= 3)) { return suffix + "长度大于3"; } } return null; } is_empty(value) { return value == null || value.length === 0; } is_cheap_name(account_name) { return (/[0-9-]/.test(account_name) || !/[aeiouy]/.test(account_name) ); } } var QueryChainStoreWrapped = QueryChainStore.getInstance(); export default QueryChainStoreWrapped