wowok 1.0.3

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/guard.ts ADDED
@@ -0,0 +1,283 @@
1
+ import { SuiObjectResponse, SuiObjectDataOptions, SuiParsedData } from '@mysten/sui.js/client';
2
+ import { TransactionBlock, Inputs, type TransactionResult } from '@mysten/sui.js/transactions';
3
+ import { BCS, getSuiMoveConfig, toHEX, fromHEX, BcsReader } from '@mysten/bcs';
4
+ import { PROTOCOL, GuardAddress, FnCallType, Data_Type, MODULES, GuardObject, OBJECTS_TYPE, OBJECTS_TYPE_PREFIX, Query_Param} from './protocol';
5
+ import { concatenate, array_equal, ulebDecode, array_unique } from './util';
6
+ import { TransactionBlockDataBuilder } from '@mysten/sui.js/dist/cjs/builder/TransactionBlockData';
7
+
8
+ export enum Guard_Sense_Binder {
9
+ AND = 1, // first sense of guard always AND; for combining other guards
10
+ OR = 2,
11
+ }
12
+
13
+ export type Guard_Sense = {
14
+ input: Uint8Array;
15
+ notAfterSense: boolean;
16
+ binder:Guard_Sense_Binder ;
17
+ };
18
+
19
+ export type Guard_Creation = {
20
+ description: string;
21
+ senses: Guard_Sense[];
22
+ }
23
+
24
+ export function launch(txb:TransactionBlock, creation:Guard_Creation) : GuardAddress {
25
+ var guard = txb.moveCall({
26
+ target: PROTOCOL.GuardFn('new') as FnCallType,
27
+ arguments: [ txb.pure(creation.description , BCS.STRING), ],
28
+ });
29
+ creation?.senses.forEach((sense: Guard_Sense) => {
30
+ txb.moveCall({
31
+ target: PROTOCOL.GuardFn('sense_add') as FnCallType,
32
+ arguments:[ guard, txb.pure([].slice.call(sense.input)),
33
+ txb.pure(sense.notAfterSense, BCS.BOOL),
34
+ txb.pure(sense.binder, BCS.U8),
35
+ ]
36
+ })
37
+ });
38
+ return txb.moveCall({
39
+ target:PROTOCOL.GuardFn("create") as FnCallType,
40
+ arguments:[guard]
41
+ });
42
+ }
43
+
44
+ export function signer_guard(txb:TransactionBlock) {
45
+ txb.moveCall({
46
+ target: PROTOCOL.GuardFn('signer_guard') as FnCallType,
47
+ arguments: []
48
+ }); // { kind: 'Result', index: 0 }, ref to address could used by PTB
49
+ }
50
+
51
+ export function query_description(txb:TransactionBlock, guard:GuardObject) {
52
+ txb.moveCall({
53
+ target: PROTOCOL.GuardFn('description') as FnCallType,
54
+ arguments:[guard]
55
+ })
56
+ }
57
+
58
+ export type Sense_Cmd_Type = {
59
+ module:MODULES,
60
+ name:string,
61
+ cmd:number,
62
+ params:Data_Type[],
63
+ result:Data_Type
64
+ };
65
+
66
+ export const Sense_Cmd:any = [ [MODULES.permission, 'creator', 1, [], Data_Type.TYPE_STATIC_address],
67
+ [MODULES.permission, 'is_admin', 2, [Data_Type.TYPE_STATIC_address], Data_Type.TYPE_STATIC_bool],
68
+ [MODULES.permission, 'has_rights', 3, [Data_Type.TYPE_STATIC_address, Data_Type.TYPE_STATIC_u64], Data_Type.TYPE_STATIC_bool],
69
+ [MODULES.permission, 'contains_address', 4, [Data_Type.TYPE_STATIC_address], Data_Type.TYPE_STATIC_bool],
70
+ [MODULES.permission, 'contains_index', 5, [Data_Type.TYPE_STATIC_address, Data_Type.TYPE_STATIC_u64], Data_Type.TYPE_STATIC_bool],
71
+ [MODULES.permission, 'contains_guard', 6, [Data_Type.TYPE_STATIC_address, Data_Type.TYPE_STATIC_u64], Data_Type.TYPE_STATIC_bool],
72
+ [MODULES.repository, 'permission', 1, [], Data_Type.TYPE_STATIC_address],
73
+ [MODULES.repository, 'policy_contains', 2, [Data_Type.TYPE_STATIC_vec_u8], Data_Type.TYPE_STATIC_bool],
74
+ [MODULES.repository, 'policy_has_permission_index', 3, [Data_Type.TYPE_STATIC_vec_u8], Data_Type.TYPE_STATIC_bool],
75
+ [MODULES.repository, 'policy_permission_index', 4, [Data_Type.TYPE_STATIC_vec_u8], Data_Type.TYPE_STATIC_u64],
76
+ [MODULES.repository, 'policy_value_type', 5, [Data_Type.TYPE_STATIC_vec_u8], Data_Type.TYPE_STATIC_u8],
77
+ [MODULES.repository, 'contains_id', 6, [Data_Type.TYPE_STATIC_address], Data_Type.TYPE_STATIC_bool],
78
+ [MODULES.repository, 'contains_value', 7, [Data_Type.TYPE_STATIC_address, Data_Type.TYPE_STATIC_vec_u8], Data_Type.TYPE_STATIC_bool],
79
+ [MODULES.repository, 'value_without_type', 8, [Data_Type.TYPE_STATIC_address, Data_Type.TYPE_STATIC_vec_u8], Data_Type.TYPE_STATIC_vec_u8],
80
+ [MODULES.repository, 'value', 9, [Data_Type.TYPE_STATIC_address, Data_Type.TYPE_STATIC_vec_u8], Data_Type.TYPE_STATIC_vec_u8],
81
+ [MODULES.repository, 'type', 10, [], Data_Type.TYPE_STATIC_u8],
82
+ [MODULES.repository, 'policy_mode', 11, [], Data_Type.TYPE_STATIC_u8],
83
+ ]
84
+
85
+ export class SenseMaker {
86
+ protected data : Uint8Array[] = [];
87
+ protected type_validator : Data_Type[] = [];
88
+
89
+ constructor() { }
90
+ // serialize const & data
91
+ add_param(type:Data_Type, param?:any) : boolean {
92
+ const bcs = new BCS(getSuiMoveConfig());
93
+ switch(type) {
94
+ case Data_Type.TYPE_STATIC_address:
95
+ this.data.push(bcs.ser(BCS.U8, type).toBytes());
96
+ this.data.push(bcs.ser(BCS.ADDRESS, param).toBytes());
97
+ this.type_validator.push(type);
98
+ break;
99
+ case Data_Type.TYPE_STATIC_bool:
100
+ this.data.push(bcs.ser(BCS.U8, type).toBytes());
101
+ this.data.push(bcs.ser(BCS.BOOL, param).toBytes());
102
+ this.type_validator.push(type);
103
+ break;
104
+ case Data_Type.TYPE_STATIC_u8:
105
+ this.data.push(bcs.ser(BCS.U8, type).toBytes());
106
+ this.data.push(bcs.ser(BCS.U8, param).toBytes());
107
+ this.type_validator.push(type);
108
+ break;
109
+ case Data_Type.TYPE_STATIC_u64:
110
+ this.data.push(bcs.ser(BCS.U8, type).toBytes());
111
+ this.data.push(bcs.ser(BCS.U64, param).toBytes());
112
+ this.type_validator.push(type);
113
+ break;
114
+ case Data_Type.TYPE_STATIC_vec_u8:
115
+ this.data.push(bcs.ser(BCS.U8, type).toBytes());
116
+ this.data.push(bcs.ser("vector<u8>", param).toBytes());
117
+ this.type_validator.push(type);
118
+ // this.data[this.data.length-1].forEach((item : number) => console.log(item))
119
+ break;
120
+ case Data_Type.TYPE_CONTEXT_SIGNER:
121
+ this.data.push(bcs.ser(BCS.U8, type).toBytes());
122
+ this.type_validator.push(Data_Type.TYPE_STATIC_address);
123
+ break;
124
+ case Data_Type.TYPE_CONTEXT_CURRENT_CLOCK:
125
+ this.data.push(bcs.ser(BCS.U8, type).toBytes());
126
+ this.type_validator.push(Data_Type.TYPE_STATIC_u64);
127
+ break;
128
+ case Data_Type.TYPE_CONTEXT_CURRENT_PROGRESS:
129
+ this.data.push(bcs.ser(BCS.U8, type).toBytes());
130
+ this.type_validator.push(Data_Type.TYPE_STATIC_address);
131
+ break;
132
+ default:
133
+ return false;
134
+ };
135
+
136
+ return true;
137
+ }
138
+ add_cmd(object_address:string, sense_index:number) : boolean {
139
+ if (!object_address || sense_index >= Sense_Cmd.length) { return false; }
140
+ let offset = this.type_validator.length - Sense_Cmd[sense_index][3].length;
141
+ if (offset < 0) {
142
+ return false;
143
+ }
144
+
145
+ let types = this.type_validator.slice(offset);
146
+ if (!array_equal(types, Sense_Cmd[sense_index][3])) { // type validate
147
+ return false;
148
+ }
149
+
150
+ const bcs = new BCS(getSuiMoveConfig());
151
+ this.data.push(bcs.ser(BCS.U8, Data_Type.TYPE_DYNAMIC_QUERY).toBytes()); // TYPE
152
+ this.data.push(bcs.ser(BCS.ADDRESS, object_address).toBytes()); // object address
153
+ this.data.push(bcs.ser(BCS.U8, Sense_Cmd[sense_index][2]).toBytes()); // cmd
154
+
155
+ this.type_validator.splice(offset, Sense_Cmd[sense_index][3].length); // delete type stack
156
+ this.type_validator.push(Sense_Cmd[sense_index][4]); // add the return value type to type stack
157
+ // console.log(this.type_validator)
158
+ return true;
159
+ }
160
+ add_logic(type:Data_Type) : boolean {
161
+ switch (type) {
162
+ case Data_Type.TYPE_LOGIC_OPERATOR_U128_GREATER:
163
+ case Data_Type.TYPE_LOGIC_OPERATOR_U128_GREATER_EQUAL:
164
+ case Data_Type.TYPE_LOGIC_OPERATOR_U128_LESSER:
165
+ case Data_Type.TYPE_LOGIC_OPERATOR_U128_LESSER_EQUAL:
166
+ case Data_Type.TYPE_LOGIC_OPERATOR_U128_EQUAL:
167
+ if (this.type_validator.length < 2) { return false; }
168
+ if (!match_u128(this.type_validator[this.type_validator.length - 1])) { return false; }
169
+ if (!match_u128(this.type_validator[this.type_validator.length - 2])) { return false; }
170
+ break;
171
+ case Data_Type.TYPE_LOGIC_OPERATOR_EQUAL:
172
+ case Data_Type.TYPE_LOGIC_OPERATOR_HAS_SUBSTRING:
173
+ if (this.type_validator.length < 2) { return false; }
174
+ break;
175
+ default:
176
+ return false;
177
+ }
178
+ const bcs = new BCS(getSuiMoveConfig());
179
+ this.data.push(bcs.ser(BCS.U8, type).toBytes()); // TYPE
180
+ this.type_validator.splice(this.type_validator.length - 2); // delete type stack
181
+ this.type_validator.push(Data_Type.TYPE_STATIC_bool); // add bool to type stack
182
+ return true;
183
+ }
184
+
185
+ make(bNotAfterSense:boolean, binder:Guard_Sense_Binder) : undefined | Guard_Sense {
186
+ //console.log(this.type_validator);
187
+ //this.data.forEach((value:Uint8Array) => console.log(value));
188
+ if (this.type_validator.length != 1 || this.type_validator[0] != Data_Type.TYPE_STATIC_bool) {
189
+ return undefined;
190
+ } // ERROR
191
+
192
+ let input = concatenate(Uint8Array, ...this.data) as Uint8Array;
193
+ const sense:Guard_Sense = {input:input, notAfterSense:bNotAfterSense, binder:binder};
194
+ return sense;
195
+ }
196
+ }
197
+
198
+ function match_u128(type:Data_Type) : boolean {
199
+ if (type == Data_Type.TYPE_STATIC_option_u8 ||
200
+ type == Data_Type.TYPE_STATIC_option_u64 ||
201
+ type == Data_Type.TYPE_STATIC_option_u128 ) {
202
+ return true;
203
+ }
204
+ return false;
205
+ }
206
+
207
+ // parse guard senses input bytes of a guard, return [objectids] for 'query_cmd'
208
+ export function parse_sense_bsc(chain_sense_bsc:Uint8Array) : undefined | string[] {
209
+ // console.log(data);
210
+ var array = [].slice.call(chain_sense_bsc.reverse());
211
+ const bcs = new BCS(getSuiMoveConfig());
212
+ var result = [];
213
+ while (array.length > 0) {
214
+ var type : unknown = array.shift() ;
215
+ // console.log(type);
216
+ switch (type as Data_Type) {
217
+ case Data_Type.TYPE_CONTEXT_SIGNER:
218
+ case Data_Type.TYPE_CONTEXT_CURRENT_CLOCK:
219
+ case Data_Type.TYPE_CONTEXT_CURRENT_PROGRESS:
220
+ case Data_Type.TYPE_LOGIC_OPERATOR_U128_GREATER:
221
+ case Data_Type.TYPE_LOGIC_OPERATOR_U128_GREATER_EQUAL:
222
+ case Data_Type.TYPE_LOGIC_OPERATOR_U128_LESSER:
223
+ case Data_Type.TYPE_LOGIC_OPERATOR_U128_LESSER_EQUAL:
224
+ case Data_Type.TYPE_LOGIC_OPERATOR_U128_EQUAL:
225
+ case Data_Type.TYPE_LOGIC_OPERATOR_EQUAL:
226
+ case Data_Type.TYPE_LOGIC_OPERATOR_HAS_SUBSTRING:
227
+ break;
228
+ case Data_Type.TYPE_STATIC_address:
229
+ //console.log('0x' + bcs.de(BCS.ADDRESS, Uint8Array.from(array)).toString());
230
+ array.splice(0, 32);
231
+ break;
232
+ case Data_Type.TYPE_STATIC_bool:
233
+ case Data_Type.TYPE_STATIC_u8:
234
+ array.splice(0, 1);
235
+ break;
236
+ case Data_Type.TYPE_STATIC_u64:
237
+ array.splice(0, 8);
238
+ break;
239
+ case Data_Type.TYPE_STATIC_u128:
240
+ array.splice(0, 16);
241
+ break;
242
+ case Data_Type.TYPE_STATIC_vec_u8:
243
+ let {value, length} = ulebDecode(Uint8Array.from(array));
244
+ array.splice(0, value+length);
245
+ break;
246
+ case Data_Type.TYPE_DYNAMIC_QUERY:
247
+ result.push('0x' + bcs.de(BCS.ADDRESS, Uint8Array.from(array)).toString());
248
+ array.splice(0, 33); // address + cmd
249
+ break;
250
+ default:
251
+ // console.log('parse_sense_bsc:undefined');
252
+ return undefined; // error
253
+ }
254
+ }
255
+ return result;
256
+ }
257
+
258
+ const MODULE_GUARD_INDEX = 7;
259
+ export const description_fn = (response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions) => {
260
+ if (!response.error) {
261
+ let c = response?.data?.content as any;
262
+ if (c.type == OBJECTS_TYPE[MODULE_GUARD_INDEX] && c.fields.id.id == param.objectid) { // GUARD OBJECT
263
+ let description = c.fields.description;
264
+ if (!param.data.includes(description)) {
265
+ param.data.push(description);
266
+ }
267
+ }
268
+ }
269
+ }
270
+ export const sense_objects_fn = (response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions) => {
271
+ if (!response.error) {
272
+ let c = response?.data?.content as any;
273
+ if (c.type == OBJECTS_TYPE[MODULE_GUARD_INDEX] && c.fields.id.id == param.objectid) { // GUARD OBJECT
274
+ for (let i = 0; i < c.fields.senses.length; i ++) {
275
+ let sense = c.fields.senses[i];
276
+ if (sense.type == (OBJECTS_TYPE_PREFIX[MODULE_GUARD_INDEX] + 'Sense')) { // ...::guard::Sense
277
+ let ids = parse_sense_bsc(Uint8Array.from(sense.fields.input.fields.bytes)) as string[];
278
+ param.data = array_unique(param.data.concat(ids));
279
+ }
280
+ }
281
+ }
282
+ }
283
+ }
package/src/index.ts ADDED
File without changes
package/src/machine.ts ADDED
@@ -0,0 +1,257 @@
1
+ import { TransactionBlock, Inputs, type TransactionResult } from '@mysten/sui.js/transactions';
2
+ import { BCS } from '@mysten/bcs';
3
+ import { name_data, CLOCK_OBJECT, PROTOCOL, FnCallType, description_data, MAX_ENDPOINT_LENGTH} from './protocol';
4
+ import { verify, PassportObject} from './passport'
5
+ import { PermissionIndex, PermissionObject } from './permission'
6
+ import { RepositoryObject } from './repository';
7
+ import { BCS_CONVERT } from './util'
8
+
9
+
10
+ export type MachineAddress = TransactionResult;
11
+ export type MachineObject = TransactionResult;
12
+ export type MachineNodeObject = TransactionResult;
13
+
14
+ export const INITIAL_NODE_NAME = '';
15
+
16
+ export type Machine_Forward = {
17
+ name: string; // foward name
18
+ namedOperator?: string;
19
+ permission?: number; // permission-index or named-operator MUST one defined.
20
+ weight?: number;
21
+ guard_address?: string;
22
+ }
23
+ export type Machine_Node_Pair = {
24
+ prior_node: string;
25
+ threshold: number;
26
+ forwards: Machine_Forward[];
27
+ }
28
+ export type Machine_Node = {
29
+ name: string;
30
+ description: string;
31
+ pairs: Machine_Node_Pair[];
32
+ }
33
+
34
+ // node & forward & forward permission string length validation
35
+ export function is_valid_name(name:string):boolean { return name.length > 0 && name.length < 33 }
36
+
37
+ // 创建新的node加入到machine
38
+ export function machine_add_node(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject, nodes:Machine_Node[], passport?:PassportObject) {
39
+ let new_nodes: MachineNodeObject[] = [];
40
+ nodes.forEach((node) => {
41
+ let n = txb.moveCall({
42
+ target:PROTOCOL.NodeFn('new') as FnCallType,
43
+ arguments:[txb.pure(name_data(node.name)), txb.pure(description_data(node.description))]
44
+ });
45
+ node.pairs.forEach((pair) => {
46
+ pair.forwards.forEach((forward) => {
47
+ if (!forward?.namedOperator && !forward?.permission) { return }
48
+ let weight = txb.pure(1);
49
+ if (forward?.weight && forward.weight > 0) {
50
+ weight = txb.pure(forward.weight)
51
+ }
52
+
53
+ let per = txb.pure([], BCS.U8);
54
+ if (forward?.permission) {
55
+ per = txb.pure(BCS_CONVERT.ser_option_u64(forward.permission as number));
56
+ };
57
+ let namedOperator = txb.pure('');
58
+ if (forward?.namedOperator) {
59
+ namedOperator = txb.pure(forward.namedOperator)
60
+ }; let f;
61
+
62
+ if (forward?.guard_address) {
63
+ f = txb.moveCall({
64
+ target:PROTOCOL.NodeFn('forward') as FnCallType,
65
+ arguments:[namedOperator, weight, txb.object(forward.guard_address), per]
66
+ });
67
+ } else {
68
+ f = txb.moveCall({
69
+ target:PROTOCOL.NodeFn('forward2') as FnCallType,
70
+ arguments:[namedOperator, weight, per]
71
+ });
72
+ }
73
+ txb.moveCall({ // add forward
74
+ target:PROTOCOL.NodeFn('forward_add') as FnCallType,
75
+ arguments:[n, txb.pure(pair.prior_node), txb.pure(name_data(forward.name)),
76
+ txb.pure(BCS_CONVERT.ser_option_u64(pair.threshold)), f]
77
+ });
78
+ });
79
+ });
80
+ new_nodes.push(n);
81
+ }); machine_add_node2(txb, machine, permission, new_nodes, passport)
82
+ }
83
+ // 把个人拥有的node加入到machine
84
+ export function machine_add_node2(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject, nodes:MachineNodeObject[], passport?:PassportObject) {
85
+ if (passport) {
86
+ txb.moveCall({ // add node
87
+ target:PROTOCOL.MachineFn('node_add_with_passport') as FnCallType,
88
+ arguments:[passport, machine, txb.makeMoveVec({objects:nodes}), permission]
89
+ });
90
+ } else {
91
+ txb.moveCall({ // add node
92
+ target:PROTOCOL.MachineFn('node_add') as FnCallType,
93
+ arguments:[machine, txb.makeMoveVec({objects:nodes}), permission]
94
+ });
95
+ }
96
+ }
97
+ // 从machine把node移动到个人地址
98
+ export function machine_remove_node(txb:TransactionBlock, machine:MachineObject, permission:TransactionResult, nodes_name:string[], receive_address:string, passport?:PassportObject) {
99
+ if (passport) {
100
+ txb.moveCall({
101
+ target:PROTOCOL.MachineFn('node_remove_with_passport') as FnCallType,
102
+ arguments:[passport, machine, txb.pure(BCS_CONVERT.ser_vector_string(nodes_name)), permission],
103
+ });
104
+ } else {
105
+ txb.moveCall({
106
+ target:PROTOCOL.MachineFn('node_remove') as FnCallType,
107
+ arguments:[machine, txb.pure(BCS_CONVERT.ser_vector_string(nodes_name)), permission],
108
+ });
109
+ }
110
+ }
111
+ export function machine(txb:TransactionBlock, permission:PermissionObject, description:string, endpoint_url?:string, passport?:PassportObject) : MachineObject | undefined {
112
+ if (endpoint_url && endpoint_url.length > MAX_ENDPOINT_LENGTH) return undefined;
113
+ let endpoint = endpoint_url? txb.pure(BCS_CONVERT.ser_option_string(endpoint_url)) : txb.pure([], BCS.U8);
114
+
115
+ if (passport) {
116
+ return txb.moveCall({
117
+ target:PROTOCOL.MachineFn('new_with_passport') as FnCallType,
118
+ arguments:[passport, txb.pure(description_data(description)), endpoint, permission],
119
+ })
120
+ } else {
121
+ //console.log(endpoint)
122
+ return txb.moveCall({
123
+ target:PROTOCOL.MachineFn('new') as FnCallType,
124
+ arguments:[txb.pure(description_data(description)), endpoint, permission],
125
+ })
126
+ }
127
+ }
128
+ export function destroy(txb:TransactionBlock, machine:MachineObject) {
129
+ return txb.moveCall({
130
+ target:PROTOCOL.MachineFn('destroy') as FnCallType,
131
+ arguments: [machine],
132
+ })
133
+ }
134
+ export function launch(txb:TransactionBlock, machine:MachineObject) : MachineAddress {
135
+ return txb.moveCall({
136
+ target:PROTOCOL.MachineFn('create') as FnCallType,
137
+ arguments:[machine],
138
+ })
139
+ }
140
+ export function machine_set_description(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject, description:string, passport?:PassportObject) {
141
+ if (passport) {
142
+ txb.moveCall({
143
+ target:PROTOCOL.MachineFn('description_set_with_passport') as FnCallType,
144
+ arguments:[passport, machine, txb.pure(description_data(description)), permission],
145
+ })
146
+ } else {
147
+ txb.moveCall({
148
+ target:PROTOCOL.MachineFn('description_set') as FnCallType,
149
+ arguments:[machine, txb.pure(description_data(description)), permission],
150
+ })
151
+ }
152
+ }
153
+ export function machine_add_repository(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject, repository:RepositoryObject, passport?:PassportObject) {
154
+ if (passport) {
155
+ txb.moveCall({
156
+ target:PROTOCOL.MachineFn('repository_add_with_passport') as FnCallType,
157
+ arguments:[passport, machine, repository, permission],
158
+ })
159
+ } else {
160
+ txb.moveCall({
161
+ target:PROTOCOL.MachineFn('repository_add') as FnCallType,
162
+ arguments:[machine, repository, permission],
163
+ })
164
+ }
165
+ }
166
+
167
+ export function machine_remove_repository(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject, repositories:string[], removeall?:boolean, passport?:PassportObject) {
168
+ if (passport) {
169
+ if (removeall) {
170
+ txb.moveCall({
171
+ target:PROTOCOL.MachineFn('repository_remove_all_with_passport') as FnCallType,
172
+ arguments:[passport, machine, permission],
173
+ })
174
+ } else {
175
+ txb.moveCall({
176
+ target:PROTOCOL.MachineFn('repository_remove_with_passport') as FnCallType,
177
+ arguments:[passport, machine, txb.pure(repositories, 'vector<address>'), permission],
178
+ })
179
+ }
180
+ } else {
181
+ if (removeall) {
182
+ txb.moveCall({
183
+ target:PROTOCOL.MachineFn('repository_remove_all') as FnCallType,
184
+ arguments:[machine, permission],
185
+ })
186
+ } else {
187
+ txb.moveCall({
188
+ target:PROTOCOL.MachineFn('repository_remove') as FnCallType,
189
+ arguments:[machine, txb.pure(repositories, 'vector<address>'), permission],
190
+ })
191
+ }
192
+ }
193
+ }
194
+
195
+ export function machine_clone(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject, passport?:PassportObject) : MachineObject {
196
+ if (passport) {
197
+ return txb.moveCall({
198
+ target:PROTOCOL.MachineFn('clone_with_passport') as FnCallType,
199
+ arguments:[passport, machine, permission],
200
+ })
201
+ } else {
202
+ return txb.moveCall({
203
+ target:PROTOCOL.MachineFn('clone') as FnCallType,
204
+ arguments:[machine, permission],
205
+ })
206
+ }
207
+ }
208
+ export function machine_set_endpoint(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject, endpoint_url?:string, passport?:PassportObject) {
209
+ if (endpoint_url && endpoint_url.length > MAX_ENDPOINT_LENGTH) return undefined;
210
+ let endpoint = endpoint_url? txb.pure(BCS_CONVERT.ser_option_string(endpoint_url)) : txb.pure([], BCS.U8);
211
+
212
+ if (passport) {
213
+ txb.moveCall({
214
+ target:PROTOCOL.MachineFn('endpoint_set_with_passport') as FnCallType,
215
+ arguments:[passport, machine, endpoint, permission],
216
+ })
217
+ } else {
218
+ txb.moveCall({
219
+ target:PROTOCOL.MachineFn('endpoint_set') as FnCallType,
220
+ arguments:[machine, endpoint, permission],
221
+ })
222
+ }
223
+ }
224
+ export function machine_pause(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject, bPaused:boolean, passport?:PassportObject) {
225
+ if (passport) {
226
+ txb.moveCall({
227
+ target:PROTOCOL.MachineFn('pause_with_passport') as FnCallType,
228
+ arguments:[passport, machine, txb.pure(bPaused), permission],
229
+ })
230
+ } else {
231
+ txb.moveCall({
232
+ target:PROTOCOL.MachineFn('pause') as FnCallType,
233
+ arguments:[machine, txb.pure(bPaused), permission],
234
+ })
235
+ }
236
+ }
237
+ export function machine_publish(txb:TransactionBlock, machine:MachineObject, permission:PermissionObject, passport?:PassportObject) {
238
+ if (passport) {
239
+ txb.moveCall({
240
+ target:PROTOCOL.MachineFn('publish_with_passport') as FnCallType,
241
+ arguments:[passport, machine, permission],
242
+ })
243
+ } else {
244
+ txb.moveCall({
245
+ target:PROTOCOL.MachineFn('publish') as FnCallType,
246
+ arguments:[machine, permission],
247
+ })
248
+ }
249
+ }
250
+
251
+ export function change_permission(txb:TransactionBlock, machine:MachineObject, old_permission:PermissionObject, new_permission:PermissionObject) {
252
+ txb.moveCall({
253
+ target:PROTOCOL.MachineFn('permission_set') as FnCallType,
254
+ arguments: [machine, old_permission, new_permission],
255
+ typeArguments:[]
256
+ })
257
+ }
@@ -0,0 +1,110 @@
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} from './protocol';
4
+ import { parse_object_type, array_unique } from './util';
5
+ import { sense_objects_fn } from './guard';
6
+
7
+ export const MAX_GUARD_COUNT = 4;
8
+
9
+ // passport verify for some guards, MUST be in ONE pxb:
10
+ // 0. construct Guard_Query_Objects(passport_quries) from queries for guards of objects
11
+ // 1. create passport
12
+ // 2. add all guards
13
+ // 3. verify passport
14
+ // 4. ops using passport(guard set on object)
15
+ // 5. ops using passport(guard set on object)
16
+ // 6. destroy passport
17
+
18
+ export type PassportObject = TransactionResult;
19
+
20
+ export const passport_quries = async (guards:string[]) : Promise<Guard_Query_Object[]> => {
21
+ let sense_objects = guards.map((value) => {
22
+ return {objectid:value, callback:sense_objects_fn, data:[]} as Query_Param
23
+ });
24
+ await PROTOCOL.Query(sense_objects); // objects need quering in guards
25
+ let sense_objects_result:string[] = [];
26
+ sense_objects.forEach((value) => {
27
+ sense_objects_result = sense_objects_result.concat(value.data);
28
+ });
29
+ sense_objects_result = array_unique(sense_objects_result);
30
+ console.log(sense_objects_result);
31
+
32
+ let queries = sense_objects_result.map((value) => {
33
+ return {objectid:value, callback:query_cmd_fn} as Query_Param;
34
+ })
35
+ await PROTOCOL.Query(queries, {'showType':true}); // queries for passport verifing
36
+ return queries.map((value) => {
37
+ return value.data as Guard_Query_Object;
38
+ })
39
+ }
40
+ // return passport object for using
41
+ export function verify(txb:TransactionBlock, passport_queries:Guard_Query_Object[]) : PassportObject | undefined {
42
+ if (passport_queries.length == 0 || passport_queries.length > MAX_GUARD_COUNT) {
43
+ return undefined;
44
+ }
45
+ let guard_ids = passport_queries.map((value)=>value.id);
46
+ var passport = txb.moveCall({
47
+ target: PROTOCOL.PassportFn('new') as FnCallType,
48
+ arguments: [ txb.object(guard_ids[0]), txb.object(CLOCK_OBJECT)]
49
+ });
50
+
51
+ // add others guards, if any
52
+ for (let i = 1; i < guard_ids.length; i++) {
53
+ txb.moveCall({
54
+ target:PROTOCOL.PassportFn('guard_add') as FnCallType,
55
+ arguments:[passport, txb.object(guard_ids[i])]
56
+ });
57
+ }
58
+
59
+ // rules: 'verify' & 'query' in turns;'verify' at final end.
60
+ for (let i = 0; i < passport_queries.length; i++) {
61
+ txb.moveCall({
62
+ target: PROTOCOL.PassportFn('passport_verify') as FnCallType,
63
+ arguments: [ passport ]
64
+ });
65
+ txb.moveCall({
66
+ target: passport_queries[i].target as FnCallType,
67
+ arguments: [ txb.object(passport_queries[i].object), passport ],
68
+ typeArguments: passport_queries[i].types,
69
+ })
70
+ }
71
+ txb.moveCall({
72
+ target: PROTOCOL.PassportFn('passport_verify') as FnCallType,
73
+ arguments: [ passport ]
74
+ });
75
+
76
+ return passport;
77
+ }
78
+
79
+ export function destroy(txb:TransactionBlock, passport:PassportObject) {
80
+ txb.moveCall({
81
+ target: PROTOCOL.PassportFn('destroy') as FnCallType,
82
+ arguments: [ passport ]
83
+ });
84
+ }
85
+
86
+ export type Guard_Query_Object = {
87
+ target: FnCallType,
88
+ object: TransactionObjectInput,
89
+ types: string[],
90
+ id: string,
91
+ }
92
+
93
+ // construct Guard_Query_Object of wowok objects for passport verify
94
+ export const query_cmd_fn = (response:SuiObjectResponse, param:Query_Param, option:SuiObjectDataOptions) => {
95
+ 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,
99
+ object:Inputs.SharedObjectRef({
100
+ objectId: param.objectid,
101
+ mutable: false,
102
+ initialSharedVersion: response.data!.version,
103
+ }) as TransactionObjectInput,
104
+ types:parse_object_type(response?.data?.type as string),
105
+ id: param.objectid,
106
+ } as Guard_Query_Object;
107
+ }
108
+ }
109
+ }
110
+ }