UNPKG

wowok

Version:

Wowok Blockchain TypeScript API

1 lines 6.68 kB
import{getFullnodeUrl,WowClient}from'../../client/index.js';import{Transaction}from'../../transactions/index.js';import{isValidWowAddress}from'../../utils/wow-types.js';import{isValidU64,toTxObject}from'../common.js';import{W_ERROR,WErrors}from'../exception.js';import a147a from'lodash';import{Account}from'../local/account.js';import{LocalMark}from'../local/local.js';import{query_objects,queryTableItem_PermissionPerm,queryTableItem_EntityRegistrar,raw2type}from'../query/object.js';import{destroy,freeze,get_guardSubmissions,guardAdd,newPassport,verify}from'./passport.js';import{addObjectTags,TagName,create as a147b}from'./resource.js';import{register_with_resource_forced}from'./entity.js';import{getCallEnvAccount,resolveCallEnv}from'./util.js';import{Config}from'../local/config.js';export function isCallResultSubmission(a){return a?.['submission']&&a?.['submission']?.['length']>0x0;}export function ResponseData(a){if(a?.['digest']){const b=[];return a?.['objectChanges']?.['forEach'](c=>{const d=c?.['objectType'],e=raw2type(d);e&&b['push']({'type':e,'type_raw':d,'object':c?.['objectId'],'version':c?.['version'],'owner':c?.['owner'],'change':c['type']});}),b;}return[];}export class CallBase{['newResource'];['traceMarkNew']=new Map();['content']=undefined;['env_ready']=![];async['operate'](a,b,c,d){}async['prepare'](a){await this['env_prepare'](a);}async['call'](a){return undefined;}async['env_prepare'](a){if(this['env_ready'])return;await resolveCallEnv(a),this['env_ready']=!![];}async['call_with_submission'](a,b,c){return b['guard']['length']>0x0&&(await this['prepare'](a),await this['check_passport'](a,b,c)),undefined;}async['check_guard_and_call'](a,b){a['permission_guard']?.['forEach'](c=>{!isValidWowAddress(c)&&W_ERROR(WErrors['IsValidAddress'],'env\x20permission_guard:\x20'+c),b['push'](c);});if(b['length']>0x0){const c=await get_guardSubmissions(a,b);if(c['submission']['length']>0x0)return{'type':'submission','guard':c['guard'],'submission':c['submission']};return await this['check_passport'](a,c);}else return await this['exec'](a);}async['check_permission_and_call'](a,b,c,d,e,f){let g=![];const h=await query_objects({'objects':[b],'no_cache':a['no_cache'],'network':a['network']});(!h['objects']?.[0x0]||h['objects']?.[0x0]['type']!=='Permission')&&W_ERROR(WErrors['NoPermission'],'permission\x20object\x20not\x20found');const i=h['objects']?.[0x0],j=await getCallEnvAccount(a);g=i['admin']['includes'](j);if(e&&i['builder']!==j)W_ERROR(WErrors['NoPermission'],j+'\x20owner\x20permission\x20required');if(f&&!g)W_ERROR(WErrors['NoPermission'],j+'\x20admin\x20permission\x20required');a['permission_guard']?.['forEach'](k=>{!isValidWowAddress(k)&&W_ERROR(WErrors['IsValidAddress'],'env\x20permission_guard\x20'+k),d['push'](k);});if(c['length']>0x0&&!g){const k=[j,...a['permission_guard']??[]],l=k['map'](async q=>{const r=await queryTableItem_PermissionPerm({'parent':b,'address':q,'no_cache':a['no_cache'],'network':a['network']});if(r&&r['type']==='TableItem_PermissionPerm'){const s=r;return{'address':q,'permissions':s['perm']};}return{'address':q,'permissions':[]};}),m=await Promise['all'](l),n=new Set();m['forEach'](q=>{q['permissions']['forEach'](r=>n['add'](r));});const o=c['filter'](q=>!n['has'](q));o['length']>0x0&&W_ERROR(WErrors['NoPermission'],'Missing\x20permissions\x20'+o['join'](',\x20')+'\x20in\x20'+b);}if(d['length']>0x0){const q=await get_guardSubmissions(a,d);if(q['submission']['length']>0x0)return{'type':'submission','guard':q['guard'],'submission':q['submission']};return await this['check_passport'](a,q);}else return await this['exec'](a);}async['check_passport'](a,b,c){const d=new Transaction(),e=newPassport(d);for(const f of b['guard']){await guardAdd(d,e,f['object'],b['submission']['find'](g=>g['guard']===f['object'])?.['submission']??[],f['impack']);}return verify(d,e),await this['operate'](a,d,e,b['submission']),c?freeze(d,e):destroy(d,e),await this['sign_and_commit'](a,d);}async['exec'](a){const b=new Transaction();return await this['operate'](a,b),await this['sign_and_commit'](a,b);}async['new_with_mark'](a,b,c,d,f,g=[TagName['Launch']]){const h=f?.['tags']?a147a['uniq']([...f['tags'],...g]):a147a['uniq']([...g]);f&&(f['tags']=h,this['traceMarkNew']['set'](c,f));if(!f?.['onChain'])return;if(!this['newResource']){let i;try{i=await queryTableItem_EntityRegistrar({'address':await getCallEnvAccount(a),'no_cache':a['no_cache'],'network':a['network']});}catch(j){}i&&i['type']!=='TableItem_EntityRegistrar'&&W_ERROR(WErrors['NoPermission'],'no\x20entity\x20registrar\x20found');if(i?.['mark_object']){addObjectTags(b,i['mark_object'],{'address':d,'tags':h});return;}else this['newResource']=register_with_resource_forced(b,typeof a['referrer']==='string'?a['referrer']:null);}this['newResource']&&addObjectTags(b,this['newResource'],{'address':d,'tags':h});}async['update_content'](a,b,c){if(this['content']||!c)return;const d=await query_objects({'objects':[c],'no_cache':a['no_cache'],'network':a['network']});(!d['objects']||d?.['objects']?.['length']!==0x1||d?.['objects'][0x0]?.['type']!==b)&&W_ERROR(WErrors['Fail'],'Fetch\x20'+b+'\x20object\x20'+c+'\x20failed'),this['content']=d?.['objects'][0x0];}async['sign_and_commit'](a,b){this['newResource']&&(a147b(b,this['newResource']),this['newResource']=undefined);let c=await Account['Instance']()['sign_and_commit'](b,await getCallEnvAccount(a),a['network']);!c&&W_ERROR(WErrors['Fail'],'sign\x20and\x20commit\x20failed');if(c?.['digest']&&!c?.['objectChanges']){const e=new WowClient({'url':getFullnodeUrl(await Config['Instance']()['network_get'](a['network']))});c=await e['getTransactionBlock']({'digest':c?.['digest'],'options':{'showObjectChanges':!![]}});}const d=ResponseData(c);for(let f=0x0;f<d['length'];++f){const g=d[f];if(g['type']&&g['change']==='created'){const h=this['traceMarkNew']['get'](g['type']);h&&await LocalMark['Instance']()['put']([{'name':h['name']?{'value':h['name'],'replaceExistName':h['replaceExistName']}:undefined,'address':g['object'],'tags':h?.['tags']?[...h['tags'],g['type']]:[g['type']]}]);}}return c;}}export async function getCoinParam(a,b,c,d){let e;if('balance'in c&&c['balance']!=null)!isValidU64(c['balance'])&&W_ERROR(WErrors['IsValidU64'],'Total\x20pay\x20balance\x20'+c['balance']+'\x20is\x20not\x20valid'),e=await Account['Instance']()['get_coin_object'](b,c['balance'],d,await getCallEnvAccount(a),a['network']);else'coin'in c&&c['coin']!=null&&(typeof c['coin']==='string'?e=await LocalMark['Instance']()['get_address'](c['coin']):e=c['coin']);return!e&&W_ERROR(WErrors['InvalidParam'],'Total\x20pay\x20'+JSON['stringify'](c)+'\x20is\x20allocated\x20failed'),toTxObject(b,e);}