UNPKG

wowok

Version:

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

552 lines (511 loc) 27 kB
import { SuiClient, SuiObjectResponse, SuiObjectDataOptions, SuiTransactionBlockResponseOptions, SuiTransactionBlockResponse } from '@mysten/sui/client'; import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'; import { fromHEX } from '@mysten/bcs'; import { Transaction as TransactionBlock, TransactionResult, TransactionArgument } from '@mysten/sui/transactions'; import { capitalize, IsValidAddress, IsValidArray, IsValidU128, IsValidU256, IsValidU64, IsValidU8 } from './utils' import { GuardConstant } from './guard'; import { isValidSuiObjectId } from '@mysten/sui/utils' export enum MODULES { machine = 'machine', progress = 'progress', repository = 'repository', permission = 'permission', passport = 'passport', guard = 'guard', demand = 'demand', order = 'order', service = 'service', resource = 'resource', entity = 'entity', wowok = 'wowok', treasury = 'treasury', payment = 'payment', arbitration = 'arbitration', arb = 'arb', } export type PermissionAddress = TransactionResult; export type PermissionObject = TransactionResult | string | TransactionArgument; export type RepositoryAddress = TransactionResult; export type RepositoryObject = TransactionResult | string | TransactionArgument; export type GuardAddress = TransactionResult; export type GuardObject = TransactionResult | string | TransactionArgument ; export type MachineAddress = TransactionResult; export type MachineObject = TransactionResult | string | TransactionArgument; export type PassportObject = TransactionResult; export type DemandAddress = TransactionResult; export type DemandObject = TransactionResult | string | TransactionArgument; export type ServiceObject = TransactionResult | string | TransactionArgument; export type ServiceAddress = TransactionResult; export type ArbitrationObject = TransactionResult | string | TransactionArgument; export type ArbitrationAddress = TransactionResult; export type ArbObject = TransactionResult | string | TransactionArgument; export type ArbAddress = TransactionResult; export type ProgressObject = TransactionResult | string | TransactionArgument; export type ProgressAddress = TransactionResult; export type TreasuryObject = TransactionResult | string | TransactionArgument; export type TreasuryAddress = TransactionResult; //export type RewardObject = TransactionResult | string | TransactionArgument; //export type RewardAddress = TransactionResult; export type OrderObject = TransactionResult | string | TransactionArgument; export type OrderAddress = TransactionResult; export type DiscountObject = TransactionResult | string | TransactionArgument; export type CoinObject = TransactionResult | string | TransactionArgument; //export type VoteObject = TransactionResult | string | TransactionArgument; //export type VoteAddress = TransactionResult; export type ResourceObject = TransactionResult | string | TransactionArgument; export type ResourceAddress = TransactionResult; export type EntityObject = TransactionResult | string | TransactionArgument; export type EntityAddress = TransactionResult; export type PaymentObject = TransactionResult | string | TransactionArgument; export type PaymentAddress = TransactionResult; export type ReceivedObject = TransactionResult | string | TransactionArgument; export type CoinWrapperObject = TransactionResult; export type TxbAddress = string | TransactionResult; export type TxbObject = string | TransactionResult | TransactionArgument | GuardObject | RepositoryObject | PermissionObject | MachineObject | PassportObject | DemandObject | ServiceObject | OrderObject | DiscountObject | DemandObject | ResourceObject | EntityObject | ArbitrationObject | ArbObject | TreasuryObject; export type WowokObject = TransactionResult; export type FnCallType = `${string}::${string}::${string}`; export enum OperatorType { TYPE_QUERY = 1, // query wowok object TYPE_NUMBER_ADD = 2, TYPE_NUMBER_SUBTRACT = 3, TYPE_NUMBER_MULTIPLY = 4, TYPE_NUMBER_DEVIDE = 5, TYPE_NUMBER_MOD = 6, TYPE_NUMBER_ADDRESS = 7, TYPE_LOGIC_AS_U256_GREATER = 11, TYPE_LOGIC_AS_U256_GREATER_EQUAL = 12, TYPE_LOGIC_AS_U256_LESSER = 13, TYPE_LOGIC_AS_U256_LESSER_EQUAL = 14, TYPE_LOGIC_AS_U256_EQUAL = 15, TYPE_LOGIC_EQUAL = 16, // TYPE&DATA(vector<u8>) MUST BE EQUAL TYPE_LOGIC_HAS_SUBSTRING = 17, // SUBSTRING TYPE_LOGIC_NOT = 18, // NOT TYPE_LOGIC_AND = 19, // AND TYPE_LOGIC_OR = 20, // OR } export const LogicsInfo = [ [OperatorType.TYPE_LOGIC_AS_U256_GREATER, 'Unsigned Integer >', 'The first item > anything that follows'], [OperatorType.TYPE_LOGIC_AS_U256_GREATER_EQUAL, 'Unsigned Integer >=', 'The first item >= anything that follows'], [OperatorType.TYPE_LOGIC_AS_U256_LESSER, 'Unsigned Integer <', 'The first item < anything that follows'], [OperatorType.TYPE_LOGIC_AS_U256_LESSER_EQUAL, 'Unsigned Integer <=', 'The first item <= anything that follows'], [OperatorType.TYPE_LOGIC_AS_U256_EQUAL, 'Unsigned Integer =', 'The first item = anything that follows'], [OperatorType.TYPE_LOGIC_EQUAL, 'Equal', 'Data and type are exactly equal for all items'], [OperatorType.TYPE_LOGIC_HAS_SUBSTRING, 'Has Sub String', 'The first string contains anything that follows'], [OperatorType.TYPE_LOGIC_NOT, 'Not', 'Not operation'], [OperatorType.TYPE_LOGIC_AND, 'And', 'All Items And operations'], [OperatorType.TYPE_LOGIC_OR, 'Or', 'All Items Or operations'], ]; export enum ValueType { TYPE_BOOL = 100, TYPE_ADDRESS = 101, TYPE_U8 = 102, TYPE_U64 = 103, TYPE_VEC_U8 = 104, TYPE_U128 = 105, TYPE_VEC_ADDRESS = 106, TYPE_VEC_BOOL = 107, TYPE_VEC_VEC_U8 = 108, TYPE_VEC_U64 = 109, TYPE_VEC_U128 = 110, TYPE_OPTION_ADDRESS = 111, TYPE_OPTION_BOOL = 112, TYPE_OPTION_U8 = 113, TYPE_OPTION_U64 = 114, TYPE_OPTION_U128 = 115, TYPE_OPTION_U256 = 116, TYPE_OPTION_STRING = 117, TYPE_OPTION_VEC_U8 = 118, TYPE_VEC_U256 = 119, TYPE_STRING = 120, TYPE_VEC_STRING = 121, TYPE_U256 = 122, } export enum RepositoryValueType { Address = 200, Address_Vec = 201, PositiveNumber = 202, PositiveNumber_Vec = 203, String = 204, String_Vec = 205, Bool = 206, } export const RepositoryValueTypeInfo = [ {type: RepositoryValueType.String, name:'string', description:'String.'}, {type: RepositoryValueType.Address, name:'address', description:'Object id or Personal address.'}, {type: RepositoryValueType.PositiveNumber, name:'unsigned integer', description:'Including u8, u16 ,..., u256'}, {type: RepositoryValueType.String_Vec, name:'string vector', description:'Vector of string.'}, {type: RepositoryValueType.Address_Vec, name:'address vector', description:'Vector of address.'}, {type: RepositoryValueType.PositiveNumber_Vec, name:'unsigned integer vector', description:'Vector of unsigned integer'}, {type: RepositoryValueType.Bool, name:'bool', description:'True or False.'}, ] export const OperatorTypeArray = (Object.values(OperatorType) as []).filter((v)=>typeof(v) === 'number') as number[]; export const ValueTypeArray = (Object.values(ValueType) as []).filter((v)=>typeof(v) === 'number') as number[]; export const IsValidOperatorType = (type:number) : boolean => { return OperatorTypeArray.includes(type)} export const IsValidValueType = (type:number) : boolean => { return ValueTypeArray.includes(type)} export const IsNumberType = (type:ValueType | any) : boolean => { return type===ValueType.TYPE_U128 || type===ValueType.TYPE_U256 || type===ValueType.TYPE_U64 || type===ValueType.TYPE_U8 } export enum ContextType { TYPE_SIGNER = 60, // address type; the signer address on verifying TYPE_CLOCK = 61, // u64 type; On-chain time at validation TYPE_GUARD = 62, // address type; the address of the guard being verified //TYPE_STACK_ADDRESS = 63, // object queried from current stack top TYPE_CONSTANT = 80, } interface ValueTypeString { type: ValueType | ContextType; name: string; description: string; validator?: (value:any) => boolean; } export const SER_VALUE: ValueTypeString[] = [ {type: ValueType.TYPE_BOOL, name: 'bool', description:'boolean. eg:true or false', validator:(value:any) => { return (value === true || value === false)}}, {type: ValueType.TYPE_ADDRESS, name: 'address', description:'address or object-id. eg:0x6789af', validator:IsValidAddress}, {type: ContextType.TYPE_SIGNER, name: 'txn signer', description:"signer address of the transaction"}, {type: ContextType.TYPE_GUARD, name: 'guard address', description:"current guard address"}, {type: ContextType.TYPE_CLOCK, name: 'txn time', description:"unsigned-64 number for the transaction time"}, {type: ValueType.TYPE_U64, name: 'number', description:'unsigned-64 number. eg:23870233', validator:IsValidU64}, {type: ValueType.TYPE_U8, name: 'number', description:'unsigned-8 number. eg:255', validator:IsValidU8}, {type: ValueType.TYPE_VEC_U8, name: 'string', description:'string or unsigned-8 number array. eg:"[1,2,3]"'}, {type: ValueType.TYPE_U128, name: 'number', description:'unsigned-8 number. eg:12348900999', validator:IsValidU128}, {type: ValueType.TYPE_VEC_ADDRESS, name: '[address]', description:'address array. eg:[0x2277f2, 0x3344af]'}, {type: ValueType.TYPE_VEC_BOOL, name: '[bool]', description:'boolean array. eg:[true, false, true]'}, {type: ValueType.TYPE_VEC_VEC_U8, name: '[[number]]', description:'array of unsigned-8 number array. eg:["i", "like", "wowok"]'}, {type: ValueType.TYPE_VEC_U64, name: '[number]', description:'unsigned-64 number array. eg:[123, 778888, 42312]'}, {type: ValueType.TYPE_VEC_U128, name: '[number]', description:'unsigned-128 number array. eg:[123, 778888, 42312]'}, {type: ValueType.TYPE_OPTION_ADDRESS, name: 'option', description:'option of address. eg:none or address'}, {type: ValueType.TYPE_OPTION_BOOL, name: 'option', description:'option of bool. eg:none or boolean value'}, {type: ValueType.TYPE_OPTION_U8, name: 'option', description:'option of u8. eg:none or u8 value'}, {type: ValueType.TYPE_OPTION_U64, name: 'option', description:'option of u64. eg:none or u64 value'}, {type: ValueType.TYPE_OPTION_U128, name: 'option', description:'option of u128. eg:none or u128 value'}, {type: ValueType.TYPE_OPTION_U256, name: 'option', description:'option of u256. eg:none or u256 value'}, {type: ValueType.TYPE_VEC_U256, name: '[number]', description:'unsigned-256 number array. eg:[123, 778888, 42312]'}, {type: ValueType.TYPE_VEC_STRING, name: '[string]', description:'ascii string array. eg:["abc", "hi"]'}, {type: ValueType.TYPE_STRING, name: 'string', description:'eg:"wowok"', }, {type: ValueType.TYPE_OPTION_STRING, name: 'option', description:'option of string. eg:none or string value'}, {type: ValueType.TYPE_U256, name: 'number', description:'unsigned-256 number. eg:12345678901233', validator:IsValidU256}, ] //export type ConstantType = ValueType | ContextType.TYPE_WITNESS_ID; export type Data_Type = ValueType | OperatorType | ContextType; export enum ENTRYPOINT { mainnet = 'mainnet', testnet = 'testnet', devnet = 'devnet', localnet = 'localnet' } const TESTNET = { wowok: "0xd1ed1921f385bb6c016070325950e87f1d0e3b6a5dcc67c7a9a7b66618f29239", wowok_origin:'0xd1ed1921f385bb6c016070325950e87f1d0e3b6a5dcc67c7a9a7b66618f29239' , base: '0xd9705a4f0b7ae3400d3af4ba781b2d2f6b4dc5dd81e2e1ce2bc949c16583df7f', base_origin: '0xd9705a4f0b7ae3400d3af4ba781b2d2f6b4dc5dd81e2e1ce2bc949c16583df7f', wowok_object: '0x04bc9f2680baa9e1cc1e52b329f7d7790afeb95f097b704c10116c257c5d07c4', entity_object: '0x70623568c63000b21b7b5e180c7e5415970763335c3e3b90b1795b0fc164c60d', treasury_cap:'0xfe7b18c27914fef876dfefd018350cfe33c45b6c5fbe5931f9449048e834da5b', oracle_object:'0x70b4a282626aef7d31822079a1727a6576c718e9640cb30ad4c385d632138689', } const MAINNET = { wowok: "", wowok_origin:"", base:"", base_origin:"", wowok_object: '', entity_object: '', treasury_cap:'', oracle_object:'', } export interface CoinTypeInfo { symbol: string; type: string; decimals: number; alias ?: boolean; } export class Protocol { protected network = ''; protected packages = new Map<string, string>(); protected signer = ''; protected wowok_object = ''; protected entity_object = ''; protected treasury_cap = ''; protected oracle_object = ''; //protected graphql = ''; protected txb: TransactionBlock | undefined; static _instance: any; constructor(network:ENTRYPOINT=ENTRYPOINT.testnet) { this.use_network(network); this.new_session(); } static Instance() : Protocol { if (!Protocol._instance) { Protocol._instance = new Protocol(); }; return Protocol._instance } static Client() : SuiClient { return new SuiClient({ url: Protocol.Instance().networkUrl() }); } client() { return new SuiClient({url: this.networkUrl() })} use_network(network:ENTRYPOINT=ENTRYPOINT.testnet) { this.network = network; switch(network) { case ENTRYPOINT.localnet: break; case ENTRYPOINT.devnet: break; case ENTRYPOINT.testnet: this.packages.set('wowok', TESTNET.wowok); this.packages.set('base', TESTNET.base); this.packages.set('wowok_origin', TESTNET.wowok_origin); //@ orgin package!!! this.packages.set('base_origin', TESTNET.base_origin); this.wowok_object = TESTNET.wowok_object; this.entity_object= TESTNET.entity_object; this.treasury_cap = TESTNET.treasury_cap; //this.graphql = 'https://sui-testnet.mystenlabs.com/graphql'; this.oracle_object = TESTNET.oracle_object; break; case ENTRYPOINT.mainnet: this.packages.set('wowok', MAINNET.wowok); this.packages.set('base', MAINNET.base); this.packages.set('wowok_origin', MAINNET.wowok_origin); //@ orgin package!!! this.packages.set('base_origin', MAINNET.base_origin); this.wowok_object = MAINNET.wowok_object; this.entity_object= MAINNET.entity_object; this.treasury_cap = MAINNET.treasury_cap; //this.graphql = 'https://sui-mainnet.mystenlabs.com/graphql'; this.oracle_object = MAINNET.oracle_object; break; }; } package(type:string): string { return this.packages.get(type) ?? '' } objectWowok(): string { return this.wowok_object } objectEntity(): string { return this.entity_object } objectOracle(): string { return this.oracle_object } objectTreasuryCap() : string { return this.treasury_cap } networkUrl() : string { switch(this.network) { case ENTRYPOINT.localnet: return "http://127.0.0.1:9000"; case ENTRYPOINT.devnet: return "https://fullnode.devnet.sui.io:443"; case ENTRYPOINT.testnet: return "https://fullnode.testnet.sui.io:443"; case ENTRYPOINT.mainnet: return "https://fullnode.mainnet.sui.io:443"; }; return ""; }; machineFn = (fn:any) => { return `${this.packages.get('wowok')}::${MODULES.machine}::${fn}`}; progressFn = (fn:any) => { return `${this.packages.get('wowok')}::${MODULES.progress}::${fn}`}; repositoryFn = (fn:any) => { return `${this.packages.get('wowok')}::${MODULES.repository}::${fn}`}; permissionFn = (fn: any) => { return `${this.packages.get('wowok')}::${MODULES.permission}::${fn}`}; passportFn = (fn:any) => { return `${this.packages.get('wowok')}::${MODULES.passport}::${fn}`}; demandFn = (fn: any) => { return `${this.packages.get('wowok')}::${MODULES.demand}::${fn}`}; orderFn = (fn:any) => { return `${this.packages.get('wowok')}::${MODULES.order}::${fn}`}; serviceFn = (fn: any) => { return `${this.packages.get('wowok')}::${MODULES.service}::${fn}`}; resourceFn = (fn: any) => { return `${this.packages.get('wowok')}::${MODULES.resource}::${fn}`}; entityFn = (fn: any) => { return `${this.packages.get('wowok')}::${MODULES.entity}::${fn}`}; wowokFn = (fn: any) => { return `${this.packages.get('wowok')}::${MODULES.wowok}::${fn}`}; treasuryFn = (fn: any) => { return `${this.packages.get('wowok')}::${MODULES.treasury}::${fn}`}; paymentFn = (fn: any) => { return `${this.packages.get('wowok')}::${MODULES.payment}::${fn}`}; guardFn = (fn: any) => { return `${this.packages.get('base')}::${MODULES.guard}::${fn}`}; baseWowokFn = (fn: any) => { return `${this.packages.get('base')}::${MODULES.wowok}::${fn}`}; arbitrationFn = (fn: any) => { return `${this.packages.get('wowok')}::${MODULES.arbitration}::${fn}`}; arbFn = (fn: any) => { return `${this.packages.get('wowok')}::${MODULES.arb}::${fn}`}; query = async (objects: Query_Param[], options:SuiObjectDataOptions={showContent:true}) : Promise<SuiObjectResponse[]> => { const client = new SuiClient({ url: this.networkUrl() }); const ids = objects.map((value) => value.objectid); const res = await client.call('sui_multiGetObjects', [ids, options]) as SuiObjectResponse[]; let ret:any[] = []; for (let i = 0; i < res.length; i ++ ) { objects.forEach((object) => { object.callback(this, res[i], object, options); }) } return res; } query_raw = async (objects: string[], options:SuiObjectDataOptions={showContent:true}) : Promise<SuiObjectResponse[]> => { const client = new SuiClient({ url: this.networkUrl() }); return await client.call('sui_multiGetObjects', [objects, options]) as SuiObjectResponse[]; } new_session = () : TransactionBlock => { this.txb = new TransactionBlock(); return this.txb } sessionCurrent = () : TransactionBlock => { return this.txb ? this.txb : this.new_session() } sign_excute = async (exes: ((protocol:Protocol, param:any) => void)[], priv_key:string, param?:any, options:SuiTransactionBlockResponseOptions={showObjectChanges:true}) : Promise<SuiTransactionBlockResponse> => { const client = new SuiClient({ url: this.networkUrl() }); exes.forEach((e) => { e(this, param) }); const privkey = fromHEX(priv_key); const keypair = Ed25519Keypair.fromSecretKey(privkey); const response = await client.signAndExecuteTransaction({ transaction: this.sessionCurrent(), signer: keypair, options, }); this.txb = undefined; // reset the txb to undefine return response; } // used in service, discount, order, because service has COIN wrapper for TOKEN static SUI_TOKEN_TYPE = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI'; // TOKEN_TYPE // used in demand, reward, ... static SUI_COIN_TYPE = '0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x2::sui::SUI>'; // COIN TYPE WOWOK_TOKEN_TYPE = () => { return this.packages.get('base') + '::wowok::WOWOK' } WOWOK_COIN_TYPE = () => { return '0x2::coin::Coin<' + this.packages.get('base') + '::wowok::WOWOK>'} COINS_TYPE = () => { switch(this.network) { case ENTRYPOINT.testnet: return this.CoinTypes_Testnet.filter((v)=>v.alias !== true); case ENTRYPOINT.mainnet: return this.CoinTypes_Mainnet.filter((v)=>v.alias !== true); }; return []; } update_coinType = (token_type: string, decimals:number, symbol: string) => { if (!symbol || !token_type) return ; switch(this.network) { case ENTRYPOINT.testnet: var r = this.CoinTypes_Testnet.filter((v) => v?.type !== token_type); r.push({symbol:symbol, type:token_type, decimals:decimals}); this.CoinTypes_Testnet = r; break; case ENTRYPOINT.mainnet: var r = this.CoinTypes_Mainnet.filter((v) => v?.type !== token_type); r.push({symbol:symbol, type:token_type, decimals:decimals}); this.CoinTypes_Mainnet = r; break; }; } explorerUrl = (objectid: string, type:'object' | 'txblock' | 'account'='object') => { if (this.network === ENTRYPOINT.testnet) { return 'https://testnet.suivision.xyz/' + type + '/' + objectid; } else if (this.network === ENTRYPOINT.mainnet) { return 'https://suivision.xyz/' + type + '/' + objectid; }; return '' } CoinTypes_Testnet:CoinTypeInfo[] = [ {symbol:'SUI', type:'0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI', decimals:9, alias:true}, {symbol:'SUI', type:'0x2::sui::SUI', decimals:9, }, {symbol:'WOW', type:TESTNET.base + '::wowok::WOWOK', decimals:9}, ]; CoinTypes_Mainnet:CoinTypeInfo[] = [ {symbol:'SUI', type:'0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI', decimals:9, alias:true}, {symbol:'SUI', type:'0x2::sui::SUI', decimals:9, }, {symbol:'WOW', type:TESTNET.base + '::wowok::WOWOK', decimals:9}, {symbol:'USDT', type:'0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN', decimals:6}, {symbol:'USDC', type:'0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN', decimals:6}, {symbol:'WETH', type:'0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN', decimals:8}, {symbol:'WBNB', type:'0xb848cce11ef3a8f62eccea6eb5b35a12c4c2b1ee1af7755d02d7bd6218e8226f::coin::COIN', decimals:8}, ]; coinTypeInfo = (token_type: string, handler:(info:CoinTypeInfo)=>void) : CoinTypeInfo | 'loading' => { if (!token_type) return 'loading'; let r = this.COINS_TYPE().find((v) => v?.type === token_type); if (!r) { Protocol.Client().getCoinMetadata({coinType:token_type}).then((res) => { if (res?.decimals && res?.symbol) { this.update_coinType(token_type, res?.decimals, res?.symbol); handler({symbol:res.symbol, decimals:res.decimals, type:token_type}); } }).catch((e) => { console.log(e); }) } else { return r; }; return 'loading'; } static CLOCK_OBJECT = {objectId:'0x6', mutable:false, initialSharedVersion:1}; static TXB_OBJECT(txb:TransactionBlock, arg:TxbObject) : TransactionArgument { if (typeof(arg) == 'string') return txb.object(arg) as TransactionArgument; return arg; } static IsValidObjects = (arr:TxbObject[]) : boolean => { return IsValidArray(arr, (v:TxbObject)=>{ if (!v) return false if (typeof(v) === 'string' && !isValidSuiObjectId(v)) { return false } return true }) } WOWOK_OBJECTS_TYPE = () => (Object.keys(MODULES) as Array<keyof typeof MODULES>).map((key) => { let i = (key === MODULES.guard ? this.packages.get('base') : this.packages.get('wowok')) + '::' + key + '::'; return i + capitalize(key); }) WOWOK_OBJECTS_PREFIX_TYPE = () => (Object.keys(MODULES) as Array<keyof typeof MODULES>).map((key) => { return (key === MODULES.guard ? this.packages.get('base') : this.packages.get('wowok')) + '::' + key + '::'; }) hasPackage(pack:string) : boolean { for (let value of this.packages.values()) { if (pack.includes(value)) { return true; } } return false; } object_name_from_type_repr = (type_repr:string) : string => { if (!type_repr) return '' let i = type_repr.indexOf('::'); if (i > 0 && this.hasPackage(type_repr.slice(0, i))) { i = type_repr.indexOf('<'); if (i > 0) { type_repr = type_repr.slice(0, i); } let n = type_repr.lastIndexOf('::'); if (n > 0) { return type_repr.slice(n+2); } } return '' } module_object_name_from_type_repr = (type_repr:string) : string => { if (!type_repr) return '' let i = type_repr.indexOf('::'); if (i > 0 && this.hasPackage(type_repr.slice(0, i))) { i = type_repr.indexOf('<'); if (i > 0) { type_repr = type_repr.slice(0, i); } let n = type_repr.indexOf('::'); if (n > 0) { return type_repr.slice(n+2); } } return '' } } export class RpcResultParser { static Object_Type_Extra = () => { let names = (Object.keys(MODULES) as Array<keyof typeof MODULES>).map((key) => { return key + '::' + capitalize(key); }); names.push('order::Discount'); return names; } static objectids_from_response = (protocol:Protocol, response:SuiTransactionBlockResponse, concat_result?:Map<string, TxbObject[]>): Map<string, TxbObject[]> => { //console.log(response) let ret = new Map<string, string[]>(); if (response?.objectChanges) { response.objectChanges.forEach((change) => { RpcResultParser.Object_Type_Extra().forEach((name) => { if (change.type == 'created' && protocol.module_object_name_from_type_repr(change.objectType)===name) { if (ret.has(name)) { ret.get(name)?.push(change.objectId); } else { ret.set(name, [change.objectId]); } } }) }); } if (concat_result) { ret.forEach((value, key) => { if (concat_result.has(key)) { concat_result.set(key, concat_result.get(key)!.concat(value)); } else { concat_result.set(key, value); } }) } return ret; } } export type Query_Param = { objectid: string; callback: (protocol:Protocol, response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions)=>void; parser?: (result:any[], guardid: string, chain_sense_bsc:Uint8Array, constant?:GuardConstant) => boolean; data?: any; // response data filted by callback constants?: GuardConstant; };