wowok 1.0.4 → 1.0.5
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/dist/guard.js +136 -16
- package/dist/machine.js +1 -1
- package/dist/permission.js +8 -2
- package/dist/protocol.js +4 -4
- package/dist/repository.js +21 -5
- package/dist/util.js +10 -1
- package/package.json +9 -4
- package/src/demand.ts +2 -2
- package/src/graphql.ts +103 -0
- package/src/guard.ts +190 -42
- package/src/index.ts +12 -0
- package/src/machine.ts +18 -12
- package/src/passport.ts +62 -25
- package/src/permission.ts +6 -1
- package/src/progress.ts +69 -14
- package/src/protocol.ts +15 -8
- package/src/repository.ts +16 -19
- package/src/reward.ts +7 -4
- package/src/service.ts +9 -5
- package/src/util.ts +14 -2
- package/src/address.graphql +0 -0
- package/src/object.graphql +0 -30
package/src/guard.ts
CHANGED
|
@@ -4,7 +4,8 @@ import { BCS, getSuiMoveConfig, toHEX, fromHEX, BcsReader } from '@mysten/bcs';
|
|
|
4
4
|
import { PROTOCOL, GuardAddress, FnCallType, Data_Type, MODULES, ContextType, OBJECTS_TYPE,
|
|
5
5
|
OBJECTS_TYPE_PREFIX, Query_Param, IsValidDesription, ValueType, OperatorType} from './protocol';
|
|
6
6
|
import { concatenate, array_equal, ulebDecode, array_unique } from './util';
|
|
7
|
-
import {
|
|
7
|
+
import { stringToUint8Array } from './util';
|
|
8
|
+
|
|
8
9
|
|
|
9
10
|
export const MAX_SENSE_COUNT = 16;
|
|
10
11
|
|
|
@@ -29,7 +30,7 @@ export function launch(txb:TransactionBlock, creation:Guard_Creation) : GuardAdd
|
|
|
29
30
|
if (!creation.senses) return false;
|
|
30
31
|
let bValid = true;
|
|
31
32
|
creation.senses.forEach((v) => {
|
|
32
|
-
if (v.input.length == 0) bValid = false;
|
|
33
|
+
if (!v.input || v.input.length == 0) bValid = false;
|
|
33
34
|
})
|
|
34
35
|
if (!bValid) return false;
|
|
35
36
|
|
|
@@ -52,15 +53,21 @@ export function launch(txb:TransactionBlock, creation:Guard_Creation) : GuardAdd
|
|
|
52
53
|
});
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
export function signer_guard(txb:TransactionBlock) : boolean {
|
|
56
|
-
txb.moveCall({
|
|
56
|
+
export function signer_guard(txb:TransactionBlock) : GuardAddress | boolean {
|
|
57
|
+
return txb.moveCall({
|
|
57
58
|
target: PROTOCOL.GuardFn('signer_guard') as FnCallType,
|
|
58
59
|
arguments: []
|
|
59
|
-
});
|
|
60
|
-
return true
|
|
60
|
+
});
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
export
|
|
63
|
+
export function everyone_guard(txb:TransactionBlock) : GuardAddress | boolean {
|
|
64
|
+
return txb.moveCall({
|
|
65
|
+
target: PROTOCOL.GuardFn('everyone_guard') as FnCallType,
|
|
66
|
+
arguments: []
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export type QUERIES_Type = {
|
|
64
71
|
module:MODULES,
|
|
65
72
|
name:string,
|
|
66
73
|
cmd:number,
|
|
@@ -68,12 +75,18 @@ export type Sense_Cmd_Type = {
|
|
|
68
75
|
result:Data_Type
|
|
69
76
|
};
|
|
70
77
|
|
|
71
|
-
export const
|
|
78
|
+
export const QUERIES:any = [
|
|
79
|
+
// module, 'name', 'id', [input], output
|
|
80
|
+
[MODULES.permission, 'builder', 1, [], ValueType.TYPE_STATIC_address],
|
|
72
81
|
[MODULES.permission, 'is_admin', 2, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
73
82
|
[MODULES.permission, 'has_rights', 3, [ValueType.TYPE_STATIC_address, ValueType.TYPE_STATIC_u64], ValueType.TYPE_STATIC_bool],
|
|
74
83
|
[MODULES.permission, 'contains_address', 4, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
75
84
|
[MODULES.permission, 'contains_index', 5, [ValueType.TYPE_STATIC_address, ValueType.TYPE_STATIC_u64], ValueType.TYPE_STATIC_bool],
|
|
76
85
|
[MODULES.permission, 'contains_guard', 6, [ValueType.TYPE_STATIC_address, ValueType.TYPE_STATIC_u64], ValueType.TYPE_STATIC_bool],
|
|
86
|
+
[MODULES.permission, 'contains_guard', 7, [ValueType.TYPE_STATIC_address, ValueType.TYPE_STATIC_u64], ValueType.TYPE_STATIC_address],
|
|
87
|
+
[MODULES.permission, 'entity_count', 8, [], ValueType.TYPE_STATIC_u64],
|
|
88
|
+
[MODULES.permission, 'admin_count', 9, [], ValueType.TYPE_STATIC_u64],
|
|
89
|
+
|
|
77
90
|
[MODULES.repository, 'permission', 1, [], ValueType.TYPE_STATIC_address],
|
|
78
91
|
[MODULES.repository, 'policy_contains', 2, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_bool],
|
|
79
92
|
[MODULES.repository, 'policy_has_permission_index', 3, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_bool],
|
|
@@ -85,6 +98,109 @@ export const Sense_Cmd:any = [ [MODULES.permission, 'creator', 1, [], ValueType.
|
|
|
85
98
|
[MODULES.repository, 'value', 9, [ValueType.TYPE_STATIC_address, ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_vec_u8],
|
|
86
99
|
[MODULES.repository, 'type', 10, [], ValueType.TYPE_STATIC_u8],
|
|
87
100
|
[MODULES.repository, 'policy_mode', 11, [], ValueType.TYPE_STATIC_u8],
|
|
101
|
+
|
|
102
|
+
[MODULES.machine, 'permission', 1, [], ValueType.TYPE_STATIC_address],
|
|
103
|
+
[MODULES.machine, 'has_paused', 2, [], ValueType.TYPE_STATIC_bool],
|
|
104
|
+
[MODULES.machine, 'has_published', 3, [], ValueType.TYPE_STATIC_bool],
|
|
105
|
+
[MODULES.machine, 'consensus_repositories_contains', 5, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
106
|
+
[MODULES.machine, 'has_endpoint', 6, [], ValueType.TYPE_STATIC_bool],
|
|
107
|
+
[MODULES.machine, 'endpoint', 7, [], ValueType.TYPE_STATIC_vec_u8],
|
|
108
|
+
|
|
109
|
+
[MODULES.progress, 'machine', 1, [], ValueType.TYPE_STATIC_address],
|
|
110
|
+
[MODULES.progress, 'current', 2, [], ValueType.TYPE_STATIC_vec_u8],
|
|
111
|
+
[MODULES.progress, 'has_parent', 3, [], ValueType.TYPE_STATIC_bool],
|
|
112
|
+
[MODULES.progress, 'parent', 4, [], ValueType.TYPE_STATIC_address],
|
|
113
|
+
[MODULES.progress, 'has_task', 5, [], ValueType.TYPE_STATIC_bool],
|
|
114
|
+
[MODULES.progress, 'task', 6, [], ValueType.TYPE_STATIC_address],
|
|
115
|
+
[MODULES.progress, 'has_namedOperator', 7, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_bool],
|
|
116
|
+
[MODULES.progress, 'namedOperator_contains', 8, [ValueType.TYPE_STATIC_vec_u8, ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
117
|
+
[MODULES.progress, 'has_context_repository', 9, [], ValueType.TYPE_STATIC_bool],
|
|
118
|
+
[MODULES.progress, 'context_repository', 10, [], ValueType.TYPE_STATIC_address],
|
|
119
|
+
|
|
120
|
+
[MODULES.demand, 'permission', 1, [], ValueType.TYPE_STATIC_address],
|
|
121
|
+
[MODULES.demand, 'has_time_expire', 2, [], ValueType.TYPE_STATIC_bool],
|
|
122
|
+
[MODULES.demand, 'time_expire', 3, [], ValueType.TYPE_STATIC_u64],
|
|
123
|
+
[MODULES.demand, 'earnest_count', 4, [], ValueType.TYPE_STATIC_u64],
|
|
124
|
+
[MODULES.demand, 'has_guard', 5, [], ValueType.TYPE_STATIC_bool],
|
|
125
|
+
[MODULES.demand, 'guard', 6, [], ValueType.TYPE_STATIC_address],
|
|
126
|
+
[MODULES.demand, 'has_yes', 7, [], ValueType.TYPE_STATIC_bool],
|
|
127
|
+
[MODULES.demand, 'yes', 8, [], ValueType.TYPE_STATIC_address],
|
|
128
|
+
[MODULES.demand, 'presenters_count', 9, [], ValueType.TYPE_STATIC_u64],
|
|
129
|
+
[MODULES.demand, 'has_presenter', 10, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
130
|
+
[MODULES.demand, 'persenter', 11, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_address],
|
|
131
|
+
|
|
132
|
+
[MODULES.order, 'amount', 1, [], ValueType.TYPE_STATIC_u64],
|
|
133
|
+
[MODULES.order, 'payer', 2, [], ValueType.TYPE_STATIC_address],
|
|
134
|
+
[MODULES.order, 'service', 3, [], ValueType.TYPE_STATIC_address],
|
|
135
|
+
[MODULES.order, 'has_progress', 4, [], ValueType.TYPE_STATIC_bool],
|
|
136
|
+
[MODULES.order, 'progress', 5, [], ValueType.TYPE_STATIC_address],
|
|
137
|
+
[MODULES.order, 'has_requred_info', 6, [], ValueType.TYPE_STATIC_bool],
|
|
138
|
+
[MODULES.order, 'requred_info_service_pubkey', 7, [], ValueType.TYPE_STATIC_vec_u8],
|
|
139
|
+
[MODULES.order, 'requred_info_customer_pubkey', 8, [], ValueType.TYPE_STATIC_vec_u8],
|
|
140
|
+
[MODULES.order, 'requred_info_info', 9, [], ValueType.TYPE_STATIC_vec_vec_u8],
|
|
141
|
+
[MODULES.order, 'has_discount', 10, [], ValueType.TYPE_STATIC_bool],
|
|
142
|
+
[MODULES.order, 'discount', 11, [], ValueType.TYPE_STATIC_address],
|
|
143
|
+
[MODULES.order, 'balance', 12, [], ValueType.TYPE_STATIC_u64],
|
|
144
|
+
[MODULES.order, 'bRefunded', 13, [], ValueType.TYPE_STATIC_u8],
|
|
145
|
+
[MODULES.order, 'bWithdrawed', 14, [], ValueType.TYPE_STATIC_u8],
|
|
146
|
+
|
|
147
|
+
[MODULES.service, 'permission', 1, [], ValueType.TYPE_STATIC_address],
|
|
148
|
+
[MODULES.service, 'payee', 2, [], ValueType.TYPE_STATIC_address],
|
|
149
|
+
[MODULES.service, 'has_buy_guard', 3, [], ValueType.TYPE_STATIC_bool],
|
|
150
|
+
[MODULES.service, 'buy_guard', 4, [], ValueType.TYPE_STATIC_address],
|
|
151
|
+
[MODULES.service, 'repository_contains', 5, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
152
|
+
[MODULES.service, 'has_withdraw_guard', 6, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
153
|
+
[MODULES.service, 'withdraw_guard_percent', 7, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_u64],
|
|
154
|
+
[MODULES.service, 'has_refund_guard', 8, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
155
|
+
[MODULES.service, 'refund_guard_percent', 9, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_u64],
|
|
156
|
+
[MODULES.service, 'has_sale', 10, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_bool],
|
|
157
|
+
[MODULES.service, 'sale_price', 11, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_u64],
|
|
158
|
+
[MODULES.service, 'sale_stock', 12, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_u64],
|
|
159
|
+
[MODULES.service, 'has_machine', 13, [], ValueType.TYPE_STATIC_bool],
|
|
160
|
+
[MODULES.service, 'machine', 14, [], ValueType.TYPE_STATIC_address],
|
|
161
|
+
[MODULES.service, 'bPaused', 15, [], ValueType.TYPE_STATIC_bool],
|
|
162
|
+
[MODULES.service, 'bPublished', 16, [], ValueType.TYPE_STATIC_bool],
|
|
163
|
+
[MODULES.service, 'has_required', 17, [], ValueType.TYPE_STATIC_bool],
|
|
164
|
+
[MODULES.service, 'requrired_pubkey', 18, [], ValueType.TYPE_STATIC_vec_u8],
|
|
165
|
+
[MODULES.service, 'requrired_info', 19, [], ValueType.TYPE_STATIC_vec_vec_u8],
|
|
166
|
+
|
|
167
|
+
[MODULES.reward, 'permission', 1, [], ValueType.TYPE_STATIC_address],
|
|
168
|
+
[MODULES.reward, 'rewards_count_remain', 2, [], ValueType.TYPE_STATIC_u64],
|
|
169
|
+
[MODULES.reward, 'rewards_count_supplied', 3, [], ValueType.TYPE_STATIC_u64],
|
|
170
|
+
[MODULES.reward, 'guard_count', 4, [], ValueType.TYPE_STATIC_u64],
|
|
171
|
+
[MODULES.reward, 'has_guard', 5, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
172
|
+
[MODULES.reward, 'guard_portions', 6, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_u64],
|
|
173
|
+
[MODULES.reward, 'time_expire', 7, [], ValueType.TYPE_STATIC_u64],
|
|
174
|
+
[MODULES.reward, 'has_claimed', 8, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
175
|
+
[MODULES.reward, 'claimed', 9, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_u64],
|
|
176
|
+
[MODULES.reward, 'has_claimed_count', 10, [], ValueType.TYPE_STATIC_u64],
|
|
177
|
+
[MODULES.reward, 'is_sponsor', 11, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
178
|
+
[MODULES.reward, 'sponsor', 12, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_u64],
|
|
179
|
+
[MODULES.reward, 'sponsor_count', 13, [], ValueType.TYPE_STATIC_u64],
|
|
180
|
+
[MODULES.reward, 'bAllowRepeatClaim', 14, [], ValueType.TYPE_STATIC_bool],
|
|
181
|
+
|
|
182
|
+
[MODULES.vote, 'permission', 1, [], ValueType.TYPE_STATIC_address],
|
|
183
|
+
[MODULES.vote, 'bOptions_locked_for_voting', 2, [], ValueType.TYPE_STATIC_bool],
|
|
184
|
+
[MODULES.vote, 'bdeadline_locked', 3, [], ValueType.TYPE_STATIC_bool],
|
|
185
|
+
[MODULES.vote, 'bLockedGuard', 4, [], ValueType.TYPE_STATIC_bool],
|
|
186
|
+
[MODULES.vote, 'max_choice_count', 5, [], ValueType.TYPE_STATIC_u8],
|
|
187
|
+
[MODULES.vote, 'deadline', 6, [], ValueType.TYPE_STATIC_u64],
|
|
188
|
+
[MODULES.vote, 'has_reference', 7, [], ValueType.TYPE_STATIC_bool],
|
|
189
|
+
[MODULES.vote, 'reference', 8, [], ValueType.TYPE_STATIC_address],
|
|
190
|
+
[MODULES.vote, 'has_guard', 9, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
191
|
+
[MODULES.vote, 'guard', 10, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_u64],
|
|
192
|
+
[MODULES.vote, 'voted', 11, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_bool],
|
|
193
|
+
[MODULES.vote, 'voted_weight', 12, [ValueType.TYPE_STATIC_address], ValueType.TYPE_STATIC_u64],
|
|
194
|
+
[MODULES.vote, 'has_agree', 13, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_bool],
|
|
195
|
+
[MODULES.vote, 'agree_has_object', 14, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_bool],
|
|
196
|
+
[MODULES.vote, 'agree_object', 15, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_address],
|
|
197
|
+
[MODULES.vote, 'agree_count', 16, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_u64],
|
|
198
|
+
[MODULES.vote, 'agree_votes', 17, [ValueType.TYPE_STATIC_vec_u8], ValueType.TYPE_STATIC_u64],
|
|
199
|
+
[MODULES.vote, 'voted_count', 18, [], ValueType.TYPE_STATIC_u64],
|
|
200
|
+
[MODULES.vote, 'top1_name_by_count', 19, [], ValueType.TYPE_STATIC_vec_u8],
|
|
201
|
+
[MODULES.vote, 'top1_count', 20, [], ValueType.TYPE_STATIC_u64],
|
|
202
|
+
[MODULES.vote, 'top1_name_by_votes', 21, [], ValueType.TYPE_STATIC_vec_u8],
|
|
203
|
+
[MODULES.vote, 'top1_votes', 22, [], ValueType.TYPE_STATIC_u64],
|
|
88
204
|
]
|
|
89
205
|
|
|
90
206
|
export class SenseMaker {
|
|
@@ -118,7 +234,7 @@ export class SenseMaker {
|
|
|
118
234
|
break;
|
|
119
235
|
case ValueType.TYPE_STATIC_vec_u8:
|
|
120
236
|
this.data.push(bcs.ser(BCS.U8, type).toBytes());
|
|
121
|
-
this.data.push(bcs.ser(
|
|
237
|
+
this.data.push(bcs.ser(BCS.STRING, param).toBytes());
|
|
122
238
|
this.type_validator.push(type);
|
|
123
239
|
// this.data[this.data.length-1].forEach((item : number) => console.log(item))
|
|
124
240
|
break;
|
|
@@ -140,25 +256,36 @@ export class SenseMaker {
|
|
|
140
256
|
|
|
141
257
|
return true;
|
|
142
258
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
259
|
+
query_index(module:MODULES, query_name:string) : number {
|
|
260
|
+
for (let i = 0; i < QUERIES.length; i++) {
|
|
261
|
+
if (QUERIES[i][0] == module && QUERIES[i][1] == query_name) {
|
|
262
|
+
return i;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return -1;
|
|
266
|
+
}
|
|
267
|
+
// query_index: index(from 0) of array QUERIES
|
|
268
|
+
add_query(object_address:string, module:MODULES, query_name:string) : boolean {
|
|
269
|
+
let query_index = this.query_index(module, query_name);
|
|
270
|
+
if (!object_address || query_index == -1) { return false; }
|
|
271
|
+
|
|
272
|
+
let offset = this.type_validator.length - QUERIES[query_index][3].length;
|
|
146
273
|
if (offset < 0) {
|
|
147
274
|
return false;
|
|
148
275
|
}
|
|
149
276
|
|
|
150
277
|
let types = this.type_validator.slice(offset);
|
|
151
|
-
if (!array_equal(types,
|
|
278
|
+
if (!array_equal(types, QUERIES[query_index][3])) { // type validate
|
|
152
279
|
return false;
|
|
153
280
|
}
|
|
154
281
|
|
|
155
282
|
const bcs = new BCS(getSuiMoveConfig());
|
|
156
283
|
this.data.push(bcs.ser(BCS.U8, OperatorType.TYPE_DYNAMIC_QUERY).toBytes()); // TYPE
|
|
157
284
|
this.data.push(bcs.ser(BCS.ADDRESS, object_address).toBytes()); // object address
|
|
158
|
-
this.data.push(bcs.ser(BCS.U8,
|
|
285
|
+
this.data.push(bcs.ser(BCS.U8, QUERIES[query_index][2]).toBytes()); // cmd
|
|
159
286
|
|
|
160
|
-
this.type_validator.splice(offset,
|
|
161
|
-
this.type_validator.push(
|
|
287
|
+
this.type_validator.splice(offset, QUERIES[query_index][3].length); // delete type stack
|
|
288
|
+
this.type_validator.push(QUERIES[query_index][4]); // add the return value type to type stack
|
|
162
289
|
// console.log(this.type_validator)
|
|
163
290
|
return true;
|
|
164
291
|
}
|
|
@@ -187,10 +314,11 @@ export class SenseMaker {
|
|
|
187
314
|
return true;
|
|
188
315
|
}
|
|
189
316
|
|
|
190
|
-
make(bNotAfterSense:boolean, binder:Guard_Sense_Binder) : boolean | Guard_Sense {
|
|
317
|
+
make(bNotAfterSense:boolean = false, binder:Guard_Sense_Binder = Guard_Sense_Binder.AND) : boolean | Guard_Sense {
|
|
191
318
|
//console.log(this.type_validator);
|
|
192
319
|
//this.data.forEach((value:Uint8Array) => console.log(value));
|
|
193
320
|
if (this.type_validator.length != 1 || this.type_validator[0] != ValueType.TYPE_STATIC_bool) {
|
|
321
|
+
// console.log(this.type_validator)
|
|
194
322
|
return false;
|
|
195
323
|
} // ERROR
|
|
196
324
|
|
|
@@ -201,23 +329,33 @@ export class SenseMaker {
|
|
|
201
329
|
}
|
|
202
330
|
|
|
203
331
|
function match_u128(type:number) : boolean {
|
|
204
|
-
if (type == ValueType.
|
|
205
|
-
type == ValueType.
|
|
206
|
-
type == ValueType.
|
|
332
|
+
if (type == ValueType.TYPE_STATIC_u8 ||
|
|
333
|
+
type == ValueType.TYPE_STATIC_u64 ||
|
|
334
|
+
type == ValueType.TYPE_STATIC_u128 ) {
|
|
207
335
|
return true;
|
|
208
336
|
}
|
|
209
337
|
return false;
|
|
210
338
|
}
|
|
211
339
|
|
|
340
|
+
export function parse_graphql_senses(senses:any) : string[] {
|
|
341
|
+
let objects:string[] = [];
|
|
342
|
+
senses.forEach((s:any) => {
|
|
343
|
+
let res = parse_sense_bsc(Uint8Array.from(s.input.bytes));
|
|
344
|
+
if (res) {
|
|
345
|
+
objects = objects.concat(res as string[]);
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
return array_unique(objects);
|
|
349
|
+
}
|
|
350
|
+
|
|
212
351
|
// parse guard senses input bytes of a guard, return [objectids] for 'query_cmd'
|
|
213
352
|
export function parse_sense_bsc(chain_sense_bsc:Uint8Array) : boolean | string[] {
|
|
214
|
-
|
|
215
|
-
var array = [].slice.call(chain_sense_bsc.reverse());
|
|
353
|
+
var arr = [].slice.call(chain_sense_bsc.reverse());
|
|
216
354
|
const bcs = new BCS(getSuiMoveConfig());
|
|
217
355
|
var result = [];
|
|
218
356
|
|
|
219
|
-
while (
|
|
220
|
-
var type : unknown =
|
|
357
|
+
while (arr.length > 0) {
|
|
358
|
+
var type : unknown = arr.shift() ;
|
|
221
359
|
// console.log(type);
|
|
222
360
|
switch (type as Data_Type) {
|
|
223
361
|
case ContextType.TYPE_CONTEXT_SIGNER:
|
|
@@ -230,42 +368,45 @@ export function parse_sense_bsc(chain_sense_bsc:Uint8Array) : boolean | string[
|
|
|
230
368
|
case OperatorType.TYPE_LOGIC_OPERATOR_U128_EQUAL:
|
|
231
369
|
case OperatorType.TYPE_LOGIC_OPERATOR_EQUAL:
|
|
232
370
|
case OperatorType.TYPE_LOGIC_OPERATOR_HAS_SUBSTRING:
|
|
371
|
+
case OperatorType.TYPE_LOGIC_ALWAYS_TRUE:
|
|
233
372
|
break;
|
|
234
373
|
case ValueType.TYPE_STATIC_address:
|
|
235
374
|
//console.log('0x' + bcs.de(BCS.ADDRESS, Uint8Array.from(array)).toString());
|
|
236
|
-
|
|
375
|
+
arr.splice(0, 32);
|
|
237
376
|
break;
|
|
238
377
|
case ValueType.TYPE_STATIC_bool:
|
|
239
378
|
case ValueType.TYPE_STATIC_u8:
|
|
240
|
-
|
|
379
|
+
arr.splice(0, 1);
|
|
241
380
|
break;
|
|
242
381
|
case ValueType.TYPE_STATIC_u64:
|
|
243
|
-
|
|
382
|
+
arr.splice(0, 8);
|
|
244
383
|
break;
|
|
245
384
|
case ValueType.TYPE_STATIC_u128:
|
|
246
|
-
|
|
385
|
+
arr.splice(0, 16);
|
|
247
386
|
break;
|
|
248
387
|
case ValueType.TYPE_STATIC_vec_u8:
|
|
249
|
-
let {value, length} = ulebDecode(Uint8Array.from(
|
|
250
|
-
|
|
388
|
+
let {value, length} = ulebDecode(Uint8Array.from(arr));
|
|
389
|
+
arr.splice(0, value+length);
|
|
251
390
|
break;
|
|
252
391
|
case OperatorType.TYPE_DYNAMIC_QUERY:
|
|
253
|
-
result.push('0x' + bcs.de(BCS.ADDRESS, Uint8Array.from(
|
|
254
|
-
|
|
392
|
+
result.push('0x' + bcs.de(BCS.ADDRESS, Uint8Array.from(arr)).toString());
|
|
393
|
+
arr.splice(0, 33); // address + cmd
|
|
255
394
|
break;
|
|
256
395
|
default:
|
|
257
|
-
|
|
396
|
+
console.error('parse_sense_bsc:undefined');
|
|
397
|
+
console.log(type as number)
|
|
398
|
+
console.log(arr)
|
|
258
399
|
return false; // error
|
|
259
400
|
}
|
|
260
401
|
}
|
|
261
402
|
return result;
|
|
262
403
|
}
|
|
263
404
|
|
|
264
|
-
const
|
|
265
|
-
export const description_fn = (response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions) => {
|
|
405
|
+
export const rpc_description_fn = (response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions) => {
|
|
266
406
|
if (!response.error) {
|
|
267
407
|
let c = response?.data?.content as any;
|
|
268
|
-
|
|
408
|
+
|
|
409
|
+
if (OBJECTS_TYPE().find((v) => (v == c.type)) && c.fields.id.id == param.objectid) { // GUARD OBJECT
|
|
269
410
|
let description = c.fields.description;
|
|
270
411
|
if (!param.data.includes(description)) {
|
|
271
412
|
param.data.push(description);
|
|
@@ -273,17 +414,24 @@ export const description_fn = (response:SuiObjectResponse, param:Query_Param, op
|
|
|
273
414
|
}
|
|
274
415
|
}
|
|
275
416
|
}
|
|
276
|
-
|
|
417
|
+
|
|
418
|
+
export const rpc_sense_objects_fn = (response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions) => {
|
|
277
419
|
if (!response.error) {
|
|
278
420
|
let c = response?.data?.content as any;
|
|
279
|
-
|
|
421
|
+
let index = OBJECTS_TYPE().findIndex(v => v.includes('guard::Guard') && v == c.type);
|
|
422
|
+
if (index >= 0 && c.fields.id.id == param.objectid) { // GUARD OBJECT
|
|
280
423
|
for (let i = 0; i < c.fields.senses.length; i ++) {
|
|
281
424
|
let sense = c.fields.senses[i];
|
|
282
|
-
if (sense.type == (OBJECTS_TYPE_PREFIX[
|
|
283
|
-
let
|
|
284
|
-
|
|
425
|
+
if (sense.type == (OBJECTS_TYPE_PREFIX()[index] + 'Sense')) { // ...::guard::Sense
|
|
426
|
+
let res = parse_sense_bsc(Uint8Array.from(sense.fields.input.fields.bytes));
|
|
427
|
+
if (res) {
|
|
428
|
+
let ids = res as string[];
|
|
429
|
+
param.data = param.data.concat(ids); // DONT array_unique senses
|
|
430
|
+
}
|
|
285
431
|
}
|
|
286
432
|
}
|
|
287
433
|
}
|
|
288
434
|
}
|
|
289
|
-
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './protocol'
|
|
2
|
+
export {} from './demand'
|
|
3
|
+
export {} from './machine'
|
|
4
|
+
export {} from './progress'
|
|
5
|
+
export {} from './service'
|
|
6
|
+
export {} from './reward'
|
|
7
|
+
export {} from './uitls'
|
|
8
|
+
export {} from './permission'
|
|
9
|
+
export {} from './guard'
|
|
10
|
+
export {} from './repository'
|
|
11
|
+
export {} from './vote'
|
|
12
|
+
export * from './passport'
|
package/src/machine.ts
CHANGED
|
@@ -3,13 +3,13 @@ import { BCS } from '@mysten/bcs';
|
|
|
3
3
|
import { PROTOCOL, FnCallType, PermissionObject, RepositoryObject, IsValidEndpoint, OptionNone, IsValidDesription, PassportObject,
|
|
4
4
|
TXB_OBJECT, MachineObject, MachineAddress, IsValidArray, IsValidAddress, IsValidName, IsValidName_AllowEmpty, GuardObject,
|
|
5
5
|
IsValidInt, IsValidUint, IsValidObjects} from './protocol';
|
|
6
|
-
import { BCS_CONVERT } from './util'
|
|
6
|
+
import { BCS_CONVERT, array_unique } from './util'
|
|
7
7
|
import { IsValidPermissionIndex, PermissionIndexType } from './permission';
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
export type MachineNodeObject = TransactionResult;
|
|
11
|
-
|
|
10
|
+
export type MachineNodeObject = TransactionResult | String;
|
|
12
11
|
export const INITIAL_NODE_NAME = '';
|
|
12
|
+
export const namedOperator_ORDER_PAYER = 'order payer';
|
|
13
13
|
|
|
14
14
|
export type Machine_Forward = {
|
|
15
15
|
name: string; // foward name
|
|
@@ -29,7 +29,7 @@ export type Machine_Node = {
|
|
|
29
29
|
pairs: Machine_Node_Pair[];
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
//
|
|
32
|
+
// create new nodes for machine
|
|
33
33
|
export function machine_add_node(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject,
|
|
34
34
|
nodes:Machine_Node[], passport?:PassportObject) : boolean {
|
|
35
35
|
if (!IsValidObjects([machine, permission])) return false;
|
|
@@ -86,40 +86,46 @@ export function machine_add_node(txb:TransactionBlock, machine:MachineObject, pe
|
|
|
86
86
|
new_nodes.push(n);
|
|
87
87
|
}); return machine_add_node2(txb, machine, permission, new_nodes, passport)
|
|
88
88
|
}
|
|
89
|
-
//
|
|
89
|
+
// move MachineNodeObject to the machine from signer-owned MachineNode object
|
|
90
90
|
export function machine_add_node2(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject,
|
|
91
91
|
nodes:MachineNodeObject[], passport?:PassportObject) : boolean {
|
|
92
92
|
if (!IsValidObjects([machine, permission])) return false;
|
|
93
93
|
if (!nodes) return false;
|
|
94
94
|
|
|
95
|
+
let n: TransactionResult[] = [];
|
|
96
|
+
array_unique(nodes).forEach((v) => {
|
|
97
|
+
n.push(TXB_OBJECT(txb, v));
|
|
98
|
+
})
|
|
99
|
+
|
|
95
100
|
if (passport) {
|
|
96
101
|
txb.moveCall({ // add node
|
|
97
102
|
target:PROTOCOL.MachineFn('node_add_with_passport') as FnCallType,
|
|
98
|
-
arguments:[passport, TXB_OBJECT(txb, machine), txb.makeMoveVec({objects:
|
|
103
|
+
arguments:[passport, TXB_OBJECT(txb, machine), txb.makeMoveVec({objects:n}), TXB_OBJECT(txb, permission)]
|
|
99
104
|
});
|
|
100
105
|
} else {
|
|
101
106
|
txb.moveCall({ // add node
|
|
102
107
|
target:PROTOCOL.MachineFn('node_add') as FnCallType,
|
|
103
|
-
arguments:[TXB_OBJECT(txb, machine), txb.makeMoveVec({objects:
|
|
108
|
+
arguments:[TXB_OBJECT(txb, machine), txb.makeMoveVec({objects:n}), TXB_OBJECT(txb, permission)]
|
|
104
109
|
});
|
|
105
110
|
}
|
|
106
111
|
return true
|
|
107
112
|
}
|
|
108
|
-
//
|
|
109
|
-
export function machine_remove_node(txb:TransactionBlock, machine:MachineObject, permission:
|
|
110
|
-
nodes_name:string[], passport?:PassportObject) : boolean {
|
|
113
|
+
// move MachineNodeObject from machine to signer-owned MachineNode object
|
|
114
|
+
export function machine_remove_node(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject,
|
|
115
|
+
nodes_name:string[], bTransferMyself:boolean = false, passport?:PassportObject) : boolean {
|
|
111
116
|
if (!IsValidObjects([machine, permission])) return false;
|
|
112
117
|
if (!nodes_name || !IsValidArray(nodes_name, IsValidName)) return false;
|
|
113
118
|
|
|
114
119
|
if (passport) {
|
|
115
120
|
txb.moveCall({
|
|
116
121
|
target:PROTOCOL.MachineFn('node_remove_with_passport') as FnCallType,
|
|
117
|
-
arguments:[passport, TXB_OBJECT(txb, machine), txb.pure(BCS_CONVERT.ser_vector_string(nodes_name)),
|
|
122
|
+
arguments:[passport, TXB_OBJECT(txb, machine), txb.pure(BCS_CONVERT.ser_vector_string(nodes_name)),
|
|
123
|
+
txb.pure(bTransferMyself, BCS.BOOL), TXB_OBJECT(txb, permission)],
|
|
118
124
|
});
|
|
119
125
|
} else {
|
|
120
126
|
txb.moveCall({
|
|
121
127
|
target:PROTOCOL.MachineFn('node_remove') as FnCallType,
|
|
122
|
-
arguments:[TXB_OBJECT(txb, machine), txb.pure(BCS_CONVERT.ser_vector_string(nodes_name)), permission],
|
|
128
|
+
arguments:[TXB_OBJECT(txb, machine), txb.pure(BCS_CONVERT.ser_vector_string(nodes_name)), txb.pure(bTransferMyself, BCS.BOOL), TXB_OBJECT(txb, permission)],
|
|
123
129
|
});
|
|
124
130
|
}
|
|
125
131
|
return true;
|
package/src/passport.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { SuiObjectResponse, SuiObjectDataOptions } from '@mysten/sui.js/client';
|
|
2
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} from './protocol';
|
|
3
|
+
import { PROTOCOL, FnCallType, CLOCK_OBJECT, Query_Param, OBJECTS_TYPE, OBJECTS_TYPE_PREFIX, PassportObject, GuardObject, TXB_OBJECT} from './protocol';
|
|
4
4
|
import { parse_object_type, array_unique } from './util';
|
|
5
|
-
import {
|
|
5
|
+
import { rpc_sense_objects_fn } from './guard';
|
|
6
6
|
|
|
7
7
|
export const MAX_GUARD_COUNT = 8;
|
|
8
8
|
|
|
@@ -18,40 +18,57 @@ export const MAX_GUARD_COUNT = 8;
|
|
|
18
18
|
|
|
19
19
|
export const passport_queries = async (guards:string[]) : Promise<Guard_Query_Object[]> => {
|
|
20
20
|
let sense_objects = guards.map((value) => {
|
|
21
|
-
return {objectid:value, callback:
|
|
21
|
+
return {objectid:value, callback:rpc_sense_objects_fn, data:[]} as Query_Param
|
|
22
22
|
});
|
|
23
23
|
await PROTOCOL.Query(sense_objects); // objects need quering in guards
|
|
24
24
|
let sense_objects_result:string[] = [];
|
|
25
|
-
sense_objects.forEach((value) => {
|
|
25
|
+
sense_objects.forEach((value) => { // DONT CHANGE objects sequence
|
|
26
26
|
sense_objects_result = sense_objects_result.concat(value.data);
|
|
27
27
|
});
|
|
28
|
-
sense_objects_result = array_unique(sense_objects_result);
|
|
29
|
-
console.log(sense_objects_result);
|
|
28
|
+
sense_objects_result = array_unique(sense_objects_result); // objects in guards
|
|
29
|
+
// console.log(sense_objects_result);
|
|
30
30
|
|
|
31
31
|
let queries = sense_objects_result.map((value) => {
|
|
32
|
-
return {objectid:value, callback:
|
|
32
|
+
return {objectid:value, callback:rpc_query_cmd_fn, data:[]} as Query_Param;
|
|
33
33
|
})
|
|
34
34
|
await PROTOCOL.Query(queries, {'showType':true}); // queries for passport verifing
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
let res : Guard_Query_Object[] = [];
|
|
36
|
+
sense_objects.forEach((guard) => { // DONT CHANGE objects sequence for passport verifying
|
|
37
|
+
res = res.concat(guard.data.map((object:string) => {
|
|
38
|
+
let data = queries.filter((v) => {
|
|
39
|
+
return v.objectid == object
|
|
40
|
+
});
|
|
41
|
+
if (!data) {
|
|
42
|
+
console.error('error find data')
|
|
43
|
+
console.log(queries)
|
|
44
|
+
console.log(object)
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
return data[0].data
|
|
48
|
+
}))
|
|
37
49
|
})
|
|
50
|
+
return res;
|
|
38
51
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
52
|
+
|
|
53
|
+
// 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) {
|
|
42
56
|
return false;
|
|
43
57
|
}
|
|
44
|
-
|
|
58
|
+
console.log(guards)
|
|
59
|
+
console.log(passport_queries)
|
|
60
|
+
|
|
45
61
|
var passport = txb.moveCall({
|
|
46
62
|
target: PROTOCOL.PassportFn('new') as FnCallType,
|
|
47
|
-
arguments: [ txb
|
|
63
|
+
arguments: [ TXB_OBJECT(txb, guards[0]), txb.object(CLOCK_OBJECT)]
|
|
48
64
|
});
|
|
49
65
|
|
|
50
66
|
// add others guards, if any
|
|
51
|
-
for (let i = 1; i <
|
|
67
|
+
for (let i = 1; i < guards.length; i++) {
|
|
68
|
+
console.log('dfdfdf')
|
|
52
69
|
txb.moveCall({
|
|
53
70
|
target:PROTOCOL.PassportFn('guard_add') as FnCallType,
|
|
54
|
-
arguments:[passport, txb
|
|
71
|
+
arguments:[passport, TXB_OBJECT(txb, guards[i])]
|
|
55
72
|
});
|
|
56
73
|
}
|
|
57
74
|
|
|
@@ -84,20 +101,20 @@ export function destroy(txb:TransactionBlock, passport:PassportObject) : boolean
|
|
|
84
101
|
}
|
|
85
102
|
|
|
86
103
|
export type Guard_Query_Object = {
|
|
87
|
-
target: FnCallType,
|
|
88
|
-
object: TransactionObjectInput,
|
|
89
|
-
types: string[],
|
|
90
|
-
id: string,
|
|
104
|
+
target: FnCallType, // object fnCall
|
|
105
|
+
object: TransactionObjectInput, // object
|
|
106
|
+
types: string[], // object type
|
|
107
|
+
id: string, // object id
|
|
91
108
|
}
|
|
92
109
|
|
|
93
110
|
// construct Guard_Query_Object of wowok objects for passport verify
|
|
94
|
-
export const
|
|
111
|
+
export const rpc_query_cmd_fn = (response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions) => {
|
|
95
112
|
if (!response.error && response.data?.objectId == param.objectid && response.data?.type) {
|
|
96
|
-
for (let k = 0; k < OBJECTS_TYPE.length; k++) {
|
|
97
|
-
if (response?.data?.type.includes(OBJECTS_TYPE[k]) ) { // type: pack::m::Object<...>
|
|
98
|
-
param.data = { target:OBJECTS_TYPE_PREFIX[k] + 'guard_query' as FnCallType,
|
|
113
|
+
for (let k = 0; k < OBJECTS_TYPE().length; k++) {
|
|
114
|
+
if (response?.data?.type.includes(OBJECTS_TYPE()[k]) ) { // type: pack::m::Object<...>
|
|
115
|
+
param.data = { target:OBJECTS_TYPE_PREFIX()[k] + 'guard_query' as FnCallType,
|
|
99
116
|
object:Inputs.SharedObjectRef({
|
|
100
|
-
objectId:
|
|
117
|
+
objectId: response.data.objectId,
|
|
101
118
|
mutable: false,
|
|
102
119
|
initialSharedVersion: response.data!.version,
|
|
103
120
|
}) as TransactionObjectInput,
|
|
@@ -107,4 +124,24 @@ export const query_cmd_fn = (response:SuiObjectResponse, param:Query_Param, opti
|
|
|
107
124
|
}
|
|
108
125
|
}
|
|
109
126
|
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export const graphql_query_objects = (nodes:any) : Guard_Query_Object[] => {
|
|
130
|
+
let ret:Guard_Query_Object[] = [];
|
|
131
|
+
nodes.forEach((node:any) => {
|
|
132
|
+
for (let k = 0; k < OBJECTS_TYPE().length; k++) {
|
|
133
|
+
if (node?.asMoveObject?.contents?.type?.repr?.includes(OBJECTS_TYPE()[k]) ) { // type: pack::m::Object<...>
|
|
134
|
+
ret.push({ target:OBJECTS_TYPE_PREFIX()[k] + 'guard_query' as FnCallType,
|
|
135
|
+
object:Inputs.SharedObjectRef({
|
|
136
|
+
objectId: node.address,
|
|
137
|
+
mutable: false,
|
|
138
|
+
initialSharedVersion: node.version,
|
|
139
|
+
}) as TransactionObjectInput,
|
|
140
|
+
types:parse_object_type(node.asMoveObject.contents.type.repr as string),
|
|
141
|
+
id: node.address,
|
|
142
|
+
} as Guard_Query_Object);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
})
|
|
146
|
+
return ret
|
|
110
147
|
}
|
package/src/permission.ts
CHANGED
|
@@ -93,9 +93,11 @@ export const IsValidUserDefinedIndex = (index:number) : boolean => {
|
|
|
93
93
|
return index >= PermissionIndex.user_defined_start && IsValidUint(index)
|
|
94
94
|
}
|
|
95
95
|
export const IsValidPermissionIndex = (index:PermissionIndexType) : boolean => {
|
|
96
|
+
//console.log(index)
|
|
96
97
|
if (Object.values(PermissionIndex).includes(index)) {
|
|
97
98
|
return true
|
|
98
99
|
}
|
|
100
|
+
//console.log(Object.keys(PermissionIndex))
|
|
99
101
|
return IsValidUserDefinedIndex(index);
|
|
100
102
|
}
|
|
101
103
|
|
|
@@ -139,8 +141,11 @@ export function add_entity(txb:TransactionBlock, permission:PermissionObject, en
|
|
|
139
141
|
|
|
140
142
|
let bValid = true;
|
|
141
143
|
let e = entities.forEach((v) => {
|
|
142
|
-
if (!IsValidArray(v.permissions, IsValidPermissionIndex)) bValid = false;
|
|
143
144
|
if (!IsValidAddress(v.entity_address)) bValid = false;
|
|
145
|
+
v.permissions.forEach((p) => {
|
|
146
|
+
if (!IsValidPermissionIndex(p.index)) bValid = false;
|
|
147
|
+
if (p?.guard && !IsValidObjects([p.guard])) bValid = false;
|
|
148
|
+
})
|
|
144
149
|
});
|
|
145
150
|
if (!bValid) return false;
|
|
146
151
|
|