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/README.md +1 -1
- package/dist/demand.js +4 -4
- package/dist/guard.js +365 -66
- package/dist/index.js +2 -2
- package/dist/machine.js +2 -2
- package/dist/passport.js +47 -29
- package/dist/progress.js +2 -2
- package/dist/protocol.js +51 -30
- package/dist/service.js +4 -4
- package/dist/utils.js +44 -1
- package/package.json +3 -3
- package/src/demand.ts +4 -4
- package/src/guard.ts +361 -70
- package/src/index.ts +1 -1
- package/src/machine.ts +1 -2
- package/src/passport.ts +60 -37
- package/src/progress.ts +2 -2
- package/src/protocol.ts +52 -30
- package/src/utils.ts +48 -2
package/src/guard.ts
CHANGED
|
@@ -2,9 +2,11 @@ import { SuiObjectResponse, SuiObjectDataOptions, SuiParsedData } from '@mysten/
|
|
|
2
2
|
import { TransactionBlock, Inputs, type TransactionResult } from '@mysten/sui.js/transactions';
|
|
3
3
|
import { BCS, getSuiMoveConfig, toHEX, fromHEX, BcsReader } from '@mysten/bcs';
|
|
4
4
|
import { PROTOCOL, GuardAddress, FnCallType, Data_Type, MODULES, ContextType, OBJECTS_TYPE,
|
|
5
|
-
OBJECTS_TYPE_PREFIX, Query_Param, IsValidDesription, ValueType, OperatorType
|
|
5
|
+
OBJECTS_TYPE_PREFIX, Query_Param, IsValidDesription, ValueType, OperatorType,
|
|
6
|
+
IsValidInt,
|
|
7
|
+
IsValidAddress} from './protocol';
|
|
6
8
|
import { concatenate, array_equal, ulebDecode, array_unique } from './utils';
|
|
7
|
-
import { stringToUint8Array } from './utils';
|
|
9
|
+
import { stringToUint8Array, BCS_CONVERT } from './utils';
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
export const MAX_SENSE_COUNT = 16;
|
|
@@ -19,19 +21,145 @@ export type Guard_Sense = {
|
|
|
19
21
|
notAfterSense: boolean;
|
|
20
22
|
binder:Guard_Sense_Binder ;
|
|
21
23
|
};
|
|
24
|
+
export type VariableType = Map<number, Guard_Vriable>;
|
|
22
25
|
|
|
26
|
+
export type Guard_Vriable = {
|
|
27
|
+
type: ContextType | OperatorType,
|
|
28
|
+
value?: Uint8Array,
|
|
29
|
+
witness?: Uint8Array,
|
|
30
|
+
}
|
|
23
31
|
export type Guard_Creation = {
|
|
24
32
|
description: string;
|
|
33
|
+
variables?: VariableType;
|
|
25
34
|
senses: Guard_Sense[];
|
|
26
35
|
}
|
|
27
36
|
|
|
37
|
+
// de sense bsc => FutureValueRequest
|
|
38
|
+
export type FutureValueRequest = {
|
|
39
|
+
guardid: string;
|
|
40
|
+
identifier: number;
|
|
41
|
+
type: ContextType | OperatorType,
|
|
42
|
+
witness: string,
|
|
43
|
+
value?: string, // future object address
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
export const IsValidGuardVirableType = (type:OperatorType | ContextType) : boolean => {
|
|
48
|
+
if (type == OperatorType.TYPE_FUTURE_QUERY || type == ContextType.TYPE_CONTEXT_FUTURE_ID || type == OperatorType.TYPE_QUERY_FROM_CONTEXT ||
|
|
49
|
+
type == ContextType.TYPE_CONTEXT_bool || type ==ContextType.TYPE_CONTEXT_address || type == ContextType.TYPE_CONTEXT_u64 ||
|
|
50
|
+
type == ContextType.TYPE_CONTEXT_u8 || type == ContextType.TYPE_CONTEXT_vec_u8) {
|
|
51
|
+
return true;
|
|
52
|
+
};
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
export const IsValidIndentifier = (identifier:number) : boolean => {
|
|
56
|
+
if (!IsValidInt(identifier) || identifier > 255) return false;
|
|
57
|
+
return true
|
|
58
|
+
}
|
|
59
|
+
/*
|
|
60
|
+
// called by de-guard or passport
|
|
61
|
+
export function set_futrue_value(variables:VariableType, identifier:number, type:OperatorType | ContextType, value?:any) : boolean {
|
|
62
|
+
if (!IsValidIndentifier(identifier)) return false;
|
|
63
|
+
if (!IsValidGuardVirableType(type)) return false;
|
|
64
|
+
let v = variables.get(identifier);
|
|
65
|
+
if (v) {
|
|
66
|
+
v.value = BCS_CONVERT.ser_address(value);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
} */
|
|
71
|
+
export function get_variable_value(variables:VariableType, identifier:number, type:OperatorType | ContextType) : Uint8Array | boolean {
|
|
72
|
+
if (variables.has(identifier)) {
|
|
73
|
+
let v = variables.get(identifier);
|
|
74
|
+
if (v?.value && v.type == type) {
|
|
75
|
+
return v.value;
|
|
76
|
+
}
|
|
77
|
+
} return false;
|
|
78
|
+
}
|
|
79
|
+
export function get_variable_witness(variables:VariableType, identifier:number, type:OperatorType | ContextType) : Uint8Array | boolean {
|
|
80
|
+
if (variables.has(identifier)) {
|
|
81
|
+
let v = variables.get(identifier);
|
|
82
|
+
if (v?.witness && v.type == type) {
|
|
83
|
+
return v.witness;
|
|
84
|
+
}
|
|
85
|
+
} return false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function add_future_variable(variables:VariableType, identifier:number, type:OperatorType | ContextType,
|
|
89
|
+
witness:any, value?:any, bNeedSerialize=true) : boolean {
|
|
90
|
+
if (!IsValidIndentifier(identifier)) return false;
|
|
91
|
+
if (!IsValidGuardVirableType(type)) return false;
|
|
92
|
+
if (!witness && !value) return false;
|
|
93
|
+
|
|
94
|
+
switch (type) {
|
|
95
|
+
case OperatorType.TYPE_FUTURE_QUERY :
|
|
96
|
+
case ContextType.TYPE_CONTEXT_FUTURE_ID :
|
|
97
|
+
if (variables.has(identifier)) {
|
|
98
|
+
let v = (variables.get(identifier) as Guard_Vriable);
|
|
99
|
+
if (bNeedSerialize) {
|
|
100
|
+
v.value = value ? BCS_CONVERT.ser_address(value) : undefined;
|
|
101
|
+
v.witness = witness ? BCS_CONVERT.ser_address(witness) : undefined;
|
|
102
|
+
} else {
|
|
103
|
+
v.value = value ? value : undefined;
|
|
104
|
+
v.witness = witness ? witness : undefined;
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
if (bNeedSerialize) {
|
|
108
|
+
variables.set(identifier, {type:type, value:value ? BCS_CONVERT.ser_address(value) : undefined, witness:witness ? BCS_CONVERT.ser_address(witness) : undefined})
|
|
109
|
+
} else {
|
|
110
|
+
variables.set(identifier, {type:type, value:value?value:undefined, witness:witness?witness:undefined});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function add_variable(variables:VariableType, identifier:number, type:OperatorType | ContextType,
|
|
119
|
+
value:any, bNeedSerialize=true) : boolean {
|
|
120
|
+
if (!IsValidIndentifier(identifier)) return false;
|
|
121
|
+
if (!IsValidGuardVirableType(type)) return false;
|
|
122
|
+
if (!value) return false;
|
|
123
|
+
|
|
124
|
+
switch (type) {
|
|
125
|
+
case ContextType.TYPE_CONTEXT_bool:
|
|
126
|
+
bNeedSerialize ? variables.set(identifier, {type:type, value:BCS_CONVERT.ser_bool(value)}) :
|
|
127
|
+
variables.set(identifier, {type:type, value:value})
|
|
128
|
+
return true;
|
|
129
|
+
case ContextType.TYPE_CONTEXT_address:
|
|
130
|
+
case OperatorType.TYPE_QUERY_FROM_CONTEXT:
|
|
131
|
+
bNeedSerialize ? variables.set(identifier, {type:type, value:BCS_CONVERT.ser_address(value)}):
|
|
132
|
+
variables.set(identifier, {type:type, value:value});
|
|
133
|
+
return true;
|
|
134
|
+
case ContextType.TYPE_CONTEXT_u64:
|
|
135
|
+
bNeedSerialize ? variables.set(identifier, {type:type, value:BCS_CONVERT.ser_u64(value)}) :
|
|
136
|
+
variables.set(identifier, {type:type, value:value})
|
|
137
|
+
return true;
|
|
138
|
+
case ContextType.TYPE_CONTEXT_u8:
|
|
139
|
+
bNeedSerialize ? variables.set(identifier, {type:type, value:BCS_CONVERT.ser_u8(value)}) :
|
|
140
|
+
variables.set(identifier, {type:type, value:value})
|
|
141
|
+
return true;
|
|
142
|
+
case ContextType.TYPE_CONTEXT_vec_u8:
|
|
143
|
+
bNeedSerialize ? variables.set(identifier, {type:type, value:BCS_CONVERT.ser_string(value)}) :
|
|
144
|
+
variables.set(identifier, {type:type, value:value})
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
|
|
28
150
|
export function launch(txb:TransactionBlock, creation:Guard_Creation) : GuardAddress | boolean {
|
|
29
151
|
if (!IsValidDesription(creation.description)) return false;
|
|
30
152
|
if (!creation.senses) return false;
|
|
153
|
+
|
|
31
154
|
let bValid = true;
|
|
32
155
|
creation.senses.forEach((v) => {
|
|
33
156
|
if (!v.input || v.input.length == 0) bValid = false;
|
|
34
157
|
})
|
|
158
|
+
creation?.variables?.forEach((v, k) => {
|
|
159
|
+
if (!IsValidIndentifier(k)) bValid = false;
|
|
160
|
+
if (!IsValidGuardVirableType(v.type)) bValid = false;
|
|
161
|
+
if (!v.value && !v.witness) bValid = false;
|
|
162
|
+
})
|
|
35
163
|
if (!bValid) return false;
|
|
36
164
|
|
|
37
165
|
let guard = txb.moveCall({
|
|
@@ -47,6 +175,23 @@ export function launch(txb:TransactionBlock, creation:Guard_Creation) : GuardAdd
|
|
|
47
175
|
]
|
|
48
176
|
})
|
|
49
177
|
});
|
|
178
|
+
creation?.variables?.forEach((v, k) => {
|
|
179
|
+
if (v.type == OperatorType.TYPE_FUTURE_QUERY || v.type == ContextType.TYPE_CONTEXT_FUTURE_ID) {
|
|
180
|
+
if (!v.witness) return false;
|
|
181
|
+
txb.moveCall({
|
|
182
|
+
target:PROTOCOL.GuardFn("variable_add") as FnCallType,
|
|
183
|
+
arguments:[guard, txb.pure(k, BCS.U8), txb.pure(v.type, BCS.U8), txb.pure([].slice.call(v.witness)), txb.pure(true, BCS.BOOL)]
|
|
184
|
+
})
|
|
185
|
+
} else {
|
|
186
|
+
if (!v.value) return false;
|
|
187
|
+
|
|
188
|
+
txb.moveCall({
|
|
189
|
+
target:PROTOCOL.GuardFn("variable_add") as FnCallType,
|
|
190
|
+
arguments:[guard, txb.pure(k, BCS.U8), txb.pure(v.type, BCS.U8), txb.pure([].slice.call(v.value)), txb.pure(true, BCS.BOOL)]
|
|
191
|
+
})
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
|
|
50
195
|
return txb.moveCall({
|
|
51
196
|
target:PROTOCOL.GuardFn("create") as FnCallType,
|
|
52
197
|
arguments:[guard]
|
|
@@ -206,51 +351,80 @@ export const QUERIES:any = [
|
|
|
206
351
|
export class SenseMaker {
|
|
207
352
|
protected data : Uint8Array[] = [];
|
|
208
353
|
protected type_validator : Data_Type[] = [];
|
|
209
|
-
|
|
210
354
|
constructor() { }
|
|
355
|
+
|
|
211
356
|
// serialize const & data
|
|
212
|
-
add_param(type:ValueType | ContextType, param?:any) : boolean {
|
|
213
|
-
const bcs = new BCS(getSuiMoveConfig());
|
|
357
|
+
add_param(type:ValueType | ContextType, param?:any, variable?:VariableType) : boolean {
|
|
214
358
|
switch(type) {
|
|
215
359
|
case ValueType.TYPE_STATIC_address:
|
|
216
|
-
|
|
217
|
-
this.data.push(
|
|
360
|
+
if (!param) return false
|
|
361
|
+
this.data.push(BCS_CONVERT.ser_u8(type));
|
|
362
|
+
this.data.push(BCS_CONVERT.ser_address(param));
|
|
218
363
|
this.type_validator.push(type);
|
|
219
364
|
break;
|
|
220
365
|
case ValueType.TYPE_STATIC_bool:
|
|
221
|
-
|
|
222
|
-
this.data.push(
|
|
366
|
+
if (!param) return false
|
|
367
|
+
this.data.push(BCS_CONVERT.ser_u8(type));
|
|
368
|
+
this.data.push(BCS_CONVERT.ser_bool(param));
|
|
223
369
|
this.type_validator.push(type);
|
|
224
370
|
break;
|
|
225
371
|
case ValueType.TYPE_STATIC_u8:
|
|
226
|
-
|
|
227
|
-
this.data.push(
|
|
372
|
+
if (!param) return false
|
|
373
|
+
this.data.push(BCS_CONVERT.ser_u8(type));
|
|
374
|
+
this.data.push(BCS_CONVERT.ser_u8(param));
|
|
228
375
|
this.type_validator.push(type);
|
|
229
376
|
break;
|
|
230
377
|
case ValueType.TYPE_STATIC_u64:
|
|
231
|
-
|
|
232
|
-
this.data.push(
|
|
378
|
+
if (!param) return false
|
|
379
|
+
this.data.push(BCS_CONVERT.ser_u8(type));
|
|
380
|
+
this.data.push(BCS_CONVERT.ser_u64(param));
|
|
233
381
|
this.type_validator.push(type);
|
|
234
382
|
break;
|
|
235
383
|
case ValueType.TYPE_STATIC_vec_u8:
|
|
236
|
-
|
|
237
|
-
this.data.push(
|
|
384
|
+
if (!param) return false
|
|
385
|
+
this.data.push(BCS_CONVERT.ser_u8(type));
|
|
386
|
+
this.data.push(BCS_CONVERT.ser_string(param));
|
|
238
387
|
this.type_validator.push(type);
|
|
239
388
|
// this.data[this.data.length-1].forEach((item : number) => console.log(item))
|
|
240
389
|
break;
|
|
241
390
|
case ContextType.TYPE_CONTEXT_SIGNER:
|
|
242
|
-
this.data.push(
|
|
391
|
+
this.data.push(BCS_CONVERT.ser_u8(type));
|
|
243
392
|
this.type_validator.push(ValueType.TYPE_STATIC_address);
|
|
244
393
|
break;
|
|
245
394
|
case ContextType.TYPE_CONTEXT_CLOCK:
|
|
246
|
-
this.data.push(
|
|
395
|
+
this.data.push(BCS_CONVERT.ser_u8(type));
|
|
247
396
|
this.type_validator.push(ValueType.TYPE_STATIC_u64);
|
|
248
397
|
break;
|
|
398
|
+
case ContextType.TYPE_CONTEXT_bool:
|
|
399
|
+
case ContextType.TYPE_CONTEXT_u8:
|
|
400
|
+
case ContextType.TYPE_CONTEXT_u64:
|
|
401
|
+
case ContextType.TYPE_CONTEXT_vec_u8:
|
|
402
|
+
case ContextType.TYPE_CONTEXT_address:
|
|
249
403
|
case ContextType.TYPE_CONTEXT_FUTURE_ID:
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
404
|
+
if (!variable || !param) return false;
|
|
405
|
+
if (typeof(param) != 'number') return false;
|
|
406
|
+
if (!IsValidInt(param) || param > 255) return false;
|
|
407
|
+
|
|
408
|
+
var v = variable.get(param);
|
|
409
|
+
if (v?.type == type) {
|
|
410
|
+
this.data.push(BCS_CONVERT.ser_u8(type));
|
|
411
|
+
this.data.push(BCS_CONVERT.ser_u8(param));
|
|
412
|
+
if (type == ContextType.TYPE_CONTEXT_bool) {
|
|
413
|
+
this.type_validator.push(ValueType.TYPE_STATIC_bool);
|
|
414
|
+
} else if (type == ContextType.TYPE_CONTEXT_u8) {
|
|
415
|
+
this.type_validator.push(ValueType.TYPE_STATIC_u8);
|
|
416
|
+
} else if (type == ContextType.TYPE_CONTEXT_u64) {
|
|
417
|
+
this.type_validator.push(ValueType.TYPE_STATIC_u64);
|
|
418
|
+
} else if (type == ContextType.TYPE_CONTEXT_vec_u8) {
|
|
419
|
+
this.type_validator.push(ValueType.TYPE_STATIC_vec_u8);
|
|
420
|
+
} else if (type == ContextType.TYPE_CONTEXT_address) {
|
|
421
|
+
this.type_validator.push(ValueType.TYPE_STATIC_address);
|
|
422
|
+
} else if (type == ContextType.TYPE_CONTEXT_FUTURE_ID) {
|
|
423
|
+
this.type_validator.push(ValueType.TYPE_STATIC_address);
|
|
424
|
+
}
|
|
425
|
+
break;
|
|
426
|
+
};
|
|
427
|
+
return false;
|
|
254
428
|
default:
|
|
255
429
|
return false;
|
|
256
430
|
};
|
|
@@ -265,14 +439,41 @@ export class SenseMaker {
|
|
|
265
439
|
}
|
|
266
440
|
return -1;
|
|
267
441
|
}
|
|
268
|
-
|
|
269
|
-
// TYPE_FUTURE_ORDER_DYNAMIC_QUERY: object_address: service/machine id; module:order/progress
|
|
270
|
-
add_query(type:OperatorType, object_address:string, module:MODULES, query_name:string) : boolean {
|
|
442
|
+
add_future_query(identifier:number, module:MODULES, query_name:string, variable:VariableType) : boolean {
|
|
271
443
|
let query_index = this.query_index(module, query_name);
|
|
272
|
-
if (!
|
|
273
|
-
|
|
274
|
-
if (
|
|
275
|
-
|
|
444
|
+
if (!IsValidIndentifier(identifier) || query_index == -1) return false;
|
|
445
|
+
if (module != MODULES.order && module != MODULES.progress) return false;
|
|
446
|
+
if (!variable || variable.get(identifier)?.type != OperatorType.TYPE_FUTURE_QUERY) return false;
|
|
447
|
+
|
|
448
|
+
let offset = this.type_validator.length - QUERIES[query_index][3].length;
|
|
449
|
+
if (offset < 0) {
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
let types = this.type_validator.slice(offset);
|
|
454
|
+
if (!array_equal(types, QUERIES[query_index][3])) { // type validate
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
this.data.push(BCS_CONVERT.ser_u8(OperatorType.TYPE_FUTURE_QUERY)); // TYPE
|
|
459
|
+
this.data.push(BCS_CONVERT.ser_u8(identifier)); // variable identifier
|
|
460
|
+
this.data.push(BCS_CONVERT.ser_u8(QUERIES[query_index][2])); // cmd
|
|
461
|
+
|
|
462
|
+
this.type_validator.splice(offset, QUERIES[query_index][3].length); // delete type stack
|
|
463
|
+
this.type_validator.push(QUERIES[query_index][4]); // add the return value type to type stack
|
|
464
|
+
// console.log(this.type_validator)
|
|
465
|
+
return true;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// object_address_from: string for static address; number as identifier for variable
|
|
469
|
+
add_query(module:MODULES, query_name:string, object_address_from:string | number) : boolean {
|
|
470
|
+
let query_index = this.query_index(module, query_name); // query_index: index(from 0) of array QUERIES
|
|
471
|
+
if (query_index == -1) return false;
|
|
472
|
+
if (typeof(object_address_from) == 'number') {
|
|
473
|
+
if (!IsValidIndentifier(object_address_from)) return false;
|
|
474
|
+
} else {
|
|
475
|
+
if (!IsValidAddress(object_address_from)) return false;
|
|
476
|
+
}
|
|
276
477
|
|
|
277
478
|
let offset = this.type_validator.length - QUERIES[query_index][3].length;
|
|
278
479
|
if (offset < 0) {
|
|
@@ -284,16 +485,22 @@ export class SenseMaker {
|
|
|
284
485
|
return false;
|
|
285
486
|
}
|
|
286
487
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
488
|
+
if (typeof(object_address_from) == 'string') {
|
|
489
|
+
this.data.push(BCS_CONVERT.ser_u8(OperatorType.TYPE_QUERY));// TYPE
|
|
490
|
+
this.data.push(BCS_CONVERT.ser_address(object_address_from)); // object address
|
|
491
|
+
} else {
|
|
492
|
+
this.data.push(BCS_CONVERT.ser_u8(OperatorType.TYPE_QUERY_FROM_CONTEXT));// TYPE
|
|
493
|
+
this.data.push(BCS_CONVERT.ser_u8(object_address_from)); // object identifer in variables
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
this.data.push(BCS_CONVERT.ser_u8(QUERIES[query_index][2])); // cmd
|
|
291
497
|
|
|
292
498
|
this.type_validator.splice(offset, QUERIES[query_index][3].length); // delete type stack
|
|
293
499
|
this.type_validator.push(QUERIES[query_index][4]); // add the return value type to type stack
|
|
294
500
|
// console.log(this.type_validator)
|
|
295
501
|
return true;
|
|
296
502
|
}
|
|
503
|
+
|
|
297
504
|
add_logic(type:OperatorType) : boolean {
|
|
298
505
|
switch (type) {
|
|
299
506
|
case OperatorType.TYPE_LOGIC_OPERATOR_U128_GREATER:
|
|
@@ -312,8 +519,7 @@ export class SenseMaker {
|
|
|
312
519
|
default:
|
|
313
520
|
return false;
|
|
314
521
|
}
|
|
315
|
-
|
|
316
|
-
this.data.push(bcs.ser(BCS.U8, type).toBytes()); // TYPE
|
|
522
|
+
this.data.push(BCS_CONVERT.ser_u8(type)); // TYPE
|
|
317
523
|
this.type_validator.splice(this.type_validator.length - 2); // delete type stack
|
|
318
524
|
this.type_validator.push(ValueType.TYPE_STATIC_bool); // add bool to type stack
|
|
319
525
|
return true;
|
|
@@ -323,7 +529,7 @@ export class SenseMaker {
|
|
|
323
529
|
//console.log(this.type_validator);
|
|
324
530
|
//this.data.forEach((value:Uint8Array) => console.log(value));
|
|
325
531
|
if (this.type_validator.length != 1 || this.type_validator[0] != ValueType.TYPE_STATIC_bool) {
|
|
326
|
-
|
|
532
|
+
console.log(this.type_validator)
|
|
327
533
|
return false;
|
|
328
534
|
} // ERROR
|
|
329
535
|
|
|
@@ -342,22 +548,84 @@ function match_u128(type:number) : boolean {
|
|
|
342
548
|
return false;
|
|
343
549
|
}
|
|
344
550
|
|
|
345
|
-
export function parse_graphql_senses(senses:any) : string[] {
|
|
551
|
+
export function parse_graphql_senses(guardid:string, senses:any) : string[] {
|
|
346
552
|
let objects:string[] = [];
|
|
347
553
|
senses.forEach((s:any) => {
|
|
348
|
-
let res = parse_sense_bsc(Uint8Array.from(s.input.bytes));
|
|
349
|
-
if (res) {
|
|
350
|
-
objects = objects.concat(res as string[]);
|
|
351
|
-
}
|
|
554
|
+
let res = parse_sense_bsc(objects, guardid, Uint8Array.from(s.input.bytes));
|
|
352
555
|
});
|
|
353
|
-
return
|
|
556
|
+
return objects;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
export function parse_futures(result:any[], guardid: string, chain_sense_bsc:Uint8Array, variable?:VariableType) : boolean {
|
|
560
|
+
var arr = [].slice.call(chain_sense_bsc.reverse());
|
|
561
|
+
while (arr.length > 0) {
|
|
562
|
+
var type : unknown = arr.shift() ;
|
|
563
|
+
// console.log(type);
|
|
564
|
+
switch (type as Data_Type) {
|
|
565
|
+
case ContextType.TYPE_CONTEXT_SIGNER:
|
|
566
|
+
case ContextType.TYPE_CONTEXT_CLOCK:
|
|
567
|
+
case OperatorType.TYPE_LOGIC_OPERATOR_U128_GREATER:
|
|
568
|
+
case OperatorType.TYPE_LOGIC_OPERATOR_U128_GREATER_EQUAL:
|
|
569
|
+
case OperatorType.TYPE_LOGIC_OPERATOR_U128_LESSER:
|
|
570
|
+
case OperatorType.TYPE_LOGIC_OPERATOR_U128_LESSER_EQUAL:
|
|
571
|
+
case OperatorType.TYPE_LOGIC_OPERATOR_U128_EQUAL:
|
|
572
|
+
case OperatorType.TYPE_LOGIC_OPERATOR_EQUAL:
|
|
573
|
+
case OperatorType.TYPE_LOGIC_OPERATOR_HAS_SUBSTRING:
|
|
574
|
+
case OperatorType.TYPE_LOGIC_ALWAYS_TRUE:
|
|
575
|
+
break;
|
|
576
|
+
case ContextType.TYPE_CONTEXT_FUTURE_ID: // MACHINE-ID
|
|
577
|
+
case OperatorType.TYPE_FUTURE_QUERY:
|
|
578
|
+
var identifer = arr.splice(0, 1);
|
|
579
|
+
if (type == OperatorType.TYPE_FUTURE_QUERY) {
|
|
580
|
+
arr.splice(0, 1); // cmd
|
|
581
|
+
}
|
|
582
|
+
if (!variable || variable?.get(identifer[0])?.type != type) return false;
|
|
583
|
+
|
|
584
|
+
let witness = get_variable_witness(variable, identifer[0], type as OperatorType) ;
|
|
585
|
+
if (!witness) return false;
|
|
586
|
+
result.push({guardid:guardid, identifier:identifer[0], type:type,
|
|
587
|
+
witness:'0x' + BCS_CONVERT.de(BCS.ADDRESS, Uint8Array.from(witness as Uint8Array))} as FutureValueRequest);
|
|
588
|
+
break;
|
|
589
|
+
case ContextType.TYPE_CONTEXT_address:
|
|
590
|
+
case ContextType.TYPE_CONTEXT_bool:
|
|
591
|
+
case ContextType.TYPE_CONTEXT_u8:
|
|
592
|
+
case ContextType.TYPE_CONTEXT_u64:
|
|
593
|
+
case ContextType.TYPE_CONTEXT_vec_u8:
|
|
594
|
+
case ValueType.TYPE_STATIC_bool:
|
|
595
|
+
case ValueType.TYPE_STATIC_u8:
|
|
596
|
+
arr.splice(0, 1); // identifier
|
|
597
|
+
break;
|
|
598
|
+
case OperatorType.TYPE_QUERY_FROM_CONTEXT:
|
|
599
|
+
arr.splice(0, 2); // identifer + cmd
|
|
600
|
+
case ValueType.TYPE_STATIC_address:
|
|
601
|
+
arr.splice(0, 32);
|
|
602
|
+
break;
|
|
603
|
+
case ValueType.TYPE_STATIC_u64:
|
|
604
|
+
arr.splice(0, 8);
|
|
605
|
+
break;
|
|
606
|
+
case ValueType.TYPE_STATIC_u128:
|
|
607
|
+
arr.splice(0, 16);
|
|
608
|
+
break;
|
|
609
|
+
case ValueType.TYPE_STATIC_vec_u8:
|
|
610
|
+
let {value, length} = ulebDecode(Uint8Array.from(arr));
|
|
611
|
+
arr.splice(0, value+length);
|
|
612
|
+
break;
|
|
613
|
+
case OperatorType.TYPE_QUERY:
|
|
614
|
+
arr.splice(0, 33); // address + cmd
|
|
615
|
+
break;
|
|
616
|
+
default:
|
|
617
|
+
console.error('parse_sense_bsc:undefined');
|
|
618
|
+
console.log(type as number)
|
|
619
|
+
console.log(arr)
|
|
620
|
+
return false; // error
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
return true;
|
|
354
624
|
}
|
|
355
625
|
|
|
356
626
|
// parse guard senses input bytes of a guard, return [objectids] for 'query_cmd'
|
|
357
|
-
export function parse_sense_bsc(
|
|
627
|
+
export function parse_sense_bsc(result:any[], guardid: string, chain_sense_bsc:Uint8Array, variable?:VariableType) : boolean {
|
|
358
628
|
var arr = [].slice.call(chain_sense_bsc.reverse());
|
|
359
|
-
const bcs = new BCS(getSuiMoveConfig());
|
|
360
|
-
var result = [];
|
|
361
629
|
|
|
362
630
|
while (arr.length > 0) {
|
|
363
631
|
var type : unknown = arr.shift() ;
|
|
@@ -375,7 +643,15 @@ export function parse_sense_bsc(chain_sense_bsc:Uint8Array, future_order?:string
|
|
|
375
643
|
case OperatorType.TYPE_LOGIC_ALWAYS_TRUE:
|
|
376
644
|
break;
|
|
377
645
|
case ContextType.TYPE_CONTEXT_FUTURE_ID: // MACHINE-ID
|
|
378
|
-
arr.splice(0,
|
|
646
|
+
var v = arr.splice(0, 1);
|
|
647
|
+
if (!variable || variable?.get(v[0])?.type != type) return false;
|
|
648
|
+
break;
|
|
649
|
+
case ContextType.TYPE_CONTEXT_address:
|
|
650
|
+
case ContextType.TYPE_CONTEXT_bool:
|
|
651
|
+
case ContextType.TYPE_CONTEXT_u8:
|
|
652
|
+
case ContextType.TYPE_CONTEXT_u64:
|
|
653
|
+
case ContextType.TYPE_CONTEXT_vec_u8:
|
|
654
|
+
arr.splice(0, 1); // identifier
|
|
379
655
|
break;
|
|
380
656
|
case ValueType.TYPE_STATIC_address:
|
|
381
657
|
//console.log('0x' + bcs.de(BCS.ADDRESS, Uint8Array.from(array)).toString());
|
|
@@ -395,28 +671,21 @@ export function parse_sense_bsc(chain_sense_bsc:Uint8Array, future_order?:string
|
|
|
395
671
|
let {value, length} = ulebDecode(Uint8Array.from(arr));
|
|
396
672
|
arr.splice(0, value+length);
|
|
397
673
|
break;
|
|
398
|
-
case OperatorType.
|
|
399
|
-
result.push('0x' +
|
|
674
|
+
case OperatorType.TYPE_QUERY:
|
|
675
|
+
result.push('0x' + BCS_CONVERT.de(BCS.ADDRESS, Uint8Array.from(arr)).toString());
|
|
400
676
|
arr.splice(0, 33); // address + cmd
|
|
401
677
|
break;
|
|
402
|
-
case OperatorType.
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
console.error('OperatorType.TYPE_FUTURE_ORDER_DYNAMIC_QUERY need object');
|
|
414
|
-
console.log(arr)
|
|
415
|
-
return false; // error
|
|
416
|
-
}
|
|
417
|
-
result.push(future_order!.shift() as string)
|
|
418
|
-
arr.splice(0, 33)
|
|
419
|
-
break;
|
|
678
|
+
case OperatorType.TYPE_QUERY_FROM_CONTEXT:
|
|
679
|
+
case OperatorType.TYPE_FUTURE_QUERY:
|
|
680
|
+
var identifer = arr.splice(0, 1);
|
|
681
|
+
if (variable) {
|
|
682
|
+
let v = get_variable_value(variable, identifer[0], type as OperatorType) ;
|
|
683
|
+
if (v) {
|
|
684
|
+
result.push('0x' + BCS_CONVERT.de(BCS.ADDRESS, Uint8Array.from(v as Uint8Array)).toString());
|
|
685
|
+
arr.splice(0, 1); // splice cmd
|
|
686
|
+
break;
|
|
687
|
+
}
|
|
688
|
+
}; return false
|
|
420
689
|
default:
|
|
421
690
|
console.error('parse_sense_bsc:undefined');
|
|
422
691
|
console.log(type as number)
|
|
@@ -424,7 +693,7 @@ export function parse_sense_bsc(chain_sense_bsc:Uint8Array, future_order?:string
|
|
|
424
693
|
return false; // error
|
|
425
694
|
}
|
|
426
695
|
}
|
|
427
|
-
return
|
|
696
|
+
return true;
|
|
428
697
|
}
|
|
429
698
|
|
|
430
699
|
export const rpc_description_fn = (response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions) => {
|
|
@@ -440,18 +709,40 @@ export const rpc_description_fn = (response:SuiObjectResponse, param:Query_Param
|
|
|
440
709
|
}
|
|
441
710
|
}
|
|
442
711
|
|
|
712
|
+
|
|
443
713
|
export const rpc_sense_objects_fn = (response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions) => {
|
|
444
714
|
if (!response.error) {
|
|
445
715
|
let c = response?.data?.content as any;
|
|
446
716
|
let index = OBJECTS_TYPE().findIndex(v => v.includes('guard::Guard') && v == c.type);
|
|
447
717
|
if (index >= 0 && c.fields.id.id == param.objectid) { // GUARD OBJECT
|
|
718
|
+
if (!param?.variables) {
|
|
719
|
+
let v = new Map<number, Guard_Vriable>();
|
|
720
|
+
for (let i = 0; i < c.fields.variables.length; i ++) {
|
|
721
|
+
let variable = c.fields.variables[i]; let bret ;
|
|
722
|
+
if (variable.type == (OBJECTS_TYPE_PREFIX()[index] + 'Variable')) { // ...::guard::Variable
|
|
723
|
+
if (variable.fields.type == OperatorType.TYPE_FUTURE_QUERY || variable.fields.type == ContextType.TYPE_CONTEXT_FUTURE_ID) {
|
|
724
|
+
bret = add_future_variable(v, variable.fields.identifier, variable.fields.type,
|
|
725
|
+
variable.fields?.value?Uint8Array.from(variable.fields.value):undefined, undefined, false);
|
|
726
|
+
} else {
|
|
727
|
+
bret = add_variable(v, variable.fields.identifier, variable.fields.type,
|
|
728
|
+
variable.fields?.value?Uint8Array.from(variable.fields.value):undefined, false);
|
|
729
|
+
}
|
|
730
|
+
if (!bret) {
|
|
731
|
+
console.log('rpc_sense_objects_fn add_variable error');
|
|
732
|
+
console.log(variable);
|
|
733
|
+
return ;
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
param.variables = v;
|
|
738
|
+
}
|
|
739
|
+
|
|
448
740
|
for (let i = 0; i < c.fields.senses.length; i ++) {
|
|
449
741
|
let sense = c.fields.senses[i];
|
|
450
742
|
if (sense.type == (OBJECTS_TYPE_PREFIX()[index] + 'Sense')) { // ...::guard::Sense
|
|
451
|
-
let
|
|
452
|
-
if (
|
|
453
|
-
|
|
454
|
-
param.data = param.data.concat(ids); // DONT array_unique senses
|
|
743
|
+
let result : any[] = [];
|
|
744
|
+
if (param?.parser && param.parser(result, param.objectid, Uint8Array.from(sense.fields.input.fields.bytes), param.variables)) {
|
|
745
|
+
param.data = param.data.concat(result); // DONT array_unique senses
|
|
455
746
|
}
|
|
456
747
|
}
|
|
457
748
|
}
|
package/src/index.ts
CHANGED
|
@@ -7,7 +7,7 @@ export { demand, demand_expand_time, demand_refund, demand_set_description, dema
|
|
|
7
7
|
export { machine, machine_add_node, machine_add_node2, machine_add_repository, machine_clone, machine_pause, machine_publish,
|
|
8
8
|
machine_remove_node, machine_remove_repository, machine_set_description, machine_set_endpoint, MachineNodeObject, Machine_Forward,
|
|
9
9
|
Machine_Node, Machine_Node_Pair, launch as machine_launch, destroy as machine_destroy, change_permission as machine_change_permission,
|
|
10
|
-
INITIAL_NODE_NAME,
|
|
10
|
+
INITIAL_NODE_NAME, OPERATOR_ORDER_PAYER } from './machine'
|
|
11
11
|
export { progress, ProgressNext, ParentProgress, progress_bind_task, progress_parent, progress_set_context_repository, progress_unhold,
|
|
12
12
|
hold, progress_set_namedOperator, MAX_NAMED_OPERATOR_COUNT, next } from './progress'
|
|
13
13
|
export { service, service_add_refund_guards, service_add_sale, service_add_stock, service_add_withdraw_guards, service_clone,
|
package/src/machine.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { IsValidPermissionIndex, PermissionIndexType } from './permission';
|
|
|
9
9
|
|
|
10
10
|
export type MachineNodeObject = TransactionResult | String;
|
|
11
11
|
export const INITIAL_NODE_NAME = '';
|
|
12
|
-
export const
|
|
12
|
+
export const OPERATOR_ORDER_PAYER = 'order payer';
|
|
13
13
|
|
|
14
14
|
export type Machine_Forward = {
|
|
15
15
|
name: string; // foward name
|
|
@@ -36,7 +36,6 @@ export function machine_add_node(txb:TransactionBlock, machine:MachineObject, pe
|
|
|
36
36
|
let bValid = true;
|
|
37
37
|
nodes.forEach((node) => {
|
|
38
38
|
if (!IsValidDesription(node.description) || !IsValidName(node.name)) { bValid = false; }
|
|
39
|
-
|
|
40
39
|
node.pairs.forEach((p) => {
|
|
41
40
|
if (!IsValidName_AllowEmpty(p.prior_node)) { bValid = false; }
|
|
42
41
|
if (p?.threshold && !IsValidInt(p.threshold)) { bValid = false; }
|