UNPKG

wowok_agent

Version:

Create, collaborate, and transact on your own terms with the AI-driven web3 collaboration protocol.

755 lines (703 loc) 32.1 kB
/** * Provide a query interface for AI * */ import { Protocol, Machine_Node, Machine, Treasury_WithdrawMode, Treasury_Operation, Repository_Type, Repository_Policy_Mode, Repository_Policy, Service_Discount_Type, Service_Sale, Progress, History, ERROR, Errors, IsValidAddress, Bcs, Entity_Info, Tags, uint2address} from 'wowok'; import {WowokCache, OBJECT_KEY, CacheExpire, CacheName, CachedData} from './cache' export type ObjectBaseType = 'Demand' | 'Progress' | 'Service' | 'Machine' | 'Order' | 'Treasury' | 'Arbitration' | 'Arb' | 'Payment' | 'Guard' | 'Discount' | 'Personal' | 'Permission' | 'PersonalMark' | 'Repository' | 'TableItem_ProgressHistory' | 'TableItem_PermissionEntity' | 'TableItem_DemandPresenter' | 'TableItem_MachineNode' | 'TableItem_ServiceSale' | 'TableItem_TreasuryHistory' | 'TableItem_ArbVote' | 'TableItem_RepositoryData' | 'TableItem_PersonalMark'; export interface ObjectBase { object: string; type?: ObjectBaseType; type_raw?: string; owner?: any; version?: string; cache_expire?: CacheExpire; } export interface ObjectPermission extends ObjectBase { builder: string; admin: string[]; description: string; entity_count: number; biz_permission: {id:number; name:string}[]; } export interface TableItem_PermissionEntity extends ObjectBase { entity: string; permission: {id:number; guard?:string|null}[]; } export interface ObjectDemand extends ObjectBase { permission: string; guard?: {object:string; service_id_in_guard?:number|null} | null; description: string; time_expire: string; yes?: string | null; presenter_count: number; bounty: {object:string; balance:string; type:string}[]; } export interface TableItem_DemandPresenter extends ObjectBase { service: string; presenter: string; recommendation: string; } export interface ObjectMachine extends ObjectBase { permission: string; bPaused: boolean; bPublished: boolean; consensus_repository: string[]; description: string; endpoint?: string | null; node_count: number; } export interface TableItem_MachineNode extends ObjectBase { node: Machine_Node; } export interface ObjectProgressHolder { forward_name: string; holder?: string | null; orders: string[]; msg: string; accomplished: boolean; time: string; } export interface ObjectProgressSession { forward: ObjectProgressHolder[]; weights: number; threshold: number; next_node: string; } export interface ObjectProgress extends ObjectBase { machine: string; current: string; context_repository?: string | null; parent?: string | null; task?: string | null; session: ObjectProgressSession[]; history_count: number; namedOperator: {name:string, operator:string[]}[]; } export interface TableItem_ProgressHistory extends ObjectBase { history: History; } export interface ObjectService extends ObjectBase { permission: string; bPaused: boolean; bPublished: boolean; description: string; arbitration: string[]; buy_guard?: string | null; endpoint?: string | null; extern_withdraw_treasury: string[]; machine?: string | null; payee: string; repository: string[]; sales_count: number; withdraw_guard: {guard:string, percent:number}[]; refund_guard: {guard:string, percent:number}[]; customer_required_info?: {pubkey:string; required_info:string[]}; } export interface TableItem_ServiceSale extends ObjectBase { item: Service_Sale; } export interface ObjectOrder extends ObjectBase { service: string; amount: string; balance: string; payer: string; arb: string[]; agent: string[]; progress?: string | null; discount?: string | null; required_info?: {pubkey:string; msg_encrypted:string}; item: Service_Sale[]; } export interface ObjectTreasury extends ObjectBase { permission: string; description: string; inflow: string; outflow: string; withdraw_mode: Treasury_WithdrawMode; withdraw_guard: {guard:string, percent:number}[]; deposit_guard?: string | null; balance: string; history_count: number; } export interface TableItem_TreasuryHistory extends ObjectBase { id: number, operation: Treasury_Operation, signer: string, payment: string, amount: string, time: string, } export interface ObjectArbitration extends ObjectBase { permission: string; description: string; bPaused: boolean; endpoint?: string | null; fee: string; fee_treasury: string; usage_guard?: string | null; voting_guard: {guard:string, weights:number}[]; } export interface ObjectArb extends ObjectBase { arbitration: string; order: string; description: string; bWithdrawn: boolean; fee: string; feedback: string; indemnity?: string | null; proposition: {proposition:string, votes:string}; voted_count: number; } export interface TableItem_ArbVote extends ObjectBase { singer: string; vote: number[]; weight: string; time: string; } export interface ObjectRepository extends ObjectBase { permission: string; description: string; policy_mode: Repository_Policy_Mode; rep_type: Repository_Type; reference: string[]; policy: Repository_Policy[]; data_count: number; } export interface TableItem_RepositoryData extends ObjectBase { address: string; key: string; data: Uint8Array; } export interface ObjectPayment extends ObjectBase { amount: string; for_guard?: string | null; for_object?: string | null; from ?: string | null; biz_id: string; remark: string; signer: string; time: string; record: {recipient:string; amount:string}[]; } export interface ObjectDiscount extends ObjectBase { service: string; name: string; off_type: Service_Discount_Type; price_greater?: string | null; off: string; time_start: string; time_end: string; } export interface ObjectGuard extends ObjectBase { description: string; input: Uint8Array; identifier: {id:number; bWitness:boolean; value:Uint8Array}[]; } export interface ObjectPersonal extends ObjectBase { address: string; like: number; dislike: number; info: Entity_Info; mark_object?: string | null; // ObjectMark & TableItem_MarkTag lastActive_digest?: string; } export interface ObjectMark extends ObjectBase { tag_count: number; } export interface TableItem_PersonalMark extends ObjectBase, Tags { } export enum CacheType { localStorage = 'localStorage', // for explorer memoryStorage = 'memoryStorage', // for console } export interface ObjectsQuery { objects: string[]; showType?: boolean; showContent?: boolean; showOwner?: boolean; no_cache?: boolean; } export interface PersonalQuery { address: string; no_cache?: boolean; } export interface ObjectsAnswer { objects?: ObjectBase[]; error?: string; } export interface TableQuery { parent: string; cursor?: string | null | undefined; limit?: number | null | undefined; } export interface TableAnswerItem { key: {type:string; value:unknown}; object: string; version: string; } export interface TableAnswer { items: TableAnswerItem[]; nextCursor: string | null; hasNextPage: boolean; } interface TableItemQuery { parent: string; key: {type:string, value:unknown}; } /* json: ObjectsQuery string; return ObjectsAnswer */ export const query_objects_json = async (json:string) : Promise<string> => { try { const q : ObjectsQuery = JSON.parse(json); return JSON.stringify({data:await query_objects(q)}); } catch (e) { return JSON.stringify({error:e?.toString()}) } } /* json: TableQuery string; return TableAnswer */ export const query_table_json = async (json:string) : Promise<string> => { try { const q : TableQuery = JSON.parse(json); return JSON.stringify({data:await query_table(q)}); } catch (e) { return JSON.stringify({error:e?.toString()}) } } // query personal information; json: ObjectsAnswer; return ObjectPersonal | undefined . export const query_personal_json = async (json:string) : Promise<string> => { try { const q : PersonalQuery = JSON.parse(json); return JSON.stringify({data:(await queryTableItem_Personal(q) ?? '')}); } catch (e) { return JSON.stringify({error:e?.toString()}) } } export const query_objects = async (query: ObjectsQuery) : Promise<ObjectsAnswer> => { var ret:ObjectBase[] = []; const pending : string[] = []; const time = new Date().getTime(); const cache = WowokCache.Instance().get(CacheName.object); if (cache) { for (let i = 0; i < query.objects.length; ++i) { try { let data = cache.load(OBJECT_KEY(query.objects[i], CacheName.object)) if (data) { const r:CachedData = JSON.parse(data); if (r?.expire !== 'INFINITE' && (query?.no_cache || r.expire <= time) && (query.showOwner || query.showContent)) { //@ type immutable pending.push(query.objects[i]); } else { const d = data2object(JSON.parse(r.data)); d.cache_expire = r.expire; ret.push(d); } } } catch (e) { console.log(e) } pending.push(query.objects[i]); } } if (pending.length > 0) { const res = await Protocol.Client().multiGetObjects({ids:[...pending], options:{showContent:query.showContent, showType:query.showType, showOwner:query.showOwner}}); const cache = WowokCache.Instance().get(CacheName.object); if (cache) { const now = new Date().getTime(); res.forEach((i) => { // save try { if (i?.data) { const type_raw:string | undefined = i.data?.type ?? ((i.data?.content as any)?.type ?? undefined); const type:string | undefined = type_raw ? Protocol.Instance().object_name_from_type_repr(type_raw) : undefined; const expire = (type === 'Guard' || type === 'Payment') ? 'INFINITE' : (cache.expire_time()+now); // guard & payment immutable const r:CachedData = {expire:expire, data:JSON.stringify(i.data)} cache.save(OBJECT_KEY(i.data.objectId, CacheName.object), JSON.stringify(r)); } } catch(e) { console.log(e) } }) } ret = ret.concat(res.map(v=>data2object(v?.data))); } return {objects:ret} } export const queryTableItem_Personal = async (query:PersonalQuery) : Promise<ObjectPersonal | undefined> => { if (!IsValidAddress(query.address)) ERROR(Errors.IsValidAddress, 'entity.address') const time = new Date().getTime(); const cache = WowokCache.Instance().get(CacheName.personal); if (cache && !query.no_cache) { try { let data = cache.load(OBJECT_KEY(query.address, CacheName.personal)) if (data) { const r:CachedData = JSON.parse(data); if (r?.expire === 'INFINITE' || r.expire <= time) { const d = JSON.parse(r.data) as ObjectPersonal; d.cache_expire = r.expire; return d; } } } catch (e) { console.log(e) } } const res = await tableItem(tableItemQuery_byAddress(Protocol.Instance().objectEntity(), query.address)); if (res.type === 'Personal') { if (cache) { try { const expire = cache.expire_time()+((new Date()).getTime()); // guard & payment immutable const r:CachedData = {expire:expire, data:JSON.stringify(res)} cache.save(OBJECT_KEY(query.address, CacheName.personal), JSON.stringify(r)); res.cache_expire = expire; } catch(e) { console.log(e)} } return res as ObjectPersonal; } } export const query_table = async (query:TableQuery) : Promise<TableAnswer> => { const res = await Protocol.Client().getDynamicFields({parentId:query.parent, cursor:query.cursor, limit:query.limit}); return {items:res?.data?.map(v=>{ return {object:v.objectId, type:v.type, version:v.version, key:{ type:v.name.type, value:v.name.value }} }), nextCursor:res.nextCursor, hasNextPage:res.hasNextPage} } export interface QueryDemandPresenter { object: string | ObjectDemand; address: string; } export const queryTableItem_DemandPresenter = async (query: QueryDemandPresenter) : Promise<ObjectBase> => { return await tableItem(tableItemQuery_byAddress(query.object, query.address)) } export interface QueryPermissionEntity { object: string | ObjectPermission; address: string; } export const queryTableItem_PermissionEntity = async (query: QueryPermissionEntity) : Promise<ObjectBase> => { return await tableItem(tableItemQuery_byAddress(query.object, query.address)) } export interface QueryArbVoting { object: string | ObjectArb; address: string; } export const queryTableItem_ArbVoting = async (query:QueryArbVoting) : Promise<ObjectBase> => { return await tableItem(tableItemQuery_byAddress(query.object, query.address)) } export interface QueryMachineNode { object: string | ObjectMachine; name: string; } export const queryTableItem_MachineNode = async (query:QueryMachineNode) : Promise<ObjectBase> => { return await tableItem(tableItemQuery_byString(query.object, query.name)) } export interface QueryServiceSale { object: string | ObjectService; name: string; } export const queryTableItem_ServiceSale = async (query:QueryServiceSale) : Promise<ObjectBase> => { return await tableItem(tableItemQuery_byString(query.object, query.name)) } export interface QueryProgressHistory { object: string | ObjectProgress; index: string | number | bigint; } export interface QueryTreasuryHistory { object: string | ObjectTreasury; index: string | number | bigint; } export const queryTableItem_ProgressHistory = async (query:QueryProgressHistory) : Promise<ObjectBase> => { return await tableItem(tableItemQuery_byU64(query.object, query.index)) } export const queryTableItem_TreasuryHistory = async (query:QueryTreasuryHistory) : Promise<ObjectBase> => { return await tableItem(tableItemQuery_byU64(query.object, query.index)) } export interface QueryRepositoryData { object: string | ObjectRepository; address: string | number | bigint; name: string; } export const queryTableItem_RepositoryData = async (query:QueryRepositoryData) : Promise<ObjectBase> => { if (typeof(query.object) !== 'string') { query.object = query.object.object; } if (typeof(query.address) !== 'string') { query.address = uint2address(query.address); // convert int to address } return await tableItem({parent:query.object, key:{type:Protocol.Instance().package('wowok')+'::repository::DataKey', value:{id:query.address, key:query.name}}}) } export interface QueryMarkTag { object: string | ObjectMark; address: string; } export const queryTableItem_MarkTag = async (query:QueryMarkTag) : Promise<ObjectBase> => { return await tableItem(tableItemQuery_byAddress(query.object, query.address)) } function tableItemQuery_byAddress(parent:string | ObjectDemand | ObjectPermission | ObjectArb | ObjectMark, address:string) : TableItemQuery { if (typeof(parent) !== 'string') { parent = parent.object; } return {parent:parent, key:{type:'address', value:address}}; } function tableItemQuery_byString(parent:string | ObjectMachine | ObjectService, name:string) : TableItemQuery { if (typeof(parent) !== 'string') { parent = parent.object; } return {parent:parent, key:{type:'0x1::string::String', value:name}}; } function tableItemQuery_byU64(parent:string | ObjectProgress | ObjectTreasury, index:BigInt|string|number) : TableItemQuery { if (typeof(parent) !== 'string') { parent = parent.object; } return {parent:parent, key:{type:'u64', value:index}}; } const tableItem = async (query:TableItemQuery) : Promise<ObjectBase> => { const res = await Protocol.Client().getDynamicFieldObject({parentId:query.parent, name:{type:query.key.type, value:query.key.value}}); return data2object(res?.data) } export function raw2type(type_raw:string | undefined) : ObjectBaseType | undefined { if (!type_raw) return undefined; const t = Protocol.Instance().object_name_from_type_repr(type_raw); if (t === 'Permission' || t === 'Demand' || t === 'Machine' || t === 'Progress' || t === 'Order' || t === 'Service' || t === 'Treasury' || t === 'Arb' || t === 'Repository' || t === 'Payment' || t === 'Discount' || t === 'Guard' || t === 'Arbitration') { return t } else if (t === 'Resource') { return 'PersonalMark'; } const start = type_raw?.indexOf('0x2::dynamic_field::Field<'); if (start === 0) { const end = type_raw?.substring('0x2::dynamic_field::Field<'.length); if(end && Protocol.Instance().hasPackage(end)) { if (end.includes('::demand::Tips>')) { return 'TableItem_DemandPresenter'; } else if (end.includes('::machine::NodePair>>>')) { return 'TableItem_MachineNode'; } else if (end.includes('::progress::History>')) { return 'TableItem_ProgressHistory'; } else if (end.includes('::service::Sale>')) { return 'TableItem_ServiceSale'; } else if (end.includes('::treasury::Record>')) { return 'TableItem_TreasuryHistory'; } else if (end.includes('::arb::Voted>')) { return 'TableItem_ArbVote'; } else if (end.includes('::permission::Perm>>')) { return 'TableItem_PermissionEntity'; } else if (end.includes('::repository::DataKey')) { return 'TableItem_RepositoryData'; } else if (end.includes('::entity::Ent>')) { return 'Personal'; } else if (end.includes('::resource::Tags>')) { return 'TableItem_PersonalMark'; } } } return undefined; } export function data2object(data?:any) : ObjectBase { const content = (data?.content as any)?.fields; const id = data?.objectId ?? (content?.id?.id ?? undefined); const type_raw:string | undefined = data?.type ?? (data?.content?.type ?? undefined); const version = data?.version ?? undefined; const owner = data?.owner ?? undefined; const type:string | undefined = raw2type(type_raw); if (type) { switch(type) { case 'Permission': return {object:id, type:type, type_raw:type_raw, owner:owner, version:version, builder: content?.builder ??'', admin:content?.admin, description:content?.description??'', entity_count: parseInt(content?.table?.fields?.size), biz_permission:content?.user_define?.fields?.contents?.map((v:any) => { return {id:parseInt(v?.fields?.key), name:v?.fields?.value} }) } as ObjectPermission; case 'Demand': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, permission: content?.permission, description:content?.description, guard:content?.guard ? {object:content?.guard, service_id_in_guard:content?.service_identifier}:undefined, time_expire:content?.time_expire, yes:content?.yes, presenter_count:parseInt(content?.presenters?.fields?.size), bounty: content?.bounty?.map((v:any) => { return {type:v?.fields?.type, object:v?.fields?.id?.id, balance:v?.fields?.balance} }) } as ObjectDemand; case 'Machine': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, permission: content?.permission ?? '', description:content?.description??'', bPaused: content?.bPaused, bPublished:content?.bPublished, endpoint:content?.endpoint, consensus_repository:content?.consensus_repositories, node_count:parseInt(content?.nodes?.fields?.size), } as ObjectMachine; case 'Progress': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, machine: content?.machine, current: content?.current, task:content?.task, parent:content?.parent, history_count:parseInt(content?.history?.fields?.contents?.fields?.size), namedOperator:content?.namedOperator?.fields?.contents?.map((v:any) => { return {name:v?.fields?.key, operator:v?.fields?.value} }), session:content?.session?.fields?.contents?.map((v:any) => { return {weights:v?.fields?.value?.fields?.weight, threshold:v?.fields?.value?.fields?.threshold, next_node:v?.fields?.key, forward: v?.fields?.value?.fields?.forwards?.fields?.contents?.map((i:any) => { return {forward_name:i?.fields?.key, accomplished:i?.fields?.value?.fields?.accomplished, msg:i?.fields?.value?.fields?.msg, orders:i?.fields?.value?.fields?.orders, time:i?.fields?.value?.fields?.time, holder:i?.fields?.value?.fields?.who } }) } }) } as ObjectProgress; case 'Order': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, service:content?.service, amount: content?.amount, agent:content?.agent, arb:content?.dispute, payer:content?.payer, progress:content?.progress, discount:content?.discount, balance:content?.payed, required_info: content?.required_info ? {pubkey:content?.required_info?.fields?.customer_pub, msg_encrypted:content?.required_info?.fields?.info} : undefined, item : content?.items?.map((v:any) => { return {name:v?.fields?.name, price:v?.fields?.price, stock:v?.fields?.stock, endpoint:v?.fields?.endpoint} }), } as ObjectOrder; case 'Service': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, machine:content?.machine, permission:content?.permission, description:content?.description, arbitration:content?.arbitrations, bPaused:content?.bPaused, bPublished:content?.bPublished, buy_guard:content?.buy_guard, endpoint:content?.endpoint, payee:content?.payee, repository:content?.repositories, withdraw_guard:content?.withdraw_guard?.fields?.contents?.map((v:any) => { return {object:v?.fields?.key, percent:v?.fields?.value} }), refund_guard:content?.refund_guard?.fields?.contents?.map((v:any) => { return {object:v?.fields?.key, percent:v?.fields?.value} }), sales_count:parseInt(content?.sales?.fields?.size), extern_withdraw_treasury:content?.extern_withdraw_treasuries, customer_required_info:content?.customer_required ? {pubkey:content?.customer_required?.fields?.service_pubkey, required_info:content?.customer_required?.fields?.customer_required_info} :undefined, } as ObjectService; case 'Treasury': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, permission:content?.permission, description:content?.description, withdraw_mode:content?.withdraw_mode, history_count:parseInt(content?.history?.fields?.contents?.fields?.size), balance: content?.balance, deposit_guard:content?.deposit_guard, withdraw_guard:content?.withdraw_guard?.fields?.contents?.map((v:any) => { return {object:v?.fields?.key, percent:v?.fields?.value} }) } as ObjectTreasury; case 'Arbitration': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, permission:content?.permission, description:content?.description, fee:content?.fee, fee_treasury:content?.fee_treasury, usage_guard:content?.usage_guard, endpoint:content?.endpoint, bPaused:content?.bPaused, voting_guard:content?.voting_guard?.fields?.contents?.map((v:any) => { return {object:v?.fields?.key, weights:v?.fields?.value} }) } as ObjectArbitration; case 'Arb': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, arbitration:content?.arbitration, description:content?.description, fee:content?.fee, feedback:content?.feedback, indemnity:content?.indemnity, order:content?.order, voted_count:parseInt(content?.voted?.fields?.size), proposition:content?.proposition?.fields?.contents?.map((v:any) => { return {proposition:v?.fields?.key, votes:v?.fields?.value} }) } as ObjectArb; case 'Repository': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, permission:content?.permission, description:content?.description, policy_mode:content?.policy_mode, data_count:parseInt(content?.data?.fields?.size), reference:content?.reference, rep_type:content?.type, policy:content?.policies?.fields?.contents?.map((v:any) => { return {key:v?.fields?.key, description:v?.fields?.value?.fields?.description, permissionIndex:v?.fields?.value?.fields?.permission_index, dataType:v?.fields?.value?.fields?.value_type} }) } as ObjectRepository; case 'Payment': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, signer:content?.signer, time:content?.time, remark:content?.remark, from: content?.from, biz_id:content?.index, for_guard:content?.for_guard, for_object:content?.for_object, amount:content?.amount, record:content?.record?.map((v:any) => { return {recipient:v?.fields?.recipient, amount:v?.fields?.amount} }) } as ObjectPayment; case 'Discount': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, service:content?.service, time_start:content?.time_start, time_end:content?.time_end, price_greater:content?.price_greater, off_type:content?.type, off:content?.off, name:content?.name } as ObjectDiscount; case 'Guard': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, description:content?.description, input:Uint8Array.from(content?.input?.fields?.bytes), identifier:content?.constants?.map((v:any) => { return {id:v?.fields?.identifier, bWitness:v?.fields?.bWitness, value:Uint8Array.from(v?.fields?.value)} }) } as ObjectGuard; case 'PersonalMark' : return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, tag_count:parseInt(content?.tags?.fields?.size) } as ObjectMark; case 'TableItem_DemandPresenter': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, service:content?.name, presenter:content?.value?.fields?.who, recommendation:content?.value?.fields?.tips } as TableItem_DemandPresenter; case 'TableItem_ProgressHistory': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, history:Progress.DeHistory(content) } as TableItem_ProgressHistory; case 'TableItem_ServiceSale': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, item:{item:content?.name, stock:content?.value?.fields?.stock, price:content?.value?.fields?.price, endpoint:content?.value?.fields?.endpoint } } as TableItem_ServiceSale; case 'TableItem_TreasuryHistory': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, id: content?.name, payment:content?.value?.fields?.payment, signer:content?.value?.fields?.signer, operation: content?.value?.fields?.op, amount: content?.value?.fields?.amount, time:content?.value?.fields?.time } as TableItem_TreasuryHistory; case 'TableItem_ArbVote': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, singer:content?.name, vote:content?.value?.fields?.agrees, time: content?.value?.fields?.time, weight:content?.value?.fields?.weight } as TableItem_ArbVote; case 'TableItem_PermissionEntity': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, entity:content?.name, permission:content?.value?.map((v:any) => { return {id:v?.fields.index, guard:v?.fields.guard} }) } as TableItem_PermissionEntity; case 'TableItem_RepositoryData': return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, address:content?.name?.fields?.id, key:content?.name?.fields?.key, data:Uint8Array.from(content?.value) } as TableItem_RepositoryData; case 'Personal': const info = Bcs.getInstance().de_entInfo(Uint8Array.from(content?.value?.fields?.avatar)); return { object:id, type:type, type_raw:type_raw, owner:owner, version:version, address:content?.name, like:content?.value?.fields?.like, dislike:content?.value?.fields?.dislike, mark_object: content?.value?.fields?.resource, lastActive_digest: data?.previousTransaction, info : {homepage:info?.homepage, name:info?.name, avatar:info?.avatar, twitter:info?.twitter, discord:info?.discord, description:info?.description} } as ObjectPersonal; case 'TableItem_PersonalMark': return {object:id, type:type, type_raw:type_raw, owner:owner, version:version, address:content?.name, name:content?.value?.fields?.nick, tags:content?.value?.fields?.tags } as TableItem_PersonalMark; } } return {object:id, type:undefined, type_raw:type_raw, owner:owner, version:version} }