flexbiz-server
Version:
Flexible Server
16 lines (15 loc) • 6.3 kB
JavaScript
'use strict';const async=require("async"),{ec}=require("elliptic-nodejs"),EC=new ec("secp256k1"),asskeySchema=new Schema({id_app:String,name:String,username:{type:String,required:!0,maxlength:1024,trim:!0},address:{type:String,required:!0,maxlength:2024,trim:!0},mnemonic:String,private_key:String,privateKey:String,note:String,wallet_type:{type:Number,default:9},asset:{type:String,uppercase:!0,trim:!0},balances:Schema.Types.Mixed,exfields:Schema.Types.Mixed,status:{type:Boolean,default:!0},date_created:{type:Date,
default:Date.now},date_updated:{type:Date,default:Date.now},user_created:{type:String,default:""},user_updated:{type:String,default:""}}),model=mongoose.models.asskey||mongoose.model("asskey",asskeySchema);
(global.configs||{}).createIndexes&&(asskeySchema.index({id_app:1}),asskeySchema.index({username:1,address:1}),asskeySchema.index({note:1}),asskeySchema.index({name:1}),asskeySchema.index({id_app:1,address:1},{unique:!0}),asskeySchema.index({status:1}),asskeySchema.index({user_created:1}),asskeySchema.index({username:"text",address:"text",note:"text",name:"text"},{name:"asskey_index"}),model.on("index",async function($err$$){$err$$?console.error("asskey index error",$err$$):console.info("asskey indexing complete")}));
model.getCoinBalance=async($condition$$={},$options$$={})=>{if(!$condition$$.id_app)throw"H\u00e0m n\u00e0y y\u00eau c\u1ea7u \u0111i\u1ec1u ki\u1ec7n ch\u1ee9a id_app";const {bankBalancesGet:$bankBalancesGet$$}=require("../libs/blockchainconnect");let $items$$=await model.find($condition$$).lean();await new Promise(($rs$$,$rj$$)=>{async.mapSeries($items$$,($item$$,$cb$$)=>{setImmediate(async()=>{try{let $bls$$=await $bankBalancesGet$$($condition$$.id_app,$item$$.address);$options$$.denom&&($bls$$=
$bls$$.filter($b$$=>$b$$.denom==$options$$.denom));let $needtobuys$$=await global.getModel("assneedtobuy").find({creator:$item$$.address,id_app:$item$$.id_app,trang_thai:"0"}).lean();$needtobuys$$=$needtobuys$$.filter($s$$=>0<$s$$.so_luong_con_lai&&"0"==$s$$.trang_thai).map($s$$=>({denom:$s$$.denom,amount:$s$$.so_luong_con_lai*$s$$.gia_mua}));$bls$$=[...$bls$$,...$needtobuys$$];$bls$$.forEach($r$$=>{$r$$.amount=Number($r$$.amount);$r$$.price=$r$$.price||1;$r$$.value=$r$$.price*$r$$.amount;delete $r$$.key});
$item$$.balances=$bls$$;$cb$$()}catch($e$$){$cb$$($e$$)}})},$e$$=>{if($e$$)return $rj$$($e$$);$rs$$()})});return $items$$.map($item$$=>($item$$.balances||[]).map($bl$$=>$bl$$.value||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0)).reduce(($a$$,$b$$)=>$a$$+$b$$,0)};
model.getInvestBalance=async($condition$$={})=>{if(!$condition$$.id_app)throw"H\u00e0m n\u00e0y y\u00eau c\u1ea7u \u0111i\u1ec1u ki\u1ec7n ch\u1ee9a id_app";const {bankBalancesGet:$bankBalancesGet$$}=require("../libs/blockchainconnect");let $items$$=await model.find($condition$$).lean();await new Promise(($rs$$,$rj$$)=>{async.mapSeries($items$$,($item$$,$cb$$)=>{setImmediate(async()=>{try{let $bls$$=(await $bankBalancesGet$$($condition$$.id_app,$item$$.address)).filter($b$$=>$b$$.denom!==configs.MAIN_DENOM),
$sellings$$=await global.getModel("asssell").find({creator:$item$$.address,id_app:$item$$.id_app,trang_thai:"0"}).lean();$sellings$$=$sellings$$.filter($s$$=>0<$s$$.con_lai&&"0"==$s$$.trang_thai).map($s$$=>({denom:$s$$.token,amount:$s$$.con_lai}));$bls$$=[...$bls$$,...$sellings$$];await $bls$$.asyncJoinModel2($condition$$.id_app,global.getModel("assinvestment"),{where:{denom:"token"},fields:[{price:"gia",id_investment:"id"}]});$bls$$=$bls$$.filter($b$$=>$b$$.id_investment);$bls$$.forEach($r$$=>{$r$$.amount=
Number($r$$.amount);$r$$.price=$r$$.price||1;$r$$.value=$r$$.price*$r$$.amount;delete $r$$.key});$item$$.balances=$bls$$;$cb$$()}catch($e$$){$cb$$($e$$)}})},$e$$=>{if($e$$)return $rj$$($e$$);$rs$$()})});return $items$$.map($item$$=>($item$$.balances||[]).map($bl$$=>$bl$$.value||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0)).reduce(($a$$,$b$$)=>$a$$+$b$$,0)};const toHexString=$byteArray$$=>Array.from($byteArray$$,$byte$$=>("0"+($byte$$&255).toString(16)).slice(-2)).join("");
model.createWallet=async($id_app$$,$username$$,$name$$="",$wallet_type$$=9,$save$$=!0)=>new Promise(($resolve$$,$reject$$)=>{try{let $privateKey$$=EC.genKeyPair().getPrivate().toString(8),$address$$=model.getPublicKeyFromPrivateKey($privateKey$$);if($save$$){let $wallet$$=new model({username:$username$$,user_created:$username$$,privateKey:$privateKey$$,address:$address$$,id_app:$id_app$$,wallet_type:$wallet_type$$,name:$name$$||$username$$});$wallet$$.save($e$$=>{if($e$$)return $reject$$(Error($e$$.message));
$resolve$$($wallet$$)})}else $resolve$$({privateKey:$privateKey$$,address:$address$$})}catch($e$$){console.error($e$$),$reject$$(Error($e$$.message))}});model.getPrivateKey=async($id_app$$,$address$$)=>new Promise(($resolve$$,$reject$$)=>{model.findOne({id_app:$id_app$$,address:$address$$}).lean().exec(async($e$$,$rs$$)=>{if($e$$)return $reject$$(Error($e$$.message));if($rs$$)return $resolve$$($rs$$.privateKey);$reject$$(Error("Not found wallet"))})});
model.getPublicKeyFromPrivateKey=$key$jscomp$8_privateKey$$=>{$key$jscomp$8_privateKey$$=EC.keyFromPrivate($key$jscomp$8_privateKey$$,"hex");return`${global.configs.ADDRESS_PREFIX||""}${$key$jscomp$8_privateKey$$.getPublic().encode("hex")}`};
model.getUsername=async($id_app$$,$address$$)=>new Promise(($resolve$$,$reject$$)=>{model.findOne({id_app:$id_app$$,address:$address$$}).lean().exec(async($e$$,$rs$$)=>$e$$||!$rs$$?$reject$$(Error($e$$?$e$$.message:"\u0110\u1ecba ch\u1ec9 v\u00ed n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i")):$resolve$$($rs$$.username))});
model.sign=async($id_app$$,$address$$,$dataToSign$$)=>{try{let $privateKey$$=await model.getPrivateKey($id_app$$,$address$$),$key$$=EC.keyFromPrivate($privateKey$$,"hex"),$msgHash$$=[JSON.stringify($dataToSign$$)];return toHexString($key$$.sign($msgHash$$).toDER())}catch($e$$){throw Error(`Can't sign data. Error: ${$e$$.message}`);}};
model.verifySignature=async($address$jscomp$4_key$$,$data_msgHash$$,$signature$$)=>{configs.ADDRESS_PREFIX&&($address$jscomp$4_key$$=$address$jscomp$4_key$$.split(configs.ADDRESS_PREFIX).join(""));$address$jscomp$4_key$$=EC.keyFromPublic($address$jscomp$4_key$$,"hex");$data_msgHash$$=[JSON.stringify($data_msgHash$$)];return $address$jscomp$4_key$$.verify($data_msgHash$$,$signature$$)};module.exports=model;