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