newpay-wallet-js
Version:
407 lines (370 loc) • 17.3 kB
JavaScript
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