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/dist/community.d.ts +8 -0
- package/dist/community.js +96 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.js +27 -0
- package/dist/demand.js +176 -0
- package/dist/guard.js +267 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/machine.js +259 -0
- package/dist/passport.js +89 -0
- package/dist/permission.js +217 -0
- package/dist/progress.js +143 -0
- package/dist/protocol.js +177 -0
- package/dist/repository.js +206 -0
- package/dist/reward.js +192 -0
- package/dist/service.js +698 -0
- package/dist/util.js +131 -0
- package/dist/vote.js +273 -0
- package/package.json +24 -0
- package/src/demand.ts +173 -0
- package/src/guard.ts +283 -0
- package/src/index.ts +0 -0
- package/src/machine.ts +257 -0
- package/src/passport.ts +110 -0
- package/src/permission.ts +224 -0
- package/src/progress.ts +139 -0
- package/src/protocol.ts +189 -0
- package/src/repository.ts +213 -0
- package/src/reward.ts +184 -0
- package/src/service.ts +686 -0
- package/src/util.ts +134 -0
- package/src/vote.ts +251 -0
- package/tsconfig.json +110 -0
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
|
+
}
|
package/src/passport.ts
ADDED
|
@@ -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
|
+
}
|