wowok 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/passport.ts CHANGED
@@ -1,36 +1,62 @@
1
1
  import { SuiObjectResponse, SuiObjectDataOptions } from '@mysten/sui.js/client';
2
- import { TransactionBlock, TransactionResult, type TransactionObjectInput, Inputs } from '@mysten/sui.js/transactions';
3
- import { PROTOCOL, FnCallType, CLOCK_OBJECT, Query_Param, OBJECTS_TYPE, OBJECTS_TYPE_PREFIX, PassportObject, GuardObject, TXB_OBJECT, ContextType, IsValidAddress} from './protocol';
4
- import { parse_object_type, array_unique } from './utils';
5
- import { rpc_sense_objects_fn } from './guard';
2
+ import { TransactionBlock, TransactionResult, type TransactionObjectInput, Inputs, TransactionArgument } from '@mysten/sui.js/transactions';
3
+ import { PROTOCOL, FnCallType, CLOCK_OBJECT, Query_Param, OBJECTS_TYPE, OBJECTS_TYPE_PREFIX, PassportObject, GuardObject,
4
+ TXB_OBJECT, ContextType, IsValidAddress, IsValidArray, IsValidObjects} from './protocol';
5
+ import { parse_object_type, array_unique, BCS_CONVERT } from './utils';
6
+ import { rpc_sense_objects_fn, parse_sense_bsc, parse_futures, FutureValueRequest, VariableType, add_variable, add_future_variable} from './guard';
6
7
  import { BCS } from '@mysten/bcs';
7
8
 
8
9
  export const MAX_GUARD_COUNT = 8;
9
10
 
11
+ // from guards: get future objects to fill by singer
12
+ export const guard_futures = async (guards:string[]) : Promise<FutureValueRequest[]> => {
13
+ let futrue_objects = guards.map((value) => {
14
+ return {objectid:value, callback:rpc_sense_objects_fn, parser:parse_futures, data:[]} as Query_Param
15
+ });
16
+ await PROTOCOL.Query(futrue_objects); // future objects
17
+ let future_objects_result:FutureValueRequest[] = [];
18
+ futrue_objects.forEach((futrue) => {
19
+ futrue.data.forEach((f:FutureValueRequest) => {
20
+ if (future_objects_result.findIndex((v)=>{ return v.guardid == f.guardid && v.identifier == f.identifier}) == -1) {
21
+ future_objects_result.push(f);
22
+ }
23
+ }) ;
24
+ });
25
+
26
+ return future_objects_result
27
+ }
28
+
29
+ // from guards: get objects to 'guard_query' on chain , with future variables had filled.
10
30
  // passport verify for some guards, MUST be in ONE pxb:
11
31
  // 0. construct Guard_Query_Objects(passport_quries) from queries for guards of objects
12
32
  // 1. create passport
13
- // 2. add all guards
33
+ // 2. add all guards / guards future variables
14
34
  // 3. verify passport
15
35
  // 4. ops using passport(guard set on object)
16
36
  // 5. ops using passport(guard set on object)
17
37
  // 6. destroy passport
18
-
19
-
20
- export const passport_queries = async (guards:string[]) : Promise<Guard_Query_Object[]> => {
38
+ export const guard_queries = async (guards:string[], futures?:FutureValueRequest[]) : Promise<Guard_Query_Object[]> => {
21
39
  let sense_objects = guards.map((value) => {
22
- return {objectid:value, callback:rpc_sense_objects_fn, data:[]} as Query_Param
40
+ let v:VariableType = new Map();
41
+ futures?.forEach((f) => {
42
+ if (f.guardid == value) {
43
+ add_future_variable(v, f.identifier, f.type, f.witness.slice(0), f?.value?f.value.slice(0):undefined, true);
44
+ }
45
+ })
46
+ return {objectid:value, callback:rpc_sense_objects_fn, parser:parse_sense_bsc, data:[], variables:futures?v:undefined} as Query_Param
23
47
  });
48
+
24
49
  await PROTOCOL.Query(sense_objects); // objects need quering in guards
25
50
  let sense_objects_result:string[] = [];
26
51
  sense_objects.forEach((value) => { // DONT CHANGE objects sequence
27
52
  sense_objects_result = sense_objects_result.concat(value.data);
28
53
  });
29
54
  sense_objects_result = array_unique(sense_objects_result); // objects in guards
30
-
55
+
31
56
  let queries = sense_objects_result.map((value) => {
32
57
  return {objectid:value, callback:rpc_query_cmd_fn, data:[]} as Query_Param;
33
58
  })
59
+
34
60
  await PROTOCOL.Query(queries, {'showType':true}); // queries for passport verifing
35
61
  let res : Guard_Query_Object[] = [];
36
62
  sense_objects.forEach((guard) => { // DONT CHANGE objects sequence for passport verifying
@@ -51,54 +77,51 @@ export const passport_queries = async (guards:string[]) : Promise<Guard_Query_Ob
51
77
  }
52
78
 
53
79
  // return passport object used
54
- export function verify(txb:TransactionBlock, guards:string[], passport_queries:Guard_Query_Object[]) : PassportObject | boolean {
55
- if (!guards || passport_queries.length == 0 || passport_queries.length > MAX_GUARD_COUNT) {
56
- return false;
57
- }
58
-
80
+ export function verify(txb:TransactionBlock, guards:GuardObject[], guard_queries:Guard_Query_Object[], future_values?:FutureValueRequest[]) : PassportObject | boolean {
81
+ if (!guards || guards.length > MAX_GUARD_COUNT) return false;
82
+ if (!IsValidObjects(guards)) return false;
83
+
59
84
  var passport = txb.moveCall({
60
85
  target: PROTOCOL.PassportFn('new') as FnCallType,
61
- arguments: [ TXB_OBJECT(txb, guards[0])]
86
+ arguments: []
62
87
  });
63
-
88
+
64
89
  // add others guards, if any
65
- for (let i = 1; i < guards.length; i++) {
90
+ guards.forEach((guard) => {
66
91
  txb.moveCall({
67
92
  target:PROTOCOL.PassportFn('guard_add') as FnCallType,
68
- arguments:[passport, TXB_OBJECT(txb, guards[i])]
69
- });
70
- }
93
+ arguments:[passport, TXB_OBJECT(txb, guard)]
94
+ });
95
+ })
96
+
97
+ future_values?.forEach((v) => {
98
+ txb.moveCall({
99
+ target:PROTOCOL.PassportFn('future_set') as FnCallType,
100
+ arguments:[passport, txb.pure(BCS_CONVERT.ser_address(v.guardid)), txb.pure(BCS_CONVERT.ser_u8(v.identifier)),
101
+ txb.pure(BCS_CONVERT.ser_address(v.value!))]
102
+ })
103
+ })
71
104
 
72
105
  // rules: 'verify' & 'query' in turns;'verify' at final end.
73
- for (let i = 0; i < passport_queries.length; i++) {
106
+ for (let i = 0; i < guard_queries.length; i++) {
74
107
  let res = txb.moveCall({
75
108
  target: PROTOCOL.PassportFn('passport_verify') as FnCallType,
76
109
  arguments: [ passport, txb.object(CLOCK_OBJECT), ]
77
110
  });
78
111
  txb.moveCall({
79
- target: passport_queries[i].target as FnCallType,
80
- arguments: [ txb.object(passport_queries[i].object), passport, res ],
81
- typeArguments: passport_queries[i].types,
112
+ target: guard_queries[i].target as FnCallType,
113
+ arguments: [ txb.object(guard_queries[i].object), passport, res ],
114
+ typeArguments: guard_queries[i].types,
82
115
  })
83
- }
116
+ }
84
117
  txb.moveCall({
85
118
  target: PROTOCOL.PassportFn('passport_verify') as FnCallType,
86
119
  arguments: [ passport, txb.object(CLOCK_OBJECT) ]
87
- });
120
+ });
88
121
 
89
122
  return passport;
90
123
  }
91
124
 
92
- export function add_context_address(txb:TransactionBlock, passport:PassportObject, type:ContextType, value:string, witness:string) : Boolean {
93
- if (!IsValidAddress(value) || !IsValidAddress(witness)) return false;
94
-
95
- txb.moveCall({
96
- target: PROTOCOL.PassportFn('context_add_address') as FnCallType,
97
- arguments: [ passport, txb.pure(type, BCS.U8), txb.pure(value, BCS.ADDRESS), txb.pure(witness, BCS.ADDRESS)]
98
- });
99
- return true
100
- }
101
-
102
125
  export function destroy(txb:TransactionBlock, passport:PassportObject) : boolean {
103
126
  txb.moveCall({
104
127
  target: PROTOCOL.PassportFn('destroy') as FnCallType,
package/src/progress.ts CHANGED
@@ -55,13 +55,13 @@ export function progress_set_namedOperator(txb:TransactionBlock, machine:Machine
55
55
  if (passport) {
56
56
  txb.moveCall({
57
57
  target:PROTOCOL.ProgressFn('namedOperator_set_with_passport') as FnCallType,
58
- arguments: [passport, TXB_OBJECT(txb, progress), txb.pure(name), txb.pure(array_unique(addresses), 'vector<address>'),
58
+ arguments: [passport, TXB_OBJECT(txb, progress), txb.pure(name, BCS.STRING), txb.pure(array_unique(addresses), 'vector<address>'),
59
59
  TXB_OBJECT(txb, machine), TXB_OBJECT(txb, permission)],
60
60
  })
61
61
  } else {
62
62
  txb.moveCall({
63
63
  target:PROTOCOL.ProgressFn('namedOperator_set') as FnCallType,
64
- arguments: [TXB_OBJECT(txb, progress), txb.pure(name), txb.pure(array_unique(addresses), 'vector<address>'),
64
+ arguments: [TXB_OBJECT(txb, progress), txb.pure(name, BCS.STRING), txb.pure(array_unique(addresses), 'vector<address>'),
65
65
  TXB_OBJECT(txb, machine), TXB_OBJECT(txb, permission)],
66
66
  })
67
67
  }
package/src/protocol.ts CHANGED
@@ -4,18 +4,19 @@ import { Ed25519Keypair } from '@mysten/sui.js/keypairs/ed25519';
4
4
  import { BCS, getSuiMoveConfig, toHEX, fromHEX, BcsReader } from '@mysten/bcs';
5
5
  import { TransactionBlock, Inputs, type TransactionResult, type TransactionArgument } from '@mysten/sui.js/transactions';
6
6
  import { capitalize } from './utils'
7
+ import { VariableType } from './guard';
7
8
 
8
9
  export const MAX_DESCRIPTION_LENGTH = 1024;
9
10
  export const MAX_NAME_LENGTH = 64;
10
11
  export const MAX_ENDPOINT_LENGTH = 1024;
11
12
  export const OptionNone = (txb:TransactionBlock) : TransactionArgument => { return txb.pure([], BCS.U8) };
12
13
 
13
- export const IsValidDesription = (description:string) : boolean => { return description.length <= MAX_DESCRIPTION_LENGTH }
14
- export const IsValidName = (name:string) : boolean => { return name.length <= MAX_NAME_LENGTH && name.length != 0 }
14
+ export const IsValidDesription = (description:string) : boolean => { if (!description) return false; return description.length <= MAX_DESCRIPTION_LENGTH }
15
+ export const IsValidName = (name:string) : boolean => { if(!name) return false; return name.length <= MAX_NAME_LENGTH && name.length != 0 }
15
16
  export const IsValidName_AllowEmpty = (name:string) : boolean => { return name.length <= MAX_NAME_LENGTH }
16
- export const IsValidEndpoint = (endpoint:string) : boolean => { return endpoint.length <= MAX_ENDPOINT_LENGTH }
17
- export const IsValidAddress = (address:string) : boolean => { return address.length != 0 }
18
- export const IsValidArgType = (argType: string) : boolean => { return argType.length != 0 }
17
+ export const IsValidEndpoint = (endpoint:string) : boolean => { if (!endpoint) return false; return endpoint.length <= MAX_ENDPOINT_LENGTH }
18
+ export const IsValidAddress = (addr:string) : boolean => { if (!addr) return false; return true}
19
+ export const IsValidArgType = (argType: string) : boolean => { if (!argType) return false; return argType.length != 0 }
19
20
  export const IsValidUint = (value: number) : boolean => { return Number.isSafeInteger(value) && value != 0 }
20
21
  export const IsValidInt = (value: number) : boolean => { return Number.isSafeInteger(value) }
21
22
  export const IsValidPercent = (value: number) : boolean => { return Number.isSafeInteger(value) && value > 0 && value <= 100 }
@@ -57,7 +58,7 @@ export type PermissionObject = TransactionResult | string;
57
58
  export type RepositoryAddress = TransactionResult;
58
59
  export type RepositoryObject = TransactionResult | string;
59
60
  export type GuardAddress = TransactionResult;
60
- export type GuardObject = TransactionResult | string;
61
+ export type GuardObject = TransactionResult | string ;
61
62
  export type MachineAddress = TransactionResult;
62
63
  export type MachineObject = TransactionResult | string;
63
64
  export type PassportObject = TransactionResult;
@@ -92,13 +93,51 @@ export const CLOCK_OBJECT = Inputs.SharedObjectRef({
92
93
  initialSharedVersion: 1,
93
94
  });
94
95
 
96
+ export enum OperatorType {
97
+ TYPE_QUERY = 1, // query wowok object
98
+ TYPE_FUTURE_QUERY = 2,
99
+ TYPE_QUERY_FROM_CONTEXT = 3,
100
+
101
+ TYPE_LOGIC_OPERATOR_U128_GREATER = 11,
102
+ TYPE_LOGIC_OPERATOR_U128_GREATER_EQUAL = 12,
103
+ TYPE_LOGIC_OPERATOR_U128_LESSER = 13,
104
+ TYPE_LOGIC_OPERATOR_U128_LESSER_EQUAL = 14,
105
+ TYPE_LOGIC_OPERATOR_U128_EQUAL = 15,
106
+ TYPE_LOGIC_OPERATOR_EQUAL = 16, // TYPE&DATA(vector<u8>) MUST BE EQUAL
107
+ TYPE_LOGIC_OPERATOR_HAS_SUBSTRING = 17, // SUBSTRING
108
+ TYPE_LOGIC_ALWAYS_TRUE = 18, // aways true
109
+ }
110
+
111
+ export enum ContextType {
112
+ TYPE_CONTEXT_SIGNER = 60,
113
+ TYPE_CONTEXT_CLOCK = 61,
114
+ TYPE_CONTEXT_FUTURE_ID = 62,
115
+
116
+ TYPE_CONTEXT_bool = 70,
117
+ TYPE_CONTEXT_address = 71,
118
+ TYPE_CONTEXT_u64 = 72,
119
+ TYPE_CONTEXT_u8 = 73,
120
+ TYPE_CONTEXT_vec_u8 = 74,
121
+ /* TYPE_CONTEXT_u128 = 75,
122
+ TYPE_CONTEXT_vec_address = 76,
123
+ TYPE_CONTEXT_vec_bool = 77,
124
+ TYPE_CONTEXT_vec_vec_u8 = 78,
125
+ TYPE_CONTEXT_vec_u64 = 79,
126
+ TYPE_CONTEXT_vec_u128 = 80,
127
+ TYPE_CONTEXT_option_address = 81,
128
+ TYPE_CONTEXT_option_bool = 82,
129
+ TYPE_CONTEXT_option_u8 = 83,
130
+ TYPE_CONTEXT_option_u64 = 84,
131
+ TYPE_CONTEXT_option_u128 = 85,*/
132
+ }
133
+
95
134
  export enum ValueType {
96
135
  TYPE_STATIC_bool = 100,
97
136
  TYPE_STATIC_address = 101,
98
137
  TYPE_STATIC_u64 = 102,
99
138
  TYPE_STATIC_u8 = 103,
100
- TYPE_STATIC_u128 = 104,
101
- TYPE_STATIC_vec_u8 = 105,
139
+ TYPE_STATIC_vec_u8 = 104,
140
+ TYPE_STATIC_u128 = 105,
102
141
  TYPE_STATIC_vec_address = 106,
103
142
  TYPE_STATIC_vec_bool = 107,
104
143
  TYPE_STATIC_vec_vec_u8 = 108,
@@ -111,26 +150,6 @@ export enum ValueType {
111
150
  TYPE_STATIC_option_u128 = 115,
112
151
  }
113
152
 
114
- export enum OperatorType {
115
- TYPE_DYNAMIC_QUERY = 1, // query wowok object
116
- TYPE_FUTURE_ORDER_DYNAMIC_QUERY = 2,
117
- TYPE_FUTURE_PROGRESS_DYNAMIC_QUERY = 3,
118
- TYPE_LOGIC_OPERATOR_U128_GREATER = 11,
119
- TYPE_LOGIC_OPERATOR_U128_GREATER_EQUAL = 12,
120
- TYPE_LOGIC_OPERATOR_U128_LESSER = 13,
121
- TYPE_LOGIC_OPERATOR_U128_LESSER_EQUAL = 14,
122
- TYPE_LOGIC_OPERATOR_U128_EQUAL = 15,
123
- TYPE_LOGIC_OPERATOR_EQUAL = 16, // TYPE&DATA(vector<u8>) MUST BE EQUAL
124
- TYPE_LOGIC_OPERATOR_HAS_SUBSTRING = 17, // SUBSTRING
125
- TYPE_LOGIC_ALWAYS_TRUE = 18, // aways true
126
- }
127
-
128
- export enum ContextType {
129
- TYPE_CONTEXT_SIGNER = 60,
130
- TYPE_CONTEXT_CLOCK = 61,
131
- TYPE_CONTEXT_FUTURE_ID = 62, // TYPE + MACHINE-ID or SERVICE-ID
132
- }
133
-
134
153
  export type Data_Type = ValueType | OperatorType | ContextType;
135
154
 
136
155
  export enum ENTRYPOINT {
@@ -161,7 +180,7 @@ export class Protocol {
161
180
  case ENTRYPOINT.devnet:
162
181
  break;
163
182
  case ENTRYPOINT.testnet:
164
- this.package = "0x0e4c1b57d596cda9a26a36567c79d94dffc8419e5be7ecf659ce4a7242abaeff";
183
+ this.package = "0xf4233055f40a9f301c85c020496b58ad761fdd2cd6a5d82da7a912adb4608f7f";
165
184
  this.everyone_guard = "0x78a41fcc4f566360839613f6b917fb101ae015e56b43143f496f265b6422fddc";
166
185
  this.graphql = 'https://sui-testnet.mystenlabs.com/graphql';
167
186
  break;
@@ -226,7 +245,8 @@ export class Protocol {
226
245
  const response = await client.signAndExecuteTransactionBlock({
227
246
  transactionBlock: txb,
228
247
  signer: keypair,
229
- options
248
+ options,
249
+
230
250
  });
231
251
  return response;
232
252
  }
@@ -235,7 +255,9 @@ export class Protocol {
235
255
  export type Query_Param = {
236
256
  objectid: string;
237
257
  callback: (response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions)=>void;
258
+ parser?: (result:any[], guardid: string, chain_sense_bsc:Uint8Array, variable?:VariableType) => boolean;
238
259
  data?: any; // response data filted by callback
260
+ variables?: VariableType;
239
261
  };
240
262
  export const PROTOCOL = new Protocol();
241
263
  export const SUI_TYPE = '0x2::coin::Coin<0x2::sui::SUI>';
package/src/utils.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { SuiTransactionBlockResponse, SuiObjectChange } from '@mysten/sui.js/client';
2
- import { bcs, BCS, toHEX, fromHEX, getSuiMoveConfig } from '@mysten/bcs';
2
+ import { bcs, BCS, toHEX, fromHEX, getSuiMoveConfig, TypeName, StructTypeDefinition } from '@mysten/bcs';
3
3
  import { PROTOCOL, MODULES, OBJECTS_TYPE } from './protocol';
4
4
 
5
5
  export const ulebDecode = (arr: number[] | Uint8Array) : {value: number, length: number} => {
@@ -97,6 +97,27 @@ export class Bcs {
97
97
  ser_vector_u64(data:number[]) : Uint8Array {
98
98
  return this.bcs.ser('vector<u64>', data).toBytes();
99
99
  }
100
+ ser_vector_u8(data:number[]) : Uint8Array {
101
+ return this.bcs.ser('vector<u8>', data).toBytes();
102
+ }
103
+ ser_address(data:string) : Uint8Array {
104
+ return this.bcs.ser(BCS.ADDRESS, data).toBytes();
105
+ }
106
+ ser_bool(data:boolean) : Uint8Array {
107
+ return this.bcs.ser(BCS.BOOL, data).toBytes();
108
+ }
109
+ ser_u8(data:number) : Uint8Array {
110
+ return this.bcs.ser(BCS.U8, data).toBytes();
111
+ }
112
+ ser_u64(data:number) : Uint8Array {
113
+ return this.bcs.ser(BCS.U64, data).toBytes();
114
+ }
115
+ ser_string(data:string) : Uint8Array {
116
+ return this.bcs.ser(BCS.STRING, data).toBytes();
117
+ }
118
+ de(type:TypeName | StructTypeDefinition, data:Uint8Array) {
119
+ return this.bcs.de(type, data)
120
+ }
100
121
  }
101
122
 
102
123
  export const BCS_CONVERT = new Bcs();
@@ -155,4 +176,29 @@ export function numToUint8Array(num:number) : Uint8Array {
155
176
  a.unshift(num & 255)
156
177
  }
157
178
  return new Uint8Array(a)
158
- }
179
+ }
180
+
181
+ // 判断是否为数组
182
+ export const isArr = (origin: any): boolean => {
183
+ let str = '[object Array]'
184
+ return Object.prototype.toString.call(origin) == str ? true : false
185
+ }
186
+
187
+
188
+ export const deepClone = <T>(origin: T, target?: Record<string, any> | T ): T => {
189
+ let tar = target || {}
190
+
191
+ for (const key in origin) {
192
+ if (Object.prototype.hasOwnProperty.call(origin, key)) {
193
+ if (typeof origin[key] === 'object' && origin[key] !== null) {
194
+ tar[key] = isArr(origin[key]) ? [] : {}
195
+ deepClone(origin[key], tar[key])
196
+ } else {
197
+ tar[key] = origin[key]
198
+ }
199
+
200
+ }
201
+ }
202
+
203
+ return tar as T
204
+ }