UNPKG

wowok

Version:

Wowok Blockchain TypeScript API

1 lines 2.64 kB
import{WowClient}from'../../client/index.js';import{getFullnodeUrl}from'../../client/network.js';import{GasTokenType}from'../common.js';import{Config}from'./config.js';import{Cache,CachePrefix}from'./cache.js';import{W_ERROR,WErrors}from'../exception.js';export class TokenInfo{static ['_instance'];static['Instance'](){return!TokenInfo['_instance']&&(TokenInfo['_instance']=new TokenInfo()),TokenInfo['_instance'];}['cacheKey']=[CachePrefix['token']];async['fetch_imp'](a,b,c){const d=new WowClient({'url':getFullnodeUrl(a)}),e=await d['getCoinMetadata']({'coinType':b});if(e)return{'alias':c,'type':b,...e};return undefined;}async['fetch'](a,b,c){a=a??GasTokenType;const d=await Config['Instance']()['network_get'](c),e=await Cache['read']([...this['cacheKey'],d],async g=>{return{'expire':'INFINITE','data':[]};});let f=e?.['data']?.['find'](g=>g['type']===a);if(!f){f=await this['fetch_imp'](d,a,b);if(!f)return W_ERROR(WErrors['TokenNotFoundLocally'],'token\x20type:\x20'+a),undefined;const g=[...e?.['data']||[],f];await Cache['read']([...this['cacheKey'],d],async h=>({'expire':'INFINITE','data':g}),!![]);}else{if(b&&f['alias']!==b){f['alias']=b;const h=e?.['data']?.['map'](i=>i['type']===a?f:i)||[];await Cache['read']([...this['cacheKey'],d],async i=>({'expire':'INFINITE','data':h}),!![]);}}return f;}async['list'](a,b){const c=await Config['Instance']()['network_get'](b);let d=await Cache['read']([...this['cacheKey'],c],async i=>{return{'expire':'INFINITE','data':[]};}),e=d?.['data']||[];const f=a?.['type']??GasTokenType,g=a?.['type']?a?.['alias_or_name']:undefined,h=e['find'](i=>i['type']===f);if(!h){const i=await this['fetch_imp'](c,f,g);if(i){const j=[...e,i];await Cache['read']([...this['cacheKey'],c],async k=>({'expire':'INFINITE','data':j}),!![]),d=await Cache['read']([...this['cacheKey'],c],async k=>({'expire':'INFINITE','data':j})),e=d?.['data']||[];}}if(a){e=e['filter'](k=>{let l=!![];return a['symbol']&&l&&(l=k['symbol']===a['symbol']),a['type']&&l&&(l=k['type']===f),l;});if(a['alias_or_name']){const k=a['alias_or_name']['toLowerCase']();e=e['map'](l=>{let m=0x0;const n=l['alias']?.['toLowerCase']()||'',o=l['name']?.['toLowerCase']()||'';if(n===k||o===k)m=0x3;else{if(n['startsWith'](k)||o['startsWith'](k))m=0x2;else(n['includes'](k)||o['includes'](k))&&(m=0x1);}return{...l,'_score':m};}),e=e['filter'](l=>l['_score']>0x0)['sort']((l,m)=>{const n=m['_score']-l['_score'];if(n!==0x0)return n;const o=(l['alias']?.['length']||0x0)+(l['name']?.['length']||0x0),p=(m['alias']?.['length']||0x0)+(m['name']?.['length']||0x0);return o-p;}),e=e['map'](l=>{const {_score:m,...n}=l;return n;});}}return e;}}