wowok 1.3.11 → 1.4.16
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/package.json +1 -1
- package/src/exception.ts +1 -1
- package/src/guard.ts +240 -194
- package/src/machine.ts +13 -6
- package/src/passport.ts +42 -30
- package/src/permission.ts +3 -2
- package/src/protocol.ts +27 -16
- package/src/repository.ts +12 -7
- package/src/utils.ts +29 -14
package/package.json
CHANGED
package/src/exception.ts
CHANGED
package/src/guard.ts
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
import { Protocol, LogicsInfo, GuardAddress, FnCallType, Data_Type, MODULES, ContextType, ValueType, OperatorType, ConstantType, SER_VALUE} from './protocol';
|
|
4
4
|
import { concatenate, array_equal } from './utils';
|
|
5
|
-
import { IsValidDesription, Bcs, IsValidInt, IsValidAddress, FirstLetterUppercase } from './utils';
|
|
5
|
+
import { IsValidDesription, Bcs, IsValidInt, IsValidAddress, FirstLetterUppercase, insertAtHead } from './utils';
|
|
6
6
|
import { ERROR, Errors } from './exception';
|
|
7
7
|
import { Transaction as TransactionBlock } from '@mysten/sui/transactions';
|
|
8
8
|
|
|
9
|
-
export type GuardConstant = Map<number,
|
|
9
|
+
export type GuardConstant = Map<number, Guard_Variable>;
|
|
10
10
|
|
|
11
|
-
export interface
|
|
11
|
+
export interface Guard_Variable {
|
|
12
12
|
type: ConstantType ,
|
|
13
13
|
value?: Uint8Array,
|
|
14
14
|
witness?: Uint8Array,
|
|
@@ -22,7 +22,7 @@ export interface Guard_Options {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export class Guard {
|
|
25
|
-
static MAX_INPUT_LENGTH =
|
|
25
|
+
static MAX_INPUT_LENGTH = 10240;
|
|
26
26
|
static launch(txb:TransactionBlock, description:string, maker:GuardMaker) : GuardAddress {
|
|
27
27
|
if (!maker.IsReady()) {
|
|
28
28
|
ERROR(Errors.InvalidParam, 'launch maker');
|
|
@@ -59,19 +59,19 @@ export class Guard {
|
|
|
59
59
|
if (!v.witness) {
|
|
60
60
|
ERROR(Errors.InvalidParam, 'constants type')
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
const n = insertAtHead(v.witness!, v.type);
|
|
63
63
|
txb.moveCall({
|
|
64
64
|
target:Protocol.Instance().GuardFn("constant_add") as FnCallType,
|
|
65
|
-
arguments:[guard, txb.pure.u8(k), txb.pure.
|
|
65
|
+
arguments:[guard, txb.pure.u8(k), txb.pure.vector('u8', [].slice.call(n)), txb.pure.bool(true)]
|
|
66
66
|
})
|
|
67
67
|
} else {
|
|
68
68
|
if (!v.value) {
|
|
69
69
|
ERROR(Errors.InvalidParam, 'constants type')
|
|
70
70
|
}
|
|
71
|
-
|
|
71
|
+
const n = insertAtHead(v.value!, v.type);
|
|
72
72
|
txb.moveCall({
|
|
73
73
|
target:Protocol.Instance().GuardFn("constant_add") as FnCallType,
|
|
74
|
-
arguments:[guard, txb.pure.u8(k), txb.pure.
|
|
74
|
+
arguments:[guard, txb.pure.u8(k), txb.pure.vector('u8', [].slice.call(n)), txb.pure.bool(true)]
|
|
75
75
|
})
|
|
76
76
|
}
|
|
77
77
|
});
|
|
@@ -98,111 +98,120 @@ export class Guard {
|
|
|
98
98
|
|
|
99
99
|
static QUERIES:any[] = [
|
|
100
100
|
// module, 'name', 'id', [input], output
|
|
101
|
-
[MODULES.permission, '
|
|
102
|
-
[MODULES.permission, '
|
|
103
|
-
[MODULES.permission, 'Has Rights', 3, [ValueType.TYPE_ADDRESS, ValueType.TYPE_U64], ValueType.TYPE_BOOL],
|
|
104
|
-
[MODULES.permission, 'Contains Address', 4, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL],
|
|
105
|
-
[MODULES.permission, 'Contains
|
|
106
|
-
[MODULES.permission, 'Contains Guard
|
|
107
|
-
[MODULES.permission, 'Guard
|
|
108
|
-
[MODULES.permission, '
|
|
109
|
-
[MODULES.permission, 'Admin
|
|
101
|
+
[MODULES.permission, 'Owner', 1, [], ValueType.TYPE_ADDRESS, "Owner's address."],
|
|
102
|
+
[MODULES.permission, 'Is Admin', 2, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Is a certain address an administrator?', 'Input:address'],
|
|
103
|
+
[MODULES.permission, 'Has Rights', 3, [ValueType.TYPE_ADDRESS, ValueType.TYPE_U64], ValueType.TYPE_BOOL, 'Does an address have a certain permission(Admin always have permissions)?', 'Input 1:address; Input 2:permission index'],
|
|
104
|
+
[MODULES.permission, 'Contains Address', 4, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Whether an address is included in the personnel permission table?', 'Input:address'],
|
|
105
|
+
[MODULES.permission, 'Contains Permission', 5, [ValueType.TYPE_ADDRESS, ValueType.TYPE_U64], ValueType.TYPE_BOOL, 'Whether a certain permission for a certain address is defined in the personnel permission table?', 'Input 1:address; Input 2:permission index'],
|
|
106
|
+
[MODULES.permission, 'Contains Permission Guard', 6, [ValueType.TYPE_ADDRESS, ValueType.TYPE_U64], ValueType.TYPE_BOOL, 'Whether a permission guard for a certain address is defined in the personnel permission table?', 'Input 1:address; Input 2:permission index'],
|
|
107
|
+
[MODULES.permission, 'Permission Guard', 7, [ValueType.TYPE_ADDRESS, ValueType.TYPE_U64], ValueType.TYPE_ADDRESS, 'Permission guard for a certain address.', 'Input 1:address; Input 2:permission index'],
|
|
108
|
+
[MODULES.permission, 'Number of Entities', 8, [], ValueType.TYPE_U64, 'Number of entities in the personnel permission table.'],
|
|
109
|
+
[MODULES.permission, 'Number of Admin', 9, [], ValueType.TYPE_U64, 'Number of administrators.'],
|
|
110
110
|
|
|
111
|
-
[MODULES.repository, 'Permission', 11, [], ValueType.TYPE_ADDRESS],
|
|
112
|
-
[MODULES.repository, 'Contains Policy', 12, [ValueType.TYPE_STRING], ValueType.TYPE_BOOL],
|
|
113
|
-
[MODULES.repository, '
|
|
114
|
-
[MODULES.repository, 'Permission of Policy', 14, [ValueType.TYPE_STRING], ValueType.TYPE_U64],
|
|
115
|
-
[MODULES.repository, 'Value Type of Policy', 15, [ValueType.TYPE_STRING], ValueType.TYPE_U8],
|
|
116
|
-
[MODULES.repository, 'Contains
|
|
117
|
-
[MODULES.repository, 'Contains
|
|
118
|
-
[MODULES.repository, '
|
|
119
|
-
[MODULES.repository, '
|
|
120
|
-
[MODULES.repository, 'Type', 20, [], ValueType.TYPE_U8],
|
|
121
|
-
[MODULES.repository, 'Policy Mode', 21, [], ValueType.TYPE_U8],
|
|
122
|
-
[MODULES.repository, 'Reference Count', 22, [], ValueType.TYPE_U64],
|
|
123
|
-
[MODULES.repository, '
|
|
124
|
-
|
|
125
|
-
[MODULES.
|
|
126
|
-
[MODULES.
|
|
127
|
-
[MODULES.
|
|
128
|
-
[MODULES.
|
|
129
|
-
[MODULES.
|
|
130
|
-
[MODULES.
|
|
111
|
+
[MODULES.repository, 'Permission', 11, [], ValueType.TYPE_ADDRESS, 'Permission object address.'],
|
|
112
|
+
[MODULES.repository, 'Contains Policy', 12, [ValueType.TYPE_STRING], ValueType.TYPE_BOOL, 'Is a consensus policy included?', 'Input:the filed name'],
|
|
113
|
+
[MODULES.repository, 'Is Permission set of Policy', 13, [ValueType.TYPE_STRING], ValueType.TYPE_BOOL, 'Does a certain consensus policy set data operation permissions?', 'Input:the policy name'],
|
|
114
|
+
[MODULES.repository, 'Permission of Policy', 14, [ValueType.TYPE_STRING], ValueType.TYPE_U64, 'The permission index of a certain consensus policy in the Permission object.', 'Input:the policy name'],
|
|
115
|
+
[MODULES.repository, 'Value Type of Policy', 15, [ValueType.TYPE_STRING], ValueType.TYPE_U8, 'Data types defined by consensus policy.', 'Input:the policy name'],
|
|
116
|
+
[MODULES.repository, 'Contains Data for An Address', 16, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Whether data exists at a certain address?', 'Input:address'],
|
|
117
|
+
[MODULES.repository, 'Contains Data', 17, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_BOOL, 'Does it contain data for a certain field of an address?', 'Input 1:address, Input 2:the field name'],
|
|
118
|
+
[MODULES.repository, 'Raw data without Type', 18, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_VEC_U8, 'Data for a field at an address and does not contain data type information.', 'Input 1:address, Input 2:the field name'],
|
|
119
|
+
[MODULES.repository, 'Raw data', 19, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_VEC_U8, 'Data for a field at an address, and the first byte contains data type information.', 'Input 1:address, Input 2:the field name'],
|
|
120
|
+
[MODULES.repository, 'Type', 20, [], ValueType.TYPE_U8, 'The repository Type. 0: Normal; 1: Wowok greenee.'],
|
|
121
|
+
[MODULES.repository, 'Policy Mode', 21, [], ValueType.TYPE_U8, 'Policy Mode. 0: Free mode; 1: Strict mode.'],
|
|
122
|
+
[MODULES.repository, 'Reference Count', 22, [], ValueType.TYPE_U64, 'The number of times it is referenced by other objects.'],
|
|
123
|
+
[MODULES.repository, 'Is Referenced by An Object', 23, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Is it referenced by an object?', 'Input:address'],
|
|
124
|
+
[MODULES.repository, 'Data Number', 24, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_U256, 'Data for a field at an address and get unsigned integer type data.', 'Input 1:address, Input 2:the field name'],
|
|
125
|
+
[MODULES.repository, 'Data String', 25, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_STRING, 'Data for a field at an address and get string type data.', 'Input 1:address, Input 2:the field name'],
|
|
126
|
+
[MODULES.repository, 'Data Address', 26, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_ADDRESS, 'Data for a field at an address and get address type data.', 'Input 1:address, Input 2:the field name'],
|
|
127
|
+
[MODULES.repository, 'Data Bool', 27, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_BOOL, 'Data for a field at an address and get bool type data.', 'Input 1:address, Input 2:the field name'],
|
|
128
|
+
[MODULES.repository, 'Data Number Vector', 28, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_VEC_U256, 'Data for a field at an address and get unsigned integer vector type data.', 'Input 1:address, Input 2:the field name'],
|
|
129
|
+
[MODULES.repository, 'Data String Vector', 29, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_VEC_STRING, 'Data for a field at an address and get string vector type data.', 'Input 1:address, Input 2:the field name'],
|
|
130
|
+
[MODULES.repository, 'Data Address Vector', 30, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_VEC_ADDRESS, 'Data for a field at an address and get address vector type data.', 'Input 1:address, Input 2:the field name'],
|
|
131
|
+
[MODULES.repository, 'Data Bool Vector', 31, [ValueType.TYPE_ADDRESS, ValueType.TYPE_STRING], ValueType.TYPE_VEC_BOOL, 'Data for a field at an address and get bool vector type data.', 'Input 1:address, Input 2:the field name'],
|
|
132
|
+
|
|
133
|
+
// , means that data fields and data outside the consensus policy definition are allowed to be written
|
|
134
|
+
// , means that only data fields and data defined by the consensus policy are allowed to be written.
|
|
135
|
+
[MODULES.machine, 'Permission', 41, [], ValueType.TYPE_ADDRESS, 'Permission object address.'],
|
|
136
|
+
[MODULES.machine, 'Paused', 42, [], ValueType.TYPE_BOOL, 'Pause the creation of new Progress?'],
|
|
137
|
+
[MODULES.machine, 'Published', 43, [], ValueType.TYPE_BOOL, 'Is it allowed to create Progress?'],
|
|
138
|
+
[MODULES.machine, 'Is Consensus Repository', 44, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Whether an address is a consensus repository?', 'Input:adddress'],
|
|
139
|
+
[MODULES.machine, 'Has Endpoint', 45, [], ValueType.TYPE_BOOL, 'Is the endpoint set?'],
|
|
140
|
+
[MODULES.machine, 'Endpoint', 46, [], ValueType.TYPE_STRING, 'Endpoint url/ipfs.'],
|
|
131
141
|
|
|
132
|
-
[MODULES.progress, 'Machine', 51, [], ValueType.TYPE_ADDRESS],
|
|
133
|
-
[MODULES.progress, 'Current Node', 52, [], ValueType.TYPE_STRING],
|
|
134
|
-
[MODULES.progress, 'Has Parent', 53, [], ValueType.TYPE_BOOL],
|
|
135
|
-
[MODULES.progress, 'Parent', 54, [], ValueType.TYPE_ADDRESS],
|
|
136
|
-
[MODULES.progress, 'Has Task', 55, [], ValueType.TYPE_BOOL],
|
|
137
|
-
[MODULES.progress, 'Task', 56, [], ValueType.TYPE_ADDRESS],
|
|
138
|
-
[MODULES.progress, 'Has
|
|
139
|
-
[MODULES.progress, 'Is
|
|
140
|
-
[MODULES.progress, 'Has Context Repository', 59, [], ValueType.TYPE_BOOL],
|
|
141
|
-
[MODULES.progress, 'Context Repository', 60, [], ValueType.TYPE_ADDRESS],
|
|
142
|
-
[MODULES.progress, 'Last
|
|
143
|
-
[MODULES.progress, 'Session
|
|
144
|
-
|
|
145
|
-
[MODULES.demand, 'Permission', 71, [], ValueType.TYPE_ADDRESS],
|
|
146
|
-
[MODULES.demand, 'Has Deadline', 72, [], ValueType.TYPE_BOOL],
|
|
147
|
-
[MODULES.demand, 'Deadline', 73, [], ValueType.TYPE_U64],
|
|
148
|
-
[MODULES.demand, 'Bounty Count', 74, [], ValueType.TYPE_U64],
|
|
149
|
-
[MODULES.demand, 'Has Guard', 75, [], ValueType.TYPE_BOOL],
|
|
150
|
-
[MODULES.demand, 'Guard', 76, [], ValueType.TYPE_ADDRESS],
|
|
151
|
-
[MODULES.demand, 'Has Service Picked', 77, [], ValueType.TYPE_BOOL],
|
|
152
|
-
[MODULES.demand, 'Service Picked', 78, [], ValueType.TYPE_ADDRESS],
|
|
153
|
-
[MODULES.demand, 'Presenter Count', 79, [], ValueType.TYPE_U64],
|
|
154
|
-
[MODULES.demand, '
|
|
155
|
-
[MODULES.demand, 'Who Got Bounty', 81, [ValueType.TYPE_ADDRESS], ValueType.TYPE_ADDRESS],
|
|
142
|
+
[MODULES.progress, 'Machine', 51, [], ValueType.TYPE_ADDRESS, 'The Machine object that created this Progress.'],
|
|
143
|
+
[MODULES.progress, 'Current Node', 52, [], ValueType.TYPE_STRING, 'The name of the currently running node.'],
|
|
144
|
+
[MODULES.progress, 'Has Parent', 53, [], ValueType.TYPE_BOOL, 'Is the parent Progress defined?'],
|
|
145
|
+
[MODULES.progress, 'Parent', 54, [], ValueType.TYPE_ADDRESS, 'The parent Progress, that contains some child Progress.'],
|
|
146
|
+
[MODULES.progress, 'Has Task', 55, [], ValueType.TYPE_BOOL, 'Does it contain clear task(eg. an Order)?'],
|
|
147
|
+
[MODULES.progress, 'Task', 56, [], ValueType.TYPE_ADDRESS, 'Task object address.'],
|
|
148
|
+
[MODULES.progress, 'Has Unique Permission', 57, [ValueType.TYPE_STRING], ValueType.TYPE_BOOL, 'Does Progress define a unique operation permission?', 'Input:opertor name'],
|
|
149
|
+
[MODULES.progress, 'Is Unique Permission Operator', 58, [ValueType.TYPE_STRING, ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Is an address an operator with unique permissions?', 'Input 1:operator name; Input 2:address'],
|
|
150
|
+
[MODULES.progress, 'Has Context Repository', 59, [], ValueType.TYPE_BOOL, 'Whether the repository reference for Progress is set?'],
|
|
151
|
+
[MODULES.progress, 'Context Repository', 60, [], ValueType.TYPE_ADDRESS, 'Repository reference for Progress.'],
|
|
152
|
+
[MODULES.progress, 'Last Session Time', 61, [], ValueType.TYPE_U64, 'Time when the previous session was completed.'],
|
|
153
|
+
[MODULES.progress, 'Session Time', 62, [ValueType.TYPE_STRING], ValueType.TYPE_U64, 'Time a node completes its session.', 'Input:the node name'],
|
|
154
|
+
|
|
155
|
+
[MODULES.demand, 'Permission', 71, [], ValueType.TYPE_ADDRESS, 'Permission object address.'],
|
|
156
|
+
[MODULES.demand, 'Has Deadline', 72, [], ValueType.TYPE_BOOL, 'Whether to set the expiration time of presenting?'],
|
|
157
|
+
[MODULES.demand, 'Deadline', 73, [], ValueType.TYPE_U64, 'The expiration time of presenting.'],
|
|
158
|
+
[MODULES.demand, 'Bounty Count', 74, [], ValueType.TYPE_U64, 'Number of Bounties.'],
|
|
159
|
+
[MODULES.demand, 'Has Guard', 75, [], ValueType.TYPE_BOOL, 'Whether the present guard is set?'],
|
|
160
|
+
[MODULES.demand, 'Guard', 76, [], ValueType.TYPE_ADDRESS, 'The present guard address.'],
|
|
161
|
+
[MODULES.demand, 'Has Service Picked', 77, [], ValueType.TYPE_BOOL, 'Whether a service has been picked and bounties given?'],
|
|
162
|
+
[MODULES.demand, 'Service Picked', 78, [], ValueType.TYPE_ADDRESS, 'Service address that has been picked.'],
|
|
163
|
+
[MODULES.demand, 'Presenter Count', 79, [], ValueType.TYPE_U64, 'Number of presenters.'],
|
|
164
|
+
[MODULES.demand, 'Has Presenter', 80, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Is a certain address a presenter?', 'Input:address'],
|
|
165
|
+
[MODULES.demand, 'Who Got Bounty', 81, [ValueType.TYPE_ADDRESS], ValueType.TYPE_ADDRESS, 'The address that bounties given.', 'Input:address'],
|
|
156
166
|
|
|
157
|
-
[MODULES.order, 'Amount', 91, [], ValueType.TYPE_U64],
|
|
158
|
-
[MODULES.order, 'Payer', 92, [], ValueType.TYPE_ADDRESS],
|
|
159
|
-
[MODULES.order, 'Service', 93, [], ValueType.TYPE_ADDRESS],
|
|
160
|
-
[MODULES.order, 'Has Progress', 94, [], ValueType.TYPE_BOOL],
|
|
161
|
-
[MODULES.order, 'Progress', 95, [], ValueType.TYPE_ADDRESS],
|
|
162
|
-
[MODULES.order, 'Required Info Counts', 96, [], ValueType.TYPE_U64],
|
|
163
|
-
[MODULES.order, 'Discount Used', 97, [], ValueType.TYPE_BOOL],
|
|
164
|
-
[MODULES.order, 'Discount', 98, [], ValueType.TYPE_ADDRESS],
|
|
165
|
-
[MODULES.order, 'Balance', 99, [], ValueType.TYPE_U64],
|
|
166
|
-
[MODULES.order, '
|
|
167
|
-
[MODULES.order, '
|
|
167
|
+
[MODULES.order, 'Amount', 91, [], ValueType.TYPE_U64, 'Order amount.'],
|
|
168
|
+
[MODULES.order, 'Payer', 92, [], ValueType.TYPE_ADDRESS, 'Order payer.'],
|
|
169
|
+
[MODULES.order, 'Service', 93, [], ValueType.TYPE_ADDRESS, 'Service for creating orders.'],
|
|
170
|
+
[MODULES.order, 'Has Progress', 94, [], ValueType.TYPE_BOOL, 'Is there a Progress for executing the order process?'],
|
|
171
|
+
[MODULES.order, 'Progress', 95, [], ValueType.TYPE_ADDRESS, 'Progress address for executing the order process.'],
|
|
172
|
+
[MODULES.order, 'Required Info Counts', 96, [], ValueType.TYPE_U64, 'How much customer information is required for this order?'],
|
|
173
|
+
[MODULES.order, 'Discount Used', 97, [], ValueType.TYPE_BOOL, 'Discount coupon used for this order?'],
|
|
174
|
+
[MODULES.order, 'Discount', 98, [], ValueType.TYPE_ADDRESS, 'Discount address that already used.'],
|
|
175
|
+
[MODULES.order, 'Balance', 99, [], ValueType.TYPE_U64, 'The amount currently in the order.'],
|
|
176
|
+
[MODULES.order, 'Refunded', 100, [], ValueType.TYPE_BOOL, 'Whether a refund has occurred?'],
|
|
177
|
+
[MODULES.order, 'Withdrawed', 101, [], ValueType.TYPE_BOOL, 'Whether a service provider withdrawal has occurred?'],
|
|
168
178
|
|
|
169
|
-
[MODULES.service, 'Permission', 111, [], ValueType.TYPE_ADDRESS],
|
|
170
|
-
[MODULES.service, 'Payee', 112, [], ValueType.TYPE_ADDRESS],
|
|
171
|
-
[MODULES.service, 'Has
|
|
172
|
-
[MODULES.service, '
|
|
173
|
-
[MODULES.service, 'Contains Repository', 115, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL],
|
|
174
|
-
[MODULES.service, 'Has
|
|
175
|
-
[MODULES.service, '
|
|
176
|
-
[MODULES.service, 'Has
|
|
177
|
-
[MODULES.service, '
|
|
178
|
-
[MODULES.service, 'Has
|
|
179
|
-
[MODULES.service, 'Sale Item Price', 121, [ValueType.TYPE_STRING], ValueType.TYPE_U64],
|
|
180
|
-
[MODULES.service, 'Sale Item Inventory', 122, [ValueType.TYPE_STRING], ValueType.TYPE_U64],
|
|
181
|
-
[MODULES.service, 'Has Machine', 123, [], ValueType.TYPE_BOOL],
|
|
182
|
-
[MODULES.service, 'Machine', 124, [], ValueType.TYPE_ADDRESS],
|
|
183
|
-
[MODULES.service, 'Paused', 125, [], ValueType.TYPE_BOOL],
|
|
184
|
-
[MODULES.service, 'Published', 126, [], ValueType.TYPE_BOOL],
|
|
185
|
-
[MODULES.service, 'Has Required Info', 127, [], ValueType.TYPE_BOOL],
|
|
186
|
-
[MODULES.service, 'Required Info of Service-Pubkey', 128, [], ValueType.TYPE_STRING],
|
|
187
|
-
[MODULES.service, 'Required Info', 129, [], ValueType.
|
|
179
|
+
[MODULES.service, 'Permission', 111, [], ValueType.TYPE_ADDRESS, 'Permission object address.'],
|
|
180
|
+
[MODULES.service, 'Payee', 112, [], ValueType.TYPE_ADDRESS, 'Payee address, that all order withdrawals will be collected to this address.'],
|
|
181
|
+
[MODULES.service, 'Has Buying Guard', 113, [], ValueType.TYPE_BOOL, 'Is the guard condition of buying set?'],
|
|
182
|
+
[MODULES.service, 'Buying Guard', 114, [], ValueType.TYPE_ADDRESS, 'Buying guard, that Purchase only if you meet the conditions of the guard.'],
|
|
183
|
+
[MODULES.service, 'Contains Repository', 115, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, "Is a certain repository one of the service's consensus repositories?", 'Input:address'],
|
|
184
|
+
[MODULES.service, 'Has Withdrawing Guard', 116, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Whether a certain guard is set when withdrawing money?', 'Input:address'],
|
|
185
|
+
[MODULES.service, 'Withdrawing Guard Percent', 117, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64, 'The percentage of withdrawals allowed by a certain withdrawal guard.', 'Input:address'],
|
|
186
|
+
[MODULES.service, 'Has Refunding Guard', 118, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Whether a certain guard is set when refunding money?', 'Input:address'],
|
|
187
|
+
[MODULES.service, 'Refunding Guard Percent', 119, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64, 'The percentage of refund allowed by a certain refund guard.', 'Input:address'],
|
|
188
|
+
[MODULES.service, 'Has Sales Item', 120, [ValueType.TYPE_STRING], ValueType.TYPE_BOOL, 'Is there a sales item for the service?', 'Input:the item name'],
|
|
189
|
+
[MODULES.service, 'Sale Item Price', 121, [ValueType.TYPE_STRING], ValueType.TYPE_U64, 'What is the price of a certain sale item?', 'Input:the item name'],
|
|
190
|
+
[MODULES.service, 'Sale Item Inventory', 122, [ValueType.TYPE_STRING], ValueType.TYPE_U64, 'How much inventory is there for a certain sales item?', 'Input:the item name'],
|
|
191
|
+
[MODULES.service, 'Has Machine', 123, [], ValueType.TYPE_BOOL, "Has the machine(progress generator) that serves the order been set up?"],
|
|
192
|
+
[MODULES.service, 'Machine', 124, [], ValueType.TYPE_ADDRESS, 'Machine address, that generate progresses serving the execution process of order.'],
|
|
193
|
+
[MODULES.service, 'Paused', 125, [], ValueType.TYPE_BOOL, 'Pause the creation of new order?'],
|
|
194
|
+
[MODULES.service, 'Published', 126, [], ValueType.TYPE_BOOL, 'Is it allowed to create orders?'],
|
|
195
|
+
[MODULES.service, 'Has Required Info', 127, [], ValueType.TYPE_BOOL, 'Whether the necessary information that needs to be provided by the customer is set?'],
|
|
196
|
+
[MODULES.service, 'Required Info of Service-Pubkey', 128, [], ValueType.TYPE_STRING, 'The public key used to encrypt customer information, and only the service provider can decrypt and view customer information.'],
|
|
197
|
+
[MODULES.service, 'Required Info', 129, [], ValueType.TYPE_VEC_STRING, 'Names of the required information item that needs to be provided by the customer.'],
|
|
188
198
|
|
|
189
|
-
[MODULES.reward, 'Permission', 151, [], ValueType.TYPE_ADDRESS],
|
|
190
|
-
[MODULES.reward, '
|
|
191
|
-
[MODULES.reward, 'Reward Count Supplied', 153, [], ValueType.TYPE_U64],
|
|
192
|
-
[MODULES.reward, 'Guard Count', 154, [], ValueType.TYPE_U64],
|
|
193
|
-
[MODULES.reward, 'Has Guard', 155, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL],
|
|
194
|
-
[MODULES.reward, 'Guard Portion', 156, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64],
|
|
195
|
-
[MODULES.reward, 'Deadline', 157, [], ValueType.TYPE_U64],
|
|
196
|
-
[MODULES.reward, 'Has Claimed by Address', 158, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL],
|
|
197
|
-
[MODULES.reward, 'Claimed by Address', 159, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64],
|
|
198
|
-
[MODULES.reward, '
|
|
199
|
-
[MODULES.reward, 'Is Sponsor', 161, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL],
|
|
200
|
-
[MODULES.reward, '
|
|
201
|
-
[MODULES.reward, '
|
|
202
|
-
[MODULES.reward, 'Allow
|
|
203
|
-
[MODULES.reward, 'Claimed Portion by Address', 165, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64],
|
|
199
|
+
[MODULES.reward, 'Permission', 151, [], ValueType.TYPE_ADDRESS, 'Permission object address.'],
|
|
200
|
+
[MODULES.reward, 'Rewards Remaining', 152, [], ValueType.TYPE_U64, 'Number of rewards to be claimed.'],
|
|
201
|
+
[MODULES.reward, 'Reward Count Supplied', 153, [], ValueType.TYPE_U64, 'Total rewards supplied.'],
|
|
202
|
+
[MODULES.reward, 'Guard Count', 154, [], ValueType.TYPE_U64, 'The number of claiming guards.'],
|
|
203
|
+
[MODULES.reward, 'Has Guard', 155, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Whether a claiming guard is set up?', 'Input:address'],
|
|
204
|
+
[MODULES.reward, 'Guard Portion', 156, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64, 'The portions of rewards, that can be claimed if a certain guard condition is met.', 'Input:address'],
|
|
205
|
+
[MODULES.reward, 'Deadline', 157, [], ValueType.TYPE_U64, 'The expiration time of claiming.'],
|
|
206
|
+
[MODULES.reward, 'Has Claimed by An Address', 158, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Whether a certain address has claimed rewards?', 'Input:address'],
|
|
207
|
+
[MODULES.reward, 'Portions Claimed by An Address', 159, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64, 'The portions of rewards that have been claimed by a certain address.'],
|
|
208
|
+
[MODULES.reward, 'Number of Addresses Claimed', 160, [], ValueType.TYPE_U64, 'Number of addresses that have claimed rewards.'],
|
|
209
|
+
[MODULES.reward, 'Is Sponsor', 161, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Whether an address is a sponsor of the reward pool?', 'Input:address'],
|
|
210
|
+
[MODULES.reward, 'Portions by A Sponsor', 162, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64, 'The portions of sponsorship reward pools for a certain address.', 'Input:address'],
|
|
211
|
+
[MODULES.reward, 'Number of Sponsors', 163, [], ValueType.TYPE_U64, 'Number of sponsors in the sponsorship reward pool.'],
|
|
212
|
+
[MODULES.reward, 'Allow Repeated Claims', 164, [], ValueType.TYPE_BOOL, 'Whether to allow repeated claims?'],
|
|
204
213
|
|
|
205
|
-
[MODULES.vote, 'Permission', 171, [], ValueType.TYPE_ADDRESS],
|
|
214
|
+
/* [MODULES.vote, 'Permission', 171, [], ValueType.TYPE_ADDRESS],
|
|
206
215
|
[MODULES.vote, 'Options Locked', 172, [], ValueType.TYPE_BOOL],
|
|
207
216
|
[MODULES.vote, 'Deadline Locked', 173, [], ValueType.TYPE_BOOL],
|
|
208
217
|
[MODULES.vote, 'Vote-Guard Locked', 174, [], ValueType.TYPE_BOOL],
|
|
@@ -223,24 +232,24 @@ export class Guard {
|
|
|
223
232
|
[MODULES.vote, 'Top1 Option by Addresses', 189, [], ValueType.TYPE_STRING],
|
|
224
233
|
[MODULES.vote, 'Top1 Count by Addresses', 190, [], ValueType.TYPE_U64],
|
|
225
234
|
[MODULES.vote, 'Top1 Option by Votes', 191, [], ValueType.TYPE_STRING],
|
|
226
|
-
[MODULES.vote, 'Top1 Count by Votes', 192, [], ValueType.TYPE_U64],
|
|
227
|
-
|
|
228
|
-
[MODULES.wowok, 'Builder', 210, [], ValueType.TYPE_ADDRESS],
|
|
229
|
-
[MODULES.wowok, 'Everyone
|
|
230
|
-
[MODULES.wowok, 'Object of Entities', 212, [], ValueType.TYPE_ADDRESS],
|
|
231
|
-
[MODULES.wowok, 'Grantor Count', 213, [], ValueType.TYPE_U64],
|
|
232
|
-
[MODULES.wowok, 'Has Grantor', 214, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL],
|
|
233
|
-
[MODULES.wowok, 'Grantor Name', 215, [ValueType.TYPE_ADDRESS], ValueType.TYPE_STRING],
|
|
234
|
-
[MODULES.wowok, 'Grantor Registration Time', 216, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64],
|
|
235
|
-
[MODULES.wowok, 'Grantor Expired Time', 217, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64],
|
|
236
|
-
[MODULES.wowok, 'Grantee Object for Grantor', 218, [ValueType.TYPE_ADDRESS], ValueType.TYPE_ADDRESS],
|
|
237
|
-
|
|
238
|
-
[MODULES.entity, '
|
|
239
|
-
[MODULES.entity, 'Likes', 231, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64],
|
|
240
|
-
[MODULES.entity, 'Dislikes', 232, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64],
|
|
241
|
-
[MODULES.entity, 'Entity Info', 233, [ValueType.TYPE_ADDRESS], ValueType.TYPE_VEC_U8],
|
|
242
|
-
[MODULES.entity, 'Has Resource by Entity', 234, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL],
|
|
243
|
-
[MODULES.entity, 'Entity Resource', 235, [ValueType.TYPE_ADDRESS], ValueType.TYPE_ADDRESS],
|
|
235
|
+
[MODULES.vote, 'Top1 Count by Votes', 192, [], ValueType.TYPE_U64], */
|
|
236
|
+
|
|
237
|
+
[MODULES.wowok, 'Builder', 210, [], ValueType.TYPE_ADDRESS, 'Builder address of Wowok.'],
|
|
238
|
+
[MODULES.wowok, 'Everyone Guard', 211, [], ValueType.TYPE_ADDRESS, 'A guard that all addresses can pass through.'],
|
|
239
|
+
[MODULES.wowok, 'Object of Entities', 212, [], ValueType.TYPE_ADDRESS, 'The address of entity information object.'],
|
|
240
|
+
[MODULES.wowok, 'Grantor Count', 213, [], ValueType.TYPE_U64, 'Number of registered grantors.'],
|
|
241
|
+
[MODULES.wowok, 'Has Grantor', 214, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Whether an address has been registered as a grantor?', , 'Input:address'],
|
|
242
|
+
[MODULES.wowok, 'Grantor Name', 215, [ValueType.TYPE_ADDRESS], ValueType.TYPE_STRING, "Name of a grantor.", 'Input:address'],
|
|
243
|
+
[MODULES.wowok, 'Grantor Registration Time', 216, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64, 'Registration time of a grantor.', 'Input:address'],
|
|
244
|
+
[MODULES.wowok, 'Grantor Expired Time', 217, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64, 'The expiration time of a grantor.', 'Input:address'],
|
|
245
|
+
[MODULES.wowok, 'Grantee Object for Grantor', 218, [ValueType.TYPE_ADDRESS], ValueType.TYPE_ADDRESS, 'Grantee repository address of a grantor.', 'Input:address'],
|
|
246
|
+
|
|
247
|
+
[MODULES.entity, 'Contains Entity?', 230, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Is an entity already registered?', 'Input:address'],
|
|
248
|
+
[MODULES.entity, 'Likes', 231, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64, 'The number of likes for an address by other addresses.', 'Input:address'],
|
|
249
|
+
[MODULES.entity, 'Dislikes', 232, [ValueType.TYPE_ADDRESS], ValueType.TYPE_U64, 'The number of dislikes for an address by other addresses.', 'Input:address'],
|
|
250
|
+
[MODULES.entity, 'Entity Info', 233, [ValueType.TYPE_ADDRESS], ValueType.TYPE_VEC_U8, 'Public information about an entity.', 'Input:address'],
|
|
251
|
+
[MODULES.entity, 'Has Resource by Entity?', 234, [ValueType.TYPE_ADDRESS], ValueType.TYPE_BOOL, 'Whether an entity created a resource?', 'Input:address'],
|
|
252
|
+
[MODULES.entity, 'Entity Resource', 235, [ValueType.TYPE_ADDRESS], ValueType.TYPE_ADDRESS, 'The address of a resource object created by an entity.', 'Input:address'],
|
|
244
253
|
];
|
|
245
254
|
|
|
246
255
|
static BoolCmd = Guard.QUERIES.filter(q => q[4] === ValueType.TYPE_BOOL);
|
|
@@ -270,34 +279,42 @@ export class Guard {
|
|
|
270
279
|
const r: Guard_Options[] = [...Guard.CmdFilter(ValueType.TYPE_U8), ...Guard.CmdFilter(ValueType.TYPE_U64),
|
|
271
280
|
...Guard.CmdFilter(ValueType.TYPE_U128), ...Guard.CmdFilter(ValueType.TYPE_U256)].map((v)=> {
|
|
272
281
|
return {from:'query', name:v[1], value:v[2], group:FirstLetterUppercase(v[0])}});
|
|
273
|
-
r.
|
|
274
|
-
r.push({from:'type', name:'PositiveNumber Add (+)', value:OperatorType.TYPE_NUMBER_ADD, group:'Number Crunching'});
|
|
275
|
-
r.push({from:'type', name:'PositiveNumber Subtract (-)', value:OperatorType.TYPE_NUMBER_SUBTRACT, group:'Number Crunching'});
|
|
276
|
-
r.push({from:'type', name:'PositiveNumber Multiply (*)', value:OperatorType.TYPE_NUMBER_MULTIPLY, group:'Number Crunching'});
|
|
277
|
-
r.push({from:'type', name:'PositiveNumber Devide (/)', value:OperatorType.TYPE_NUMBER_DEVIDE, group:'Number Crunching'});
|
|
278
|
-
r.push({from:'type', name:'PositiveNumber Mod (%)', value:OperatorType.TYPE_NUMBER_MOD, group:'Number Crunching'});
|
|
279
|
-
return r;
|
|
282
|
+
return r.concat(Guard.Crunchings);
|
|
280
283
|
}
|
|
281
284
|
|
|
285
|
+
static Signer:Guard_Options = {from:'type', name:'Txn Signer', value:ContextType.TYPE_SIGNER, group:'Txn Functions'};
|
|
286
|
+
static Time:Guard_Options = {from:'type', name:'Txn Time', value:ContextType.TYPE_CLOCK, group:'Txn Functions'};
|
|
287
|
+
static Logics = () :Guard_Options[] => LogicsInfo.map((v) => { return {from:'type', name:v[1] as string, value:v[0] as number, group:'Compare or Logic'}});
|
|
288
|
+
static Crunchings: Guard_Options[] = [
|
|
289
|
+
{from:'type', name:'Txn Time', value:ContextType.TYPE_CLOCK, group:'Txn Functions'},
|
|
290
|
+
{from:'type', name:'PositiveNumber Add (+)', value:OperatorType.TYPE_NUMBER_ADD, group:'Number Crunching'},
|
|
291
|
+
{from:'type', name:'PositiveNumber Subtract (-)', value:OperatorType.TYPE_NUMBER_SUBTRACT, group:'Number Crunching'},
|
|
292
|
+
{from:'type', name:'PositiveNumber Multiply (*)', value:OperatorType.TYPE_NUMBER_MULTIPLY, group:'Number Crunching'},
|
|
293
|
+
{from:'type', name:'PositiveNumber Devide (/)', value:OperatorType.TYPE_NUMBER_DEVIDE, group:'Number Crunching'},
|
|
294
|
+
{from:'type', name:'PositiveNumber Mod (%)', value:OperatorType.TYPE_NUMBER_MOD, group:'Number Crunching'},
|
|
295
|
+
]
|
|
296
|
+
|
|
282
297
|
static CommonOptions = (retType:ValueType) : Guard_Options[] => {
|
|
283
298
|
return Guard.CmdFilter(retType).map((v)=> {return {from:'query', name:v[1], value:v[2], group:FirstLetterUppercase(v[0])}});
|
|
284
299
|
}
|
|
300
|
+
|
|
285
301
|
static AllOptions = () : Guard_Options[] => {
|
|
286
|
-
|
|
302
|
+
var r:Guard_Options[] = Guard.QUERIES.map((v)=>{return {from:'query', name:v[1], value:v[2], group:FirstLetterUppercase(v[0])}});
|
|
303
|
+
return [...r, ...Guard.Crunchings, ...Guard.Logics(), Guard.Signer, Guard.Time]
|
|
287
304
|
}
|
|
305
|
+
|
|
288
306
|
static StringOptions = () : Guard_Options[] => {
|
|
289
|
-
return [...Guard.CmdFilter(ValueType.
|
|
307
|
+
return [...Guard.CmdFilter(ValueType.TYPE_STRING)].map((v) => {
|
|
290
308
|
return {from:'query', name:v[1], value:v[2], group:FirstLetterUppercase(v[0])};
|
|
291
309
|
});
|
|
292
310
|
}
|
|
293
311
|
static BoolOptions = () : Guard_Options[] => {
|
|
294
312
|
const n1:Guard_Options[] = Guard.BoolCmd.map((v)=> { return {from:'query', name:v[1], value:v[2], group:FirstLetterUppercase(v[0])}});
|
|
295
|
-
|
|
296
|
-
return [...n1, ...n2]
|
|
313
|
+
return [...n1, ...Guard.Logics()];
|
|
297
314
|
}
|
|
298
315
|
static AddressOptions = () : Guard_Options[] => {
|
|
299
316
|
const n1:Guard_Options[] = Guard.QUERIES.filter(q => q[4] === ValueType.TYPE_ADDRESS).map((v)=> { return {from:'query', name:v[1], value:v[2], group:FirstLetterUppercase(v[0])}});
|
|
300
|
-
n1.push(
|
|
317
|
+
n1.push(Guard.Signer);
|
|
301
318
|
return [...n1]
|
|
302
319
|
}
|
|
303
320
|
|
|
@@ -355,8 +372,13 @@ export class GuardConstantHelper {
|
|
|
355
372
|
}
|
|
356
373
|
|
|
357
374
|
static add_constant(constants:GuardConstant, identifier:number, type:ValueType, value:any, bNeedSerialize=true) {
|
|
358
|
-
|
|
359
|
-
if (!
|
|
375
|
+
const e = SER_VALUE.find((v:any)=>v.type===type)?.name ?? '' + ' invalid';
|
|
376
|
+
if (!GuardConstantHelper.IsValidIndentifier(identifier)) {
|
|
377
|
+
ERROR(Errors.InvalidParam, 'add_constant identifier')
|
|
378
|
+
}
|
|
379
|
+
if (value === undefined) {
|
|
380
|
+
ERROR(Errors.InvalidParam, 'add_constant value')
|
|
381
|
+
}
|
|
360
382
|
|
|
361
383
|
switch (type) {
|
|
362
384
|
case ValueType.TYPE_BOOL:
|
|
@@ -377,27 +399,28 @@ export class GuardConstantHelper {
|
|
|
377
399
|
case ValueType.TYPE_VEC_BOOL:
|
|
378
400
|
case ValueType.TYPE_VEC_U128:
|
|
379
401
|
case ValueType.TYPE_VEC_U256:
|
|
380
|
-
|
|
381
|
-
if (!ser) ERROR(Errors.Fail, 'add_constant: invalid type');
|
|
382
|
-
bNeedSerialize ? constants.set(identifier, {type:type, value:Bcs.getInstance().ser(ser!.type as number, value)}) :
|
|
383
|
-
constants.set(identifier, {type:type, value:value})
|
|
384
|
-
return
|
|
402
|
+
case ValueType.TYPE_STRING:
|
|
385
403
|
case ValueType.TYPE_VEC_U8:
|
|
386
|
-
|
|
387
|
-
|
|
404
|
+
case ValueType.TYPE_OPTION_STRING:
|
|
405
|
+
case ValueType.TYPE_OPTION_VEC_U8:
|
|
406
|
+
case ValueType.TYPE_VEC_STRING:
|
|
407
|
+
let ser = SER_VALUE.find(s=>s.type==type);
|
|
408
|
+
if (!ser) ERROR(Errors.Fail, 'add_constant: invalid type:'+e);
|
|
409
|
+
if (bNeedSerialize) {
|
|
410
|
+
constants.set(identifier, {type:type, value:Bcs.getInstance().ser(type, value)})
|
|
388
411
|
} else {
|
|
389
|
-
constants.set(identifier,
|
|
412
|
+
constants.set(identifier, {type:type, value:value})
|
|
390
413
|
}
|
|
391
|
-
return
|
|
414
|
+
return
|
|
392
415
|
default:
|
|
393
|
-
ERROR(Errors.Fail, 'add_constant serialize not impl yet')
|
|
416
|
+
ERROR(Errors.Fail, 'add_constant serialize not impl yet:'+e)
|
|
394
417
|
}
|
|
395
418
|
}
|
|
396
419
|
}
|
|
397
420
|
export class GuardMaker {
|
|
398
421
|
protected data : Uint8Array[] = [];
|
|
399
422
|
protected type_validator : Data_Type[] = [];
|
|
400
|
-
protected constant : GuardConstant = new Map();
|
|
423
|
+
protected constant : GuardConstant = new Map<number, Guard_Variable>();
|
|
401
424
|
|
|
402
425
|
private static index: number = 0;
|
|
403
426
|
private static get_index() {
|
|
@@ -409,9 +432,9 @@ export class GuardMaker {
|
|
|
409
432
|
|
|
410
433
|
constructor() { }
|
|
411
434
|
|
|
412
|
-
add_constant(type:ConstantType, value:any, bNeedSerialize=true) : number {
|
|
413
|
-
|
|
414
|
-
if (type
|
|
435
|
+
add_constant(type:ConstantType, value:any, identifier?:number, bNeedSerialize=true) : number {
|
|
436
|
+
if (identifier === undefined) identifier = GuardMaker.get_index();
|
|
437
|
+
if (type === ContextType.TYPE_WITNESS_ID) {
|
|
415
438
|
// add witness to constant
|
|
416
439
|
GuardConstantHelper.add_future_constant(this.constant, identifier, value, undefined, bNeedSerialize);
|
|
417
440
|
} else {
|
|
@@ -421,7 +444,7 @@ export class GuardMaker {
|
|
|
421
444
|
}
|
|
422
445
|
|
|
423
446
|
private serValueParam(type:ValueType, param?:any) {
|
|
424
|
-
if (
|
|
447
|
+
if (param === undefined) ERROR(Errors.InvalidParam, 'param');
|
|
425
448
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_U8, type));
|
|
426
449
|
let ser = SER_VALUE.find(s=>s.type==type);
|
|
427
450
|
if (!ser) ERROR(Errors.Fail, 'serValueParam: invalid type');
|
|
@@ -431,6 +454,8 @@ export class GuardMaker {
|
|
|
431
454
|
|
|
432
455
|
// serialize const & data
|
|
433
456
|
add_param(type:ValueType | ContextType, param?:any) : GuardMaker {
|
|
457
|
+
const e = SER_VALUE.find((v:any)=>v.type===type)?.name ?? '' + ' invalid';
|
|
458
|
+
|
|
434
459
|
switch(type) {
|
|
435
460
|
case ValueType.TYPE_ADDRESS:
|
|
436
461
|
case ValueType.TYPE_BOOL:
|
|
@@ -454,7 +479,7 @@ export class GuardMaker {
|
|
|
454
479
|
break;
|
|
455
480
|
case ValueType.TYPE_STRING:
|
|
456
481
|
case ValueType.TYPE_VEC_U8:
|
|
457
|
-
if (!param) ERROR(Errors.InvalidParam, 'param');
|
|
482
|
+
if (!param) ERROR(Errors.InvalidParam, 'param:'+e);
|
|
458
483
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_U8, type)); //@ USE VEC-U8
|
|
459
484
|
if (typeof(param) == 'string') {
|
|
460
485
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_STRING, param));
|
|
@@ -472,56 +497,56 @@ export class GuardMaker {
|
|
|
472
497
|
this.type_validator.push(ValueType.TYPE_U64);
|
|
473
498
|
break;
|
|
474
499
|
case ContextType.TYPE_WITNESS_ID:
|
|
475
|
-
if (!param) ERROR(Errors.InvalidParam, 'param');
|
|
500
|
+
if (!param) ERROR(Errors.InvalidParam, 'param:'+e);
|
|
476
501
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_U8, type));
|
|
477
502
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_ADDRESS, param));
|
|
478
503
|
this.type_validator.push(ValueType.TYPE_ADDRESS);
|
|
479
504
|
break;
|
|
480
505
|
case ContextType.TYPE_CONSTANT:
|
|
481
506
|
if (!param) {
|
|
482
|
-
ERROR(Errors.InvalidParam, 'param invalid');
|
|
507
|
+
ERROR(Errors.InvalidParam, 'param invalid:'+e);
|
|
483
508
|
}
|
|
484
509
|
if (typeof(param) != 'number' || !IsValidInt(param) || param > 255) {
|
|
485
|
-
ERROR(Errors.InvalidParam, 'add_param param');
|
|
510
|
+
ERROR(Errors.InvalidParam, 'add_param param:'+type);
|
|
486
511
|
}
|
|
487
512
|
|
|
488
513
|
var v = this.constant.get(param);
|
|
489
|
-
if (!v) ERROR(Errors.Fail, 'identifier not in constant');
|
|
514
|
+
if (!v) ERROR(Errors.Fail, 'identifier not in constant:'+e);
|
|
490
515
|
this.type_validator.push(v!.type);
|
|
491
516
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_U8, type));
|
|
492
517
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_U8, param));
|
|
493
518
|
break;
|
|
494
519
|
default:
|
|
495
|
-
ERROR(Errors.InvalidParam, 'add_param type'
|
|
520
|
+
ERROR(Errors.InvalidParam, 'add_param type:'+e);
|
|
496
521
|
};
|
|
497
522
|
return this;
|
|
498
523
|
}
|
|
499
524
|
|
|
500
525
|
// object_address_from: string for static address; number as identifier inconstant
|
|
501
|
-
add_query(module:MODULES, query_name:string, object_address_from:string | number, bWitness:boolean=false) : GuardMaker {
|
|
526
|
+
add_query(module:MODULES, query_name:string, object_address_from:string | number, bWitness:boolean=false) : GuardMaker {
|
|
502
527
|
let query_index = Guard.QUERIES.findIndex((q) => { return q[0] == module && q[1] == query_name})
|
|
503
528
|
if (query_index == -1) {
|
|
504
|
-
ERROR(Errors.InvalidParam, 'query_name');
|
|
529
|
+
ERROR(Errors.InvalidParam, 'query_name:'+query_name);
|
|
505
530
|
}
|
|
506
531
|
|
|
507
532
|
if (typeof(object_address_from) == 'number' ) {
|
|
508
533
|
if (!GuardConstantHelper.IsValidIndentifier(object_address_from)) {
|
|
509
|
-
ERROR(Errors.InvalidParam, 'object_address_from');
|
|
534
|
+
ERROR(Errors.InvalidParam, 'object_address_from:'+query_name);
|
|
510
535
|
}
|
|
511
536
|
} else {
|
|
512
537
|
if (!IsValidAddress(object_address_from)) {
|
|
513
|
-
ERROR(Errors.InvalidParam, 'object_address_from');
|
|
538
|
+
ERROR(Errors.InvalidParam, 'object_address_from:'+query_name);
|
|
514
539
|
}
|
|
515
540
|
}
|
|
516
541
|
|
|
517
542
|
let offset = this.type_validator.length - Guard.QUERIES[query_index][3].length;
|
|
518
543
|
if (offset < 0) {
|
|
519
|
-
ERROR(Errors.InvalidParam, 'query_name');
|
|
544
|
+
ERROR(Errors.InvalidParam, 'query_name:'+query_name);
|
|
520
545
|
}
|
|
521
546
|
|
|
522
547
|
let types = this.type_validator.slice(offset);
|
|
523
548
|
if (!array_equal(types, Guard.QUERIES[query_index][3])) { // type validate
|
|
524
|
-
ERROR(Errors.Fail, 'array_equal');
|
|
549
|
+
ERROR(Errors.Fail, 'array_equal:'+query_name);
|
|
525
550
|
}
|
|
526
551
|
|
|
527
552
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_U8, OperatorType.TYPE_QUERY)); // QUERY TYPE
|
|
@@ -531,12 +556,12 @@ export class GuardMaker {
|
|
|
531
556
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_ADDRESS, object_address_from)); // object address
|
|
532
557
|
} else {
|
|
533
558
|
let v = this.constant.get(object_address_from);
|
|
534
|
-
if (!v) ERROR(Errors.Fail, 'object_address_from not in constant');
|
|
559
|
+
if (!v) ERROR(Errors.Fail, 'object_address_from not in constant:'+query_name);
|
|
535
560
|
if ((bWitness && v?.type == ContextType.TYPE_WITNESS_ID) || (!bWitness && v?.type == ValueType.TYPE_ADDRESS)) {
|
|
536
561
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_U8, ContextType.TYPE_CONSTANT));
|
|
537
562
|
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_U8, object_address_from)); // object identifer in constants
|
|
538
563
|
} else {
|
|
539
|
-
ERROR(Errors.Fail, 'type bWitness not match')
|
|
564
|
+
ERROR(Errors.Fail, 'type bWitness not match:'+query_name)
|
|
540
565
|
}
|
|
541
566
|
}
|
|
542
567
|
|
|
@@ -546,7 +571,10 @@ export class GuardMaker {
|
|
|
546
571
|
return this;
|
|
547
572
|
}
|
|
548
573
|
|
|
549
|
-
add_logic(type:OperatorType) : GuardMaker {
|
|
574
|
+
add_logic(type:OperatorType, param:number=2) : GuardMaker {
|
|
575
|
+
var e:any = LogicsInfo.find((v:any) => v[0] === type);
|
|
576
|
+
if (e) { e=e[1] }
|
|
577
|
+
|
|
550
578
|
let splice_len = 2;
|
|
551
579
|
let ret = ValueType.TYPE_BOOL;
|
|
552
580
|
switch (type) {
|
|
@@ -555,26 +583,41 @@ export class GuardMaker {
|
|
|
555
583
|
case OperatorType.TYPE_LOGIC_AS_U256_LESSER:
|
|
556
584
|
case OperatorType.TYPE_LOGIC_AS_U256_LESSER_EQUAL:
|
|
557
585
|
case OperatorType.TYPE_LOGIC_AS_U256_EQUAL:
|
|
558
|
-
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length') }
|
|
559
|
-
if (!GuardMaker.match_u256(this.type_validator[this.type_validator.length - 1])) { ERROR(Errors.Fail, 'type_validator check') }
|
|
560
|
-
if (!GuardMaker.match_u256(this.type_validator[this.type_validator.length - 2])) { ERROR(Errors.Fail, 'type_validator check') }
|
|
586
|
+
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length:' + e) }
|
|
587
|
+
if (!GuardMaker.match_u256(this.type_validator[this.type_validator.length - 1])) { ERROR(Errors.Fail, 'type_validator check:'+e) }
|
|
588
|
+
if (!GuardMaker.match_u256(this.type_validator[this.type_validator.length - 2])) { ERROR(Errors.Fail, 'type_validator check:'+e) }
|
|
561
589
|
break;
|
|
562
590
|
case OperatorType.TYPE_LOGIC_EQUAL:
|
|
563
|
-
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length') }
|
|
591
|
+
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length:' + e) }
|
|
592
|
+
if (GuardMaker.match_u256(this.type_validator[this.type_validator.length - 1]) &&
|
|
593
|
+
GuardMaker.match_u256(this.type_validator[this.type_validator.length - 2])) {
|
|
594
|
+
break;
|
|
595
|
+
} else if (this.type_validator[this.type_validator.length - 1] === this.type_validator[this.type_validator.length - 2]) {
|
|
596
|
+
break;
|
|
597
|
+
} else {
|
|
598
|
+
ERROR(Errors.Fail, 'type_validator check:' + e) ;
|
|
599
|
+
}
|
|
564
600
|
break;
|
|
565
601
|
case OperatorType.TYPE_LOGIC_HAS_SUBSTRING:
|
|
566
|
-
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length') }
|
|
602
|
+
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length:' + e) }
|
|
603
|
+
if (this.type_validator[this.type_validator.length - 1] !== ValueType.TYPE_STRING ||
|
|
604
|
+
this.type_validator[this.type_validator.length - 2] !== ValueType.TYPE_STRING) {
|
|
605
|
+
ERROR(Errors.Fail, 'type_validator check:' + e) ;
|
|
606
|
+
}
|
|
567
607
|
break;
|
|
568
608
|
case OperatorType.TYPE_LOGIC_NOT:
|
|
569
609
|
splice_len = 1;
|
|
570
|
-
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length') }
|
|
571
|
-
if (this.type_validator[this.type_validator.length -1] != ValueType.TYPE_BOOL) { ERROR(Errors.Fail, 'type_validator check') }
|
|
610
|
+
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length:'+e) }
|
|
611
|
+
if (this.type_validator[this.type_validator.length -1] != ValueType.TYPE_BOOL) { ERROR(Errors.Fail, 'type_validator check:'+e) }
|
|
572
612
|
break;
|
|
573
613
|
case OperatorType.TYPE_LOGIC_AND:
|
|
574
|
-
case OperatorType.TYPE_LOGIC_OR:
|
|
575
|
-
if (
|
|
576
|
-
|
|
577
|
-
if (this.type_validator
|
|
614
|
+
case OperatorType.TYPE_LOGIC_OR: //@ logics count
|
|
615
|
+
if (!param || param < 2) ERROR(Errors.Fail, 'logic param invalid:'+e);
|
|
616
|
+
splice_len = param!;
|
|
617
|
+
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length:'+e) }
|
|
618
|
+
for (let i = 1; i <= splice_len; ++i) {
|
|
619
|
+
if (this.type_validator[this.type_validator.length -i] != ValueType.TYPE_BOOL) { ERROR(Errors.Fail, 'type_validator check:'+e) }
|
|
620
|
+
}
|
|
578
621
|
break;
|
|
579
622
|
case OperatorType.TYPE_LOGIC_ALWAYS_TRUE:
|
|
580
623
|
break;
|
|
@@ -583,15 +626,19 @@ export class GuardMaker {
|
|
|
583
626
|
case OperatorType.TYPE_NUMBER_MULTIPLY:
|
|
584
627
|
case OperatorType.TYPE_NUMBER_SUBTRACT:
|
|
585
628
|
case OperatorType.TYPE_NUMBER_MOD:
|
|
586
|
-
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length') }
|
|
587
|
-
if (!GuardMaker.IsNumberType(this.type_validator[this.type_validator.length -1])) { ERROR(Errors.Fail, 'type_validator check') }
|
|
588
|
-
if (!GuardMaker.IsNumberType(this.type_validator[this.type_validator.length -2])) { ERROR(Errors.Fail, 'type_validator check') }
|
|
629
|
+
if (this.type_validator.length < splice_len) { ERROR(Errors.Fail, 'type_validator.length:'+e) }
|
|
630
|
+
if (!GuardMaker.IsNumberType(this.type_validator[this.type_validator.length -1])) { ERROR(Errors.Fail, 'type_validator check:'+e) }
|
|
631
|
+
if (!GuardMaker.IsNumberType(this.type_validator[this.type_validator.length -2])) { ERROR(Errors.Fail, 'type_validator check:'+e) }
|
|
589
632
|
ret = ValueType.TYPE_U256;
|
|
590
633
|
break;
|
|
591
634
|
default:
|
|
592
|
-
ERROR(Errors.InvalidParam, 'add_logic type invalid' +
|
|
635
|
+
ERROR(Errors.InvalidParam, 'add_logic type invalid:' + e)
|
|
593
636
|
}
|
|
594
|
-
|
|
637
|
+
|
|
638
|
+
this.data.push(Bcs.getInstance().ser(ValueType.TYPE_U8, type)); // TYPE
|
|
639
|
+
if (type === OperatorType.TYPE_LOGIC_AND || type === OperatorType.TYPE_LOGIC_OR) {
|
|
640
|
+
this.data.push((Bcs.getInstance().ser(ValueType.TYPE_U8, param))); //@ logics
|
|
641
|
+
}
|
|
595
642
|
this.type_validator.splice(this.type_validator.length - splice_len); // delete type stack
|
|
596
643
|
this.type_validator.push(ret); // add bool to type stack
|
|
597
644
|
return this;
|
|
@@ -601,6 +648,10 @@ export class GuardMaker {
|
|
|
601
648
|
return (type === ValueType.TYPE_U8 || type === ValueType.TYPE_U64 || type === ValueType.TYPE_U128 || type === ValueType.TYPE_U256)
|
|
602
649
|
}
|
|
603
650
|
|
|
651
|
+
hasIdentifier(id:number) : boolean {
|
|
652
|
+
return this.constant.has(id)
|
|
653
|
+
}
|
|
654
|
+
|
|
604
655
|
build(bNot = false) : GuardMaker {
|
|
605
656
|
//console.log(this.type_validator);
|
|
606
657
|
//this.data.forEach((value:Uint8Array) => console.log(value));
|
|
@@ -632,7 +683,7 @@ export class GuardMaker {
|
|
|
632
683
|
maker.constant.set(k, {type:v.type, value:v.value, witness:v.witness});
|
|
633
684
|
})
|
|
634
685
|
let op = bAnd ? OperatorType.TYPE_LOGIC_AND : OperatorType.TYPE_LOGIC_OR;
|
|
635
|
-
maker.data.push(concatenate(Uint8Array, ...this.data, ...otherBuilt.data, Bcs.getInstance().ser(ValueType.TYPE_U8, op)));
|
|
686
|
+
maker.data.push(concatenate(Uint8Array, ...this.data, ...otherBuilt.data, Bcs.getInstance().ser(ValueType.TYPE_U8, 2), Bcs.getInstance().ser(ValueType.TYPE_U8, op)));
|
|
636
687
|
this.data.splice(0, this.data.length-1);
|
|
637
688
|
maker.type_validator = this.type_validator;
|
|
638
689
|
return maker
|
|
@@ -641,22 +692,17 @@ export class GuardMaker {
|
|
|
641
692
|
get_constant() { return this.constant }
|
|
642
693
|
get_input() { return this.data }
|
|
643
694
|
|
|
695
|
+
// and/or + logics count
|
|
644
696
|
static input_combine(input1:Uint8Array, input2:Uint8Array, bAnd:boolean = true) : Uint8Array {
|
|
645
697
|
let op = bAnd ? OperatorType.TYPE_LOGIC_AND : OperatorType.TYPE_LOGIC_OR;
|
|
646
|
-
return concatenate(Uint8Array, input1, input2, Bcs.getInstance().ser(ValueType.TYPE_U8, op)) as Uint8Array;
|
|
698
|
+
return concatenate(Uint8Array, input1, input2, Bcs.getInstance().ser(ValueType.TYPE_U8, 2), Bcs.getInstance().ser(ValueType.TYPE_U8, op)) as Uint8Array;
|
|
647
699
|
}
|
|
648
700
|
static input_not(input:Uint8Array) : Uint8Array {
|
|
649
701
|
return concatenate(Uint8Array, input, Bcs.getInstance().ser(ValueType.TYPE_U8, OperatorType.TYPE_LOGIC_NOT)) as Uint8Array;
|
|
650
702
|
}
|
|
651
703
|
|
|
652
704
|
static match_u256(type:number) : boolean {
|
|
653
|
-
|
|
654
|
-
type == ValueType.TYPE_U64 ||
|
|
655
|
-
type == ValueType.TYPE_U128 ||
|
|
656
|
-
type == ValueType.TYPE_U256) {
|
|
657
|
-
return true;
|
|
658
|
-
}
|
|
659
|
-
return false;
|
|
705
|
+
return (type == ValueType.TYPE_U8 || type == ValueType.TYPE_U64 || type == ValueType.TYPE_U128 || type == ValueType.TYPE_U256);
|
|
660
706
|
}
|
|
661
707
|
}
|
|
662
708
|
|
package/src/machine.ts
CHANGED
|
@@ -144,10 +144,17 @@ export class Machine {
|
|
|
144
144
|
});
|
|
145
145
|
}
|
|
146
146
|
} else if (forward?.permission !== undefined && IsValidU64(forward.permission)) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
147
|
+
if (forward?.guard) {
|
|
148
|
+
f = this.txb.moveCall({
|
|
149
|
+
target:Protocol.Instance().MachineFn('forward3') as FnCallType,
|
|
150
|
+
arguments:[this.txb.pure.u64(forward.permission), this.txb.pure.u16(weight), this.txb.object(Protocol.TXB_OBJECT(this.txb, forward.guard))]
|
|
151
|
+
});
|
|
152
|
+
} else {
|
|
153
|
+
f = this.txb.moveCall({
|
|
154
|
+
target:Protocol.Instance().MachineFn('forward4') as FnCallType,
|
|
155
|
+
arguments:[this.txb.pure.u64(forward.permission), this.txb.pure.u16(weight)]
|
|
156
|
+
});
|
|
157
|
+
}
|
|
151
158
|
} else {
|
|
152
159
|
ERROR(Errors.InvalidParam, 'forward')
|
|
153
160
|
}
|
|
@@ -511,8 +518,8 @@ export class Machine {
|
|
|
511
518
|
if (!IsValidName(forward.name)) return 'Forward name invalid'
|
|
512
519
|
if (forward?.namedOperator && !IsValidName_AllowEmpty(forward?.namedOperator)) return 'Progress Operator invalid';
|
|
513
520
|
if (forward?.permission && !Permission.IsValidPermissionIndex(forward?.permission)) return 'Permission index invalid';
|
|
514
|
-
if (!forward?.permission && !forward?.namedOperator) return '
|
|
515
|
-
if (forward?.weight && !
|
|
521
|
+
if (!forward?.permission && !forward?.namedOperator) return 'Business-Permissions invalid';
|
|
522
|
+
if (forward?.weight && !IsValidU64(forward.weight)) return 'Weight invalid';
|
|
516
523
|
return ''
|
|
517
524
|
}
|
|
518
525
|
|
package/src/passport.ts
CHANGED
|
@@ -50,6 +50,7 @@ export interface FutureFill {
|
|
|
50
50
|
future?: string;
|
|
51
51
|
cmd?: number;
|
|
52
52
|
type?: string;
|
|
53
|
+
identifier?: number;
|
|
53
54
|
}
|
|
54
55
|
export interface PassportQuery {
|
|
55
56
|
guard: (string | TransactionObjectInput)[];
|
|
@@ -70,12 +71,14 @@ export class GuardParser {
|
|
|
70
71
|
static DeGuardObject_FromData = (guard_constants:any, guard_input_bytes:any) : {object:DeGuardData, constant:DeGuardConstant[]} => {
|
|
71
72
|
let constants : DeGuardConstant[] = [];
|
|
72
73
|
guard_constants.forEach((c:any) => {
|
|
73
|
-
let value : any;
|
|
74
74
|
let v = c?.fields ?? c; // graphql dosnot 'fields', but rpcall has.
|
|
75
|
-
|
|
75
|
+
const data:Uint8Array = Uint8Array.from(v.value);
|
|
76
|
+
const type = data.slice(0, 1)[0];
|
|
77
|
+
var value : any = data.slice(1);
|
|
78
|
+
switch (type) {
|
|
76
79
|
case ContextType.TYPE_WITNESS_ID:
|
|
77
80
|
case ValueType.TYPE_ADDRESS:
|
|
78
|
-
value = '0x' + Bcs.getInstance().de(ValueType.TYPE_ADDRESS, Uint8Array.from(
|
|
81
|
+
value = '0x' + Bcs.getInstance().de(ValueType.TYPE_ADDRESS, Uint8Array.from(value)).toString();
|
|
79
82
|
break;
|
|
80
83
|
case ValueType.TYPE_BOOL:
|
|
81
84
|
case ValueType.TYPE_U8:
|
|
@@ -95,15 +98,19 @@ export class GuardParser {
|
|
|
95
98
|
case ValueType.TYPE_OPTION_U64:
|
|
96
99
|
case ValueType.TYPE_OPTION_U256:
|
|
97
100
|
case ValueType.TYPE_VEC_U256:
|
|
98
|
-
|
|
101
|
+
case ValueType.TYPE_STRING:
|
|
102
|
+
case ValueType.TYPE_OPTION_STRING:
|
|
103
|
+
case ValueType.TYPE_OPTION_VEC_U8:
|
|
104
|
+
case ValueType.TYPE_VEC_STRING:
|
|
105
|
+
let de = SER_VALUE.find(s=>s.type==type);
|
|
99
106
|
if (!de) ERROR(Errors.Fail, 'GuardObject de error')
|
|
100
|
-
value = Bcs.getInstance().de(
|
|
107
|
+
value = Bcs.getInstance().de(type as number, Uint8Array.from(value));
|
|
101
108
|
break;
|
|
102
109
|
|
|
103
110
|
default:
|
|
104
|
-
ERROR(Errors.Fail, 'GuardObject constant type invalid')
|
|
111
|
+
ERROR(Errors.Fail, 'GuardObject constant type invalid:' +type)
|
|
105
112
|
}
|
|
106
|
-
constants.push({identifier:v.identifier, type:
|
|
113
|
+
constants.push({identifier:v.identifier, type:type, value:value});
|
|
107
114
|
});
|
|
108
115
|
// console.log(constants)
|
|
109
116
|
let bytes = Uint8Array.from(guard_input_bytes);
|
|
@@ -111,7 +118,7 @@ export class GuardParser {
|
|
|
111
118
|
let data : DeGuardData[] = [];
|
|
112
119
|
while (arr.length > 0) {
|
|
113
120
|
let type : unknown = arr.shift() ;
|
|
114
|
-
let value:any; let cmd:any; let identifier:any;
|
|
121
|
+
let value:any; let cmd:any; let identifier:any;
|
|
115
122
|
switch (type as Data_Type) {
|
|
116
123
|
case ContextType.TYPE_SIGNER:
|
|
117
124
|
case ContextType.TYPE_CLOCK:
|
|
@@ -124,14 +131,16 @@ export class GuardParser {
|
|
|
124
131
|
case OperatorType.TYPE_LOGIC_HAS_SUBSTRING:
|
|
125
132
|
case OperatorType.TYPE_LOGIC_ALWAYS_TRUE:
|
|
126
133
|
case OperatorType.TYPE_LOGIC_NOT:
|
|
127
|
-
case OperatorType.TYPE_LOGIC_AND:
|
|
128
|
-
case OperatorType.TYPE_LOGIC_OR:
|
|
129
134
|
case OperatorType.TYPE_NUMBER_ADD:
|
|
130
135
|
case OperatorType.TYPE_NUMBER_DEVIDE:
|
|
131
136
|
case OperatorType.TYPE_NUMBER_MOD:
|
|
132
137
|
case OperatorType.TYPE_NUMBER_MULTIPLY:
|
|
133
138
|
case OperatorType.TYPE_NUMBER_SUBTRACT:
|
|
134
139
|
break;
|
|
140
|
+
case OperatorType.TYPE_LOGIC_AND: //@ with logics count
|
|
141
|
+
case OperatorType.TYPE_LOGIC_OR:
|
|
142
|
+
value = arr.shift()! as number;
|
|
143
|
+
break;
|
|
135
144
|
case ContextType.TYPE_CONSTANT:
|
|
136
145
|
identifier = arr.shift()! as number; // identifier
|
|
137
146
|
break;
|
|
@@ -339,7 +348,7 @@ export class GuardParser {
|
|
|
339
348
|
current.ret_type = ValueType.TYPE_BOOL;
|
|
340
349
|
if (stack.length < 2) ERROR(Errors.Fail, 'ResolveData: ' + current.type);
|
|
341
350
|
var p1 = stack.pop() as DeGuardData; var p2 = stack.pop() as DeGuardData;
|
|
342
|
-
console.log(p1); console.log(p2)
|
|
351
|
+
//console.log(p1); console.log(p2)
|
|
343
352
|
if (!p1.ret_type || !p2.ret_type) ERROR(Errors.Fail, 'ResolveData: ' + current.type + ' INVALID param type');
|
|
344
353
|
if (p1.ret_type != p2.ret_type) ERROR(Errors.Fail, 'ResolveData: ' + current.type + ' param type not match');
|
|
345
354
|
|
|
@@ -352,7 +361,7 @@ export class GuardParser {
|
|
|
352
361
|
if (stack.length < 2) ERROR(Errors.Fail, 'ResolveData: ' + current.type);
|
|
353
362
|
var p1 = stack.pop() as DeGuardData; var p2 = stack.pop() as DeGuardData;
|
|
354
363
|
if (!p1.ret_type || !p2.ret_type) ERROR(Errors.Fail, 'ResolveData: ' + current.type + ' INVALID param type');
|
|
355
|
-
if (p1.ret_type != ValueType.
|
|
364
|
+
if (p1.ret_type != ValueType.TYPE_STRING || p2.ret_type != ValueType.TYPE_STRING) {
|
|
356
365
|
ERROR(Errors.Fail, 'ResolveData: ' + current.type + ' param type not match');
|
|
357
366
|
}
|
|
358
367
|
|
|
@@ -363,15 +372,12 @@ export class GuardParser {
|
|
|
363
372
|
case OperatorType.TYPE_LOGIC_AND:
|
|
364
373
|
case OperatorType.TYPE_LOGIC_OR:
|
|
365
374
|
current.ret_type = ValueType.TYPE_BOOL;
|
|
366
|
-
if (stack.length < 2) ERROR(Errors.Fail, 'ResolveData: ' + current.type);
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
375
|
+
if (stack.length < current.value || current.value < 2) ERROR(Errors.Fail, 'ResolveData: ' + current.type);
|
|
376
|
+
for (let i = 0; i < current.value; ++i) {
|
|
377
|
+
var p = stack.pop() as DeGuardData;
|
|
378
|
+
if (!p.ret_type || (p.ret_type != ValueType.TYPE_BOOL)) ERROR(Errors.Fail, 'ResolveData: ' + current.type + ' INVALID param type');
|
|
379
|
+
current.child.push(p);
|
|
371
380
|
}
|
|
372
|
-
|
|
373
|
-
current.child.push(p1);
|
|
374
|
-
current.child.push(p2);
|
|
375
381
|
stack.push(current);
|
|
376
382
|
return
|
|
377
383
|
case OperatorType.TYPE_QUERY:
|
|
@@ -517,15 +523,15 @@ export class GuardParser {
|
|
|
517
523
|
this.guard_list.forEach((g) => {
|
|
518
524
|
g.query_list.forEach((v) => {
|
|
519
525
|
if (typeof(v) !== 'string') {
|
|
520
|
-
ret.push({guard:g.id, index:v.index, witness:v.value_or_witness, cmd:v.cmd});
|
|
526
|
+
ret.push({guard:g.id, index:v.index, witness:v.value_or_witness, cmd:v.cmd, identifier:v?.identifier});
|
|
521
527
|
}
|
|
522
528
|
})
|
|
523
529
|
// cmd already in query_list, so filter it out.
|
|
524
530
|
g.constant.filter((v)=>v.type === ContextType.TYPE_WITNESS_ID && v.cmd === undefined).forEach((v) => {
|
|
525
|
-
ret.push({guard:g.id, index:v.index, witness:v.value_or_witness});
|
|
531
|
+
ret.push({guard:g.id, index:v.index, witness:v.value_or_witness, identifier:v?.identifier});
|
|
526
532
|
})
|
|
527
533
|
g.input_witness.forEach((v) => {
|
|
528
|
-
ret.push({guard:g.id, index:v.index, witness:v.value_or_witness});
|
|
534
|
+
ret.push({guard:g.id, index:v.index, witness:v.value_or_witness, identifier:v?.identifier});
|
|
529
535
|
})
|
|
530
536
|
}); return ret;
|
|
531
537
|
}
|
|
@@ -534,12 +540,16 @@ export class GuardParser {
|
|
|
534
540
|
constants.forEach((v:any) => {
|
|
535
541
|
if (v.type == (Protocol.Instance().Package() + '::guard::Constant')) {
|
|
536
542
|
// ValueType.TYPE_ADDRESS: Query_Cmd maybe used the address, so save it for querying
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
543
|
+
const data = Uint8Array.from(v.fields.value);
|
|
544
|
+
const type = data.slice(0, 1)[0];
|
|
545
|
+
const value = data.slice(1);
|
|
546
|
+
if (type == ContextType.TYPE_WITNESS_ID || type == ValueType.TYPE_ADDRESS) {
|
|
547
|
+
info.constant.push({identifier:v.fields.identifier, index:this.get_index(), type:type,
|
|
548
|
+
value_or_witness:'0x' + Bcs.getInstance().de(ValueType.TYPE_ADDRESS, Uint8Array.from(value))});
|
|
540
549
|
}
|
|
541
550
|
}
|
|
542
551
|
});
|
|
552
|
+
//console.log(info.constant)
|
|
543
553
|
}
|
|
544
554
|
|
|
545
555
|
parse_bcs = (info:GuardInfo, chain_bytes: Uint8Array) => {
|
|
@@ -559,14 +569,16 @@ export class GuardParser {
|
|
|
559
569
|
case OperatorType.TYPE_LOGIC_HAS_SUBSTRING:
|
|
560
570
|
case OperatorType.TYPE_LOGIC_ALWAYS_TRUE:
|
|
561
571
|
case OperatorType.TYPE_LOGIC_NOT:
|
|
562
|
-
case OperatorType.TYPE_LOGIC_AND:
|
|
563
|
-
case OperatorType.TYPE_LOGIC_OR:
|
|
564
572
|
case OperatorType.TYPE_NUMBER_ADD:
|
|
565
573
|
case OperatorType.TYPE_NUMBER_DEVIDE:
|
|
566
574
|
case OperatorType.TYPE_NUMBER_MOD:
|
|
567
575
|
case OperatorType.TYPE_NUMBER_MULTIPLY:
|
|
568
576
|
case OperatorType.TYPE_NUMBER_SUBTRACT:
|
|
569
577
|
break;
|
|
578
|
+
case OperatorType.TYPE_LOGIC_AND: //@ logics count
|
|
579
|
+
case OperatorType.TYPE_LOGIC_OR:
|
|
580
|
+
arr.splice(0, 1); // identifier of constant
|
|
581
|
+
break;
|
|
570
582
|
case ContextType.TYPE_CONSTANT:
|
|
571
583
|
arr.splice(0, 1); // identifier of constant
|
|
572
584
|
break;
|
|
@@ -765,13 +777,13 @@ export class Passport {
|
|
|
765
777
|
const clock = this.txb.sharedObjectRef(Protocol.CLOCK_OBJECT);
|
|
766
778
|
// rules: 'verify' & 'query' in turns; 'verify' at final end.
|
|
767
779
|
query?.query.forEach((q) => {
|
|
768
|
-
|
|
780
|
+
this.txb.moveCall({
|
|
769
781
|
target: Protocol.Instance().PassportFn('passport_verify') as FnCallType,
|
|
770
782
|
arguments: [ this.passport, this.txb.object(clock)]
|
|
771
783
|
});
|
|
772
784
|
this.txb.moveCall({
|
|
773
785
|
target: q.target as FnCallType,
|
|
774
|
-
arguments: [ bObject ? this.txb.object(q.object) : this.txb.object(q.id), this.passport
|
|
786
|
+
arguments: [ bObject ? this.txb.object(q.object) : this.txb.object(q.id), this.passport],
|
|
775
787
|
typeArguments: q.types,
|
|
776
788
|
})
|
|
777
789
|
})
|
package/src/permission.ts
CHANGED
|
@@ -78,7 +78,7 @@ export enum PermissionIndex {
|
|
|
78
78
|
progress_context_repository = 653,
|
|
79
79
|
progress_unhold = 654,
|
|
80
80
|
progress_parent = 655,
|
|
81
|
-
user_defined_start =
|
|
81
|
+
user_defined_start = 1000,
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
export interface PermissionInfoType {
|
|
@@ -549,9 +549,10 @@ export class Permission {
|
|
|
549
549
|
static PERMISSION_OWNER = 1;
|
|
550
550
|
static PERMISSION_ADMIN = 2;
|
|
551
551
|
static PERMISSION_OWNER_AND_ADMIN = 3;
|
|
552
|
+
static BUSINESS_PERMISSIONS_START = PermissionIndex.user_defined_start;
|
|
552
553
|
|
|
553
554
|
static IsValidUserDefinedIndex = (index:number) => {
|
|
554
|
-
return index >=
|
|
555
|
+
return index >= Permission.BUSINESS_PERMISSIONS_START && IsValidUintLarge(index)
|
|
555
556
|
}
|
|
556
557
|
|
|
557
558
|
static IsValidPermissionIndex = (index:PermissionIndexType) : boolean => {
|
package/src/protocol.ts
CHANGED
|
@@ -82,12 +82,12 @@ export enum OperatorType {
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
export const LogicsInfo = [
|
|
85
|
-
[OperatorType.TYPE_LOGIC_AS_U256_GREATER, '
|
|
86
|
-
[OperatorType.TYPE_LOGIC_AS_U256_GREATER_EQUAL, '
|
|
87
|
-
[OperatorType.TYPE_LOGIC_AS_U256_LESSER, '
|
|
88
|
-
[OperatorType.TYPE_LOGIC_AS_U256_LESSER_EQUAL, '
|
|
89
|
-
[OperatorType.TYPE_LOGIC_AS_U256_EQUAL, '
|
|
90
|
-
[OperatorType.TYPE_LOGIC_EQUAL, '
|
|
85
|
+
[OperatorType.TYPE_LOGIC_AS_U256_GREATER, 'Unsigned Integer >'],
|
|
86
|
+
[OperatorType.TYPE_LOGIC_AS_U256_GREATER_EQUAL, 'Unsigned Integer >='],
|
|
87
|
+
[OperatorType.TYPE_LOGIC_AS_U256_LESSER, 'Unsigned Integer <'],
|
|
88
|
+
[OperatorType.TYPE_LOGIC_AS_U256_LESSER_EQUAL, 'Unsigned Integer <='],
|
|
89
|
+
[OperatorType.TYPE_LOGIC_AS_U256_EQUAL, 'Unsigned Integer ='],
|
|
90
|
+
[OperatorType.TYPE_LOGIC_EQUAL, 'Equal'],
|
|
91
91
|
[OperatorType.TYPE_LOGIC_HAS_SUBSTRING, 'Sub String'],
|
|
92
92
|
[OperatorType.TYPE_LOGIC_ALWAYS_TRUE, 'Always True'],
|
|
93
93
|
[OperatorType.TYPE_LOGIC_NOT, 'Not'],
|
|
@@ -128,21 +128,26 @@ export enum RepositoryValueType {
|
|
|
128
128
|
PositiveNumber_Vec = 203,
|
|
129
129
|
String = 204,
|
|
130
130
|
String_Vec = 205,
|
|
131
|
+
Bool = 206,
|
|
131
132
|
}
|
|
132
133
|
|
|
133
134
|
export const RepositoryValueTypeInfo = [
|
|
134
|
-
{type: RepositoryValueType.String, name:'
|
|
135
|
-
{type: RepositoryValueType.Address, name:'
|
|
136
|
-
{type: RepositoryValueType.PositiveNumber, name:'
|
|
137
|
-
{type: RepositoryValueType.String_Vec, name:'
|
|
138
|
-
{type: RepositoryValueType.Address_Vec, name:'
|
|
139
|
-
{type: RepositoryValueType.PositiveNumber_Vec, name:'
|
|
135
|
+
{type: RepositoryValueType.String, name:'string', description:'String.'},
|
|
136
|
+
{type: RepositoryValueType.Address, name:'address', description:'Object id or Personal address.'},
|
|
137
|
+
{type: RepositoryValueType.PositiveNumber, name:'unsigned integer', description:'Including u8, u16 ,..., u256'},
|
|
138
|
+
{type: RepositoryValueType.String_Vec, name:'string vector', description:'Vector of string.'},
|
|
139
|
+
{type: RepositoryValueType.Address_Vec, name:'address vector', description:'Vector of address.'},
|
|
140
|
+
{type: RepositoryValueType.PositiveNumber_Vec, name:'unsigned integer vector', description:'Vector of unsigned integer'},
|
|
141
|
+
{type: RepositoryValueType.Bool, name:'bool', description:'True or False.'},
|
|
140
142
|
]
|
|
141
143
|
|
|
142
144
|
export const OperatorTypeArray = (Object.values(OperatorType) as []).filter((v)=>typeof(v) === 'number') as number[];
|
|
143
145
|
export const ValueTypeArray = (Object.values(ValueType) as []).filter((v)=>typeof(v) === 'number') as number[];
|
|
144
146
|
export const IsValidOperatorType = (type:number) : boolean => { return OperatorTypeArray.includes(type)}
|
|
145
147
|
export const IsValidValueType = (type:number) : boolean => { return ValueTypeArray.includes(type)}
|
|
148
|
+
export const IsNumberType = (type:ValueType | any) : boolean => { return type===ValueType.TYPE_U128 || type===ValueType.TYPE_U256 ||
|
|
149
|
+
type===ValueType.TYPE_U64 || type===ValueType.TYPE_U8
|
|
150
|
+
}
|
|
146
151
|
|
|
147
152
|
export enum ContextType {
|
|
148
153
|
TYPE_SIGNER = 60,
|
|
@@ -160,7 +165,7 @@ interface ValueTypeString {
|
|
|
160
165
|
export const SER_VALUE: ValueTypeString[] = [
|
|
161
166
|
{type: ValueType.TYPE_BOOL, name: 'bool', description:'boolean. eg:true or false', validator:(value:any) => { return (value === true || value === false)}},
|
|
162
167
|
{type: ValueType.TYPE_ADDRESS, name: 'address', description:'address or object-id. eg:0x6789af', validator:IsValidAddress},
|
|
163
|
-
{type: ContextType.TYPE_WITNESS_ID, name: 'future address', description:"eg:
|
|
168
|
+
{type: ContextType.TYPE_WITNESS_ID, name: 'future address', description:"eg: address of the Machine that will generate future Progress, address of the Service that will generate future Order", validator:IsValidAddress},
|
|
164
169
|
{type: ContextType.TYPE_SIGNER, name: 'txn signer', description:"signer address of the transaction, "},
|
|
165
170
|
{type: ContextType.TYPE_CLOCK, name: 'txn time', description:"unsigned-64 number for the transaction time"},
|
|
166
171
|
{type: ValueType.TYPE_U64, name: 'number', description:'unsigned-64 number. eg:23870233', validator:IsValidU64},
|
|
@@ -180,7 +185,7 @@ export const SER_VALUE: ValueTypeString[] = [
|
|
|
180
185
|
{type: ValueType.TYPE_OPTION_U256, name: 'option', description:'option of u256. eg:none or u256 value'},
|
|
181
186
|
{type: ValueType.TYPE_VEC_U256, name: '[number]', description:'unsigned-256 number array. eg:[123, 778888, 42312]'},
|
|
182
187
|
{type: ValueType.TYPE_VEC_STRING, name: '[string]', description:'ascii string array. eg:["abc", "hi"]'},
|
|
183
|
-
{type: ValueType.TYPE_STRING, name: 'string', description:'
|
|
188
|
+
{type: ValueType.TYPE_STRING, name: 'string', description:'eg:"wowok"', },
|
|
184
189
|
{type: ValueType.TYPE_OPTION_STRING, name: 'option', description:'option of string. eg:none or string value'},
|
|
185
190
|
{type: ValueType.TYPE_U256, name: 'number', description:'unsigned-256 number. eg:12345678901233', validator:IsValidUintLarge},
|
|
186
191
|
]
|
|
@@ -194,14 +199,20 @@ export enum ENTRYPOINT {
|
|
|
194
199
|
devnet = 'devnet',
|
|
195
200
|
localnet = 'localnet'
|
|
196
201
|
}
|
|
197
|
-
|
|
202
|
+
/*
|
|
198
203
|
const TESTNET = {
|
|
199
204
|
package: "0xbd3d0929072f7647e521bf72851ccdc7e2169052b22bfdc5b49439c48cfb119a",
|
|
200
205
|
wowok_object: '0xb0a521a287e9d5e08932b3984dbe6ce159e836179c41bd08c556ef77ecdb7439',
|
|
201
206
|
entity_object: '0x16aab98920e7341d1dc19631031253234b2b71fc2ab8c32d65ee3ded8072acef',
|
|
202
207
|
treasury_cap:'0xb75a2ca2f651755c134ad521175f33f9e3f9008ad44340f76b3229e1f30cfdff',
|
|
203
208
|
}
|
|
204
|
-
|
|
209
|
+
*/
|
|
210
|
+
const TESTNET = {
|
|
211
|
+
package: "0x4ce36e03ef9cd230f1158e48293ee01cb572cdcd2f9cab7ac7b2fd2251bfe51e",
|
|
212
|
+
wowok_object: '0xd3639daf1daa300bbf694b21e42cecac6be242ad038fe48a7a1212e93f3845f6',
|
|
213
|
+
entity_object: '0x8de1e01e6baca0990ca18de3ec51b57183512deaeb76076be9161ca38988c74f',
|
|
214
|
+
treasury_cap:'0x2e05eda6ee5b0773854be6eb48c6cee2b5ca8aaa13ee810434d66232005b40ef',
|
|
215
|
+
}
|
|
205
216
|
const MAINNET = {
|
|
206
217
|
package: "",
|
|
207
218
|
wowok_object: '',
|
package/src/repository.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Protocol, FnCallType, ValueType, RepositoryValueType, RepositoryAddress, PermissionObject, PassportObject, TxbObject} from './protocol';
|
|
1
|
+
import { Protocol, FnCallType, ValueType, RepositoryValueType, RepositoryAddress, PermissionObject, PassportObject, TxbObject, } from './protocol';
|
|
2
2
|
import { PermissionIndexType, Permission } from './permission'
|
|
3
3
|
import { Bcs, array_unique, IsValidDesription, IsValidAddress, IsValidArray, IsValidName, ValueTypeConvert} from './utils';
|
|
4
4
|
import { ERROR, Errors } from './exception';
|
|
5
|
-
import { MAX_U8, MAX_U128, MAX_U256, MAX_U64 } from './utils';
|
|
5
|
+
import { MAX_U8, MAX_U128, MAX_U256, MAX_U64, stringToUint8Array } from './utils';
|
|
6
6
|
import { type TransactionResult, Transaction as TransactionBlock } from '@mysten/sui/transactions';
|
|
7
7
|
|
|
8
8
|
export enum Repository_Policy_Mode {
|
|
@@ -22,16 +22,16 @@ export type Repository_Policy = {
|
|
|
22
22
|
key:string;
|
|
23
23
|
description: string;
|
|
24
24
|
data_type: RepositoryValueType;
|
|
25
|
-
permission?: PermissionIndexType; // PermissionIndex like, must be geater than
|
|
25
|
+
permission?: PermissionIndexType; // PermissionIndex like, must be geater than 1000
|
|
26
26
|
}
|
|
27
27
|
export type Repository_Policy_Data = {
|
|
28
28
|
key: string;
|
|
29
|
-
data: Repository_Value[];
|
|
30
|
-
value_type?: ValueType;
|
|
29
|
+
data: Repository_Value[];
|
|
30
|
+
value_type?: ValueType; //
|
|
31
31
|
}
|
|
32
32
|
export type Repository_Value = {
|
|
33
33
|
address: string; // UID: address or objectid
|
|
34
|
-
bcsBytes: Uint8Array;
|
|
34
|
+
bcsBytes: Uint8Array; // BCS contents. Notice that: First Byte be the Type by caller, or specify type with 'Repository_Policy_Data.value_type' field.
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export class Repository {
|
|
@@ -425,6 +425,8 @@ export class Repository {
|
|
|
425
425
|
d = '0x' + d;
|
|
426
426
|
} else if (type === ValueType.TYPE_VEC_ADDRESS) {
|
|
427
427
|
d = d.map((v:string) => { return ('0x' + v) } );
|
|
428
|
+
} else if (type === ValueType.TYPE_BOOL) {
|
|
429
|
+
d = d ? 'True' : 'False'
|
|
428
430
|
}
|
|
429
431
|
};
|
|
430
432
|
return {object:v?.data?.content?.fields?.id?.id, id:(v?.data?.content?.fields as any)?.name?.fields?.id,
|
|
@@ -454,7 +456,7 @@ export class Repository {
|
|
|
454
456
|
} return undefined
|
|
455
457
|
}
|
|
456
458
|
|
|
457
|
-
static ResolveRepositoryData = (dataType:RepositoryValueType, data:string | string[]) : {type:ValueType, data: Uint8Array} | undefined => {
|
|
459
|
+
static ResolveRepositoryData = (dataType:RepositoryValueType, data:string | boolean | string[]) : {type:ValueType, data: Uint8Array} | undefined => {
|
|
458
460
|
if (dataType === RepositoryValueType.String) {
|
|
459
461
|
return {type: ValueType.TYPE_STRING, data: Bcs.getInstance().ser(ValueType.TYPE_VEC_U8, new TextEncoder().encode(data.toString()))}
|
|
460
462
|
} else if (dataType === RepositoryValueType.PositiveNumber) {
|
|
@@ -491,6 +493,9 @@ export class Repository {
|
|
|
491
493
|
return new TextEncoder().encode(v);
|
|
492
494
|
})
|
|
493
495
|
return {type: ValueType.TYPE_VEC_STRING, data: Bcs.getInstance().ser(ValueType.TYPE_VEC_VEC_U8, r)}
|
|
496
|
+
} else if (dataType === RepositoryValueType.Bool) {
|
|
497
|
+
if (typeof(data) !== 'boolean') return undefined;
|
|
498
|
+
return {type:ValueType.TYPE_BOOL, data:Bcs.getInstance().ser(ValueType.TYPE_BOOL, data)}
|
|
494
499
|
}
|
|
495
500
|
return undefined
|
|
496
501
|
}
|
package/src/utils.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { BCS, getSuiMoveConfig, } from '@mysten/bcs';
|
|
|
2
2
|
import { SuiObjectResponse, DynamicFieldPage } from '@mysten/sui/client';
|
|
3
3
|
import { ERROR, Errors } from './exception';
|
|
4
4
|
import { isValidSuiAddress} from '@mysten/sui/utils'
|
|
5
|
-
import { RepositoryValueType, ValueType, Protocol } from './protocol'
|
|
5
|
+
import { RepositoryValueType, ValueType, Protocol, ContextType, OperatorType } from './protocol'
|
|
6
6
|
|
|
7
7
|
export const MAX_U8 = BigInt('255');
|
|
8
8
|
export const MAX_U64 = BigInt('18446744073709551615');
|
|
@@ -13,7 +13,7 @@ export const OPTION_NONE = 0;
|
|
|
13
13
|
|
|
14
14
|
export const ValueTypeConvert = (type:ValueType | null | undefined) : RepositoryValueType | number => {
|
|
15
15
|
if (type === ValueType.TYPE_U8 || type === ValueType.TYPE_U64 || type === ValueType.TYPE_U128 ||
|
|
16
|
-
type === ValueType.TYPE_U256
|
|
16
|
+
type === ValueType.TYPE_U256) {
|
|
17
17
|
return RepositoryValueType.PositiveNumber
|
|
18
18
|
} else if (type === ValueType.TYPE_VEC_U8 || type === ValueType.TYPE_VEC_U64 || type === ValueType.TYPE_VEC_U128 ||
|
|
19
19
|
type === ValueType.TYPE_VEC_U256|| type === ValueType.TYPE_VEC_BOOL) {
|
|
@@ -26,7 +26,9 @@ export const ValueTypeConvert = (type:ValueType | null | undefined) : Repository
|
|
|
26
26
|
return RepositoryValueType.String
|
|
27
27
|
} else if (type === ValueType.TYPE_VEC_STRING) {
|
|
28
28
|
return RepositoryValueType.String_Vec
|
|
29
|
-
}
|
|
29
|
+
} else if (type === ValueType.TYPE_BOOL) {
|
|
30
|
+
return RepositoryValueType.Bool
|
|
31
|
+
}
|
|
30
32
|
return -1;
|
|
31
33
|
}
|
|
32
34
|
|
|
@@ -192,7 +194,7 @@ export class Bcs {
|
|
|
192
194
|
return this.bcs.ser('Option<u32>', {'some': data}).toBytes();
|
|
193
195
|
}
|
|
194
196
|
|
|
195
|
-
ser(type:ValueType | string, data:Uint8Array | any) : Uint8Array {
|
|
197
|
+
ser(type:ValueType | ContextType | string, data:Uint8Array | any) : Uint8Array {
|
|
196
198
|
if (typeof(type) === 'string') {
|
|
197
199
|
return this.bcs.ser(type, data).toBytes();
|
|
198
200
|
}
|
|
@@ -239,9 +241,12 @@ export class Bcs {
|
|
|
239
241
|
case ValueType.TYPE_U256:
|
|
240
242
|
return this.bcs.ser(BCS.U256, data).toBytes();
|
|
241
243
|
case ValueType.TYPE_STRING:
|
|
242
|
-
|
|
244
|
+
const d = new TextEncoder().encode(data);
|
|
245
|
+
return this.bcs.ser('vector<u8>', d).toBytes();
|
|
243
246
|
case ValueType.TYPE_VEC_STRING:
|
|
244
|
-
return this.bcs.ser('vector<
|
|
247
|
+
return this.bcs.ser('vector<vector<u8>>', data.map((v:string)=>{return new TextEncoder().encode(v)})).toBytes();
|
|
248
|
+
case ContextType.TYPE_WITNESS_ID:
|
|
249
|
+
return this.bcs.ser(BCS.ADDRESS, data).toBytes();
|
|
245
250
|
default:
|
|
246
251
|
ERROR(Errors.bcsTypeInvalid, 'ser');
|
|
247
252
|
}
|
|
@@ -293,7 +298,8 @@ export class Bcs {
|
|
|
293
298
|
case ValueType.TYPE_VEC_U256:
|
|
294
299
|
return this.bcs.de('vector<u256>', data);
|
|
295
300
|
case ValueType.TYPE_STRING:
|
|
296
|
-
|
|
301
|
+
const r = new TextDecoder().decode(Uint8Array.from(this.bcs.de('vector<u8>', data)));
|
|
302
|
+
return r
|
|
297
303
|
case ValueType.TYPE_VEC_STRING:
|
|
298
304
|
return this.bcs.de('vector<string>', data);
|
|
299
305
|
case ValueType.TYPE_U256:
|
|
@@ -325,13 +331,10 @@ export class Bcs {
|
|
|
325
331
|
}
|
|
326
332
|
}
|
|
327
333
|
|
|
328
|
-
export function stringToUint8Array(str:string)
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
}
|
|
333
|
-
var tmpUint8Array = new Uint8Array(arr);
|
|
334
|
-
return tmpUint8Array
|
|
334
|
+
export function stringToUint8Array(str:string) {
|
|
335
|
+
const encoder = new TextEncoder();
|
|
336
|
+
const view = encoder.encode(str);
|
|
337
|
+
return new Uint8Array(view.buffer);
|
|
335
338
|
}
|
|
336
339
|
|
|
337
340
|
export function numToUint8Array(num:number) : Uint8Array {
|
|
@@ -411,6 +414,9 @@ export const IsValidU64 = (value:string | number | undefined | bigint) : boolean
|
|
|
411
414
|
export const IsValidU128 = (value:string | number | undefined | bigint) : boolean => {
|
|
412
415
|
return IsValidBigint(value, MAX_U128, BigInt(0))
|
|
413
416
|
}
|
|
417
|
+
export const IsValidU256 = (value:string | number | undefined | bigint) : boolean => {
|
|
418
|
+
return IsValidBigint(value, MAX_U256, BigInt(0))
|
|
419
|
+
}
|
|
414
420
|
|
|
415
421
|
export const IsValidTokenType = (argType: string) : boolean => {
|
|
416
422
|
if (!argType || argType.length === 0) {
|
|
@@ -502,6 +508,15 @@ export const ParseType = (type:string) : ArgType => {
|
|
|
502
508
|
return {isCoin:false, coin:'', token:''}
|
|
503
509
|
}
|
|
504
510
|
|
|
511
|
+
|
|
512
|
+
export function insertAtHead(array:Uint8Array, value:number) {
|
|
513
|
+
const newLength = array.length + 1;
|
|
514
|
+
const newArray = new Uint8Array(newLength);
|
|
515
|
+
newArray.set([value], 0);
|
|
516
|
+
newArray.set(array, 1);
|
|
517
|
+
return newArray;
|
|
518
|
+
}
|
|
519
|
+
|
|
505
520
|
export function toFixed(x:number) {
|
|
506
521
|
let res = '';
|
|
507
522
|
if (Math.abs(x) < 1.0) {
|