wowok 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/vote.js CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.change_permission = exports.agree = exports.vote_lock_guard = exports.vote_expand_deadline = exports.vote_lock_deadline = exports.vote_open_voting = exports.vote_set_max_choice_count = exports.vote_remove_option = exports.vote_add_option = exports.vote_remove_guard = exports.vote_add_guard = exports.vote_set_reference = exports.vote_set_description = exports.destroy = exports.launch = exports.vote = exports.MAX_CHOICE_COUNT = exports.MAX_AGREES_COUNT = void 0;
4
4
  const bcs_1 = require("@mysten/bcs");
5
5
  const protocol_1 = require("./protocol");
6
- const util_1 = require("./util");
6
+ const utils_1 = require("./utils");
7
7
  exports.MAX_AGREES_COUNT = 200;
8
8
  exports.MAX_CHOICE_COUNT = 200;
9
9
  function vote(txb, permission, description, minutes_duration, max_choice_count, reference_address, passport) {
@@ -19,7 +19,7 @@ function vote(txb, permission, description, minutes_duration, max_choice_count,
19
19
  return false;
20
20
  if (reference_address && !(0, protocol_1.IsValidAddress)(reference_address))
21
21
  return false;
22
- let reference = reference_address ? txb.pure(util_1.BCS_CONVERT.ser_option_address(reference_address)) : (0, protocol_1.OptionNone)(txb);
22
+ let reference = reference_address ? txb.pure(utils_1.BCS_CONVERT.ser_option_address(reference_address)) : (0, protocol_1.OptionNone)(txb);
23
23
  let choice_count = max_choice_count ? max_choice_count : 1;
24
24
  if (passport) {
25
25
  return txb.moveCall({
@@ -81,7 +81,7 @@ function vote_set_reference(txb, vote, permission, reference_address, passport)
81
81
  return false;
82
82
  if (reference_address && !(0, protocol_1.IsValidAddress)(reference_address))
83
83
  return false;
84
- let reference = reference_address ? txb.pure(util_1.BCS_CONVERT.ser_option_address(reference_address)) : (0, protocol_1.OptionNone)(txb);
84
+ let reference = reference_address ? txb.pure(utils_1.BCS_CONVERT.ser_option_address(reference_address)) : (0, protocol_1.OptionNone)(txb);
85
85
  if (passport) {
86
86
  txb.moveCall({
87
87
  target: protocol_1.PROTOCOL.VoteFn('reference_set_with_passport'),
@@ -134,7 +134,7 @@ function vote_remove_guard(txb, vote, permission, guard_address, removeall, pass
134
134
  else {
135
135
  txb.moveCall({
136
136
  target: protocol_1.PROTOCOL.VoteFn('guard_remove_with_passport'),
137
- arguments: [passport, (0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure((0, util_1.array_unique)(guard_address), 'vector<address>'), (0, protocol_1.TXB_OBJECT)(txb, permission)]
137
+ arguments: [passport, (0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure((0, utils_1.array_unique)(guard_address), 'vector<address>'), (0, protocol_1.TXB_OBJECT)(txb, permission)]
138
138
  });
139
139
  }
140
140
  }
@@ -148,7 +148,7 @@ function vote_remove_guard(txb, vote, permission, guard_address, removeall, pass
148
148
  else {
149
149
  txb.moveCall({
150
150
  target: protocol_1.PROTOCOL.VoteFn('guard_remove'),
151
- arguments: [(0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure((0, util_1.array_unique)(guard_address), 'vector<address>'), (0, protocol_1.TXB_OBJECT)(txb, permission)]
151
+ arguments: [(0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure((0, utils_1.array_unique)(guard_address), 'vector<address>'), (0, protocol_1.TXB_OBJECT)(txb, permission)]
152
152
  });
153
153
  }
154
154
  }
@@ -170,7 +170,7 @@ function vote_add_option(txb, vote, permission, options, passport) {
170
170
  if (!bValid)
171
171
  return false;
172
172
  options.forEach((option) => {
173
- let reference = option?.reference_address ? txb.pure(util_1.BCS_CONVERT.ser_option_address(option.reference_address)) : (0, protocol_1.OptionNone)(txb);
173
+ let reference = option?.reference_address ? txb.pure(utils_1.BCS_CONVERT.ser_option_address(option.reference_address)) : (0, protocol_1.OptionNone)(txb);
174
174
  if (passport) {
175
175
  txb.moveCall({
176
176
  target: protocol_1.PROTOCOL.VoteFn('agrees_add_with_passport'),
@@ -204,7 +204,7 @@ function vote_remove_option(txb, vote, permission, options, removeall, passport)
204
204
  else {
205
205
  txb.moveCall({
206
206
  target: protocol_1.PROTOCOL.VoteFn('agrees_remove_with_passport'),
207
- arguments: [passport, (0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure(util_1.BCS_CONVERT.ser_vector_string((0, util_1.array_unique)(options))), (0, protocol_1.TXB_OBJECT)(txb, permission)]
207
+ arguments: [passport, (0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure(utils_1.BCS_CONVERT.ser_vector_string((0, utils_1.array_unique)(options))), (0, protocol_1.TXB_OBJECT)(txb, permission)]
208
208
  });
209
209
  }
210
210
  }
@@ -218,7 +218,7 @@ function vote_remove_option(txb, vote, permission, options, removeall, passport)
218
218
  else {
219
219
  txb.moveCall({
220
220
  target: protocol_1.PROTOCOL.VoteFn('agrees_remove'),
221
- arguments: [(0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure(util_1.BCS_CONVERT.ser_vector_string((0, util_1.array_unique)(options))), (0, protocol_1.TXB_OBJECT)(txb, permission)]
221
+ arguments: [(0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure(utils_1.BCS_CONVERT.ser_vector_string((0, utils_1.array_unique)(options))), (0, protocol_1.TXB_OBJECT)(txb, permission)]
222
222
  });
223
223
  }
224
224
  }
@@ -327,13 +327,13 @@ function agree(txb, vote, options, passport) {
327
327
  if (passport) {
328
328
  txb.moveCall({
329
329
  target: protocol_1.PROTOCOL.VoteFn('vote_with_passport'),
330
- arguments: [passport, (0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure(util_1.BCS_CONVERT.ser_vector_string((0, util_1.array_unique)(options)))]
330
+ arguments: [passport, (0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure(utils_1.BCS_CONVERT.ser_vector_string((0, utils_1.array_unique)(options)))]
331
331
  });
332
332
  }
333
333
  else {
334
334
  txb.moveCall({
335
335
  target: protocol_1.PROTOCOL.VoteFn('vote'),
336
- arguments: [(0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure(util_1.BCS_CONVERT.ser_vector_string((0, util_1.array_unique)(options)))]
336
+ arguments: [(0, protocol_1.TXB_OBJECT)(txb, vote), txb.pure(utils_1.BCS_CONVERT.ser_vector_string((0, utils_1.array_unique)(options)))]
337
337
  });
338
338
  }
339
339
  return true;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "wowok",
3
- "version": "1.0.6",
4
- "description": "AI-oriented web3 collaboration protocol, driving innovaion and making it more likely to happen.",
3
+ "version": "1.0.7",
4
+ "description": "AI-oriented web3 collaboration protocol, driving innovaion and making it more likely to happen",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "module": "node",
@@ -13,9 +13,25 @@
13
13
  "web3",
14
14
  "AI",
15
15
  "wowok",
16
- "sui"
16
+ "sui",
17
+ "collaboration",
18
+ "protocol",
19
+ "WOW",
20
+ "permission",
21
+ "guard",
22
+ "service",
23
+ "order",
24
+ "machine",
25
+ "progress",
26
+ "passport",
27
+ "demand",
28
+ "reward",
29
+ "discount",
30
+ "mark",
31
+ "message",
32
+ "vote"
17
33
  ],
18
- "author": "wowo",
34
+ "author": "wowok",
19
35
  "license": "Apache License",
20
36
  "dependencies": {
21
37
  "@mysten/bcs": "^0.11.1",
package/src/guard.ts CHANGED
@@ -242,12 +242,13 @@ export class SenseMaker {
242
242
  this.data.push(bcs.ser(BCS.U8, type).toBytes());
243
243
  this.type_validator.push(ValueType.TYPE_STATIC_address);
244
244
  break;
245
- case ContextType.TYPE_CONTEXT_CURRENT_CLOCK:
245
+ case ContextType.TYPE_CONTEXT_CLOCK:
246
246
  this.data.push(bcs.ser(BCS.U8, type).toBytes());
247
247
  this.type_validator.push(ValueType.TYPE_STATIC_u64);
248
248
  break;
249
- case ContextType.TYPE_CONTEXT_CURRENT_PROGRESS:
249
+ case ContextType.TYPE_CONTEXT_FUTURE_ID:
250
250
  this.data.push(bcs.ser(BCS.U8, type).toBytes());
251
+ this.data.push(bcs.ser(BCS.ADDRESS, param).toBytes());
251
252
  this.type_validator.push(ValueType.TYPE_STATIC_address);
252
253
  break;
253
254
  default:
@@ -265,9 +266,13 @@ export class SenseMaker {
265
266
  return -1;
266
267
  }
267
268
  // query_index: index(from 0) of array QUERIES
268
- add_query(object_address:string, module:MODULES, query_name:string) : boolean {
269
+ // TYPE_FUTURE_ORDER_DYNAMIC_QUERY: object_address: service/machine id; module:order/progress
270
+ add_query(type:OperatorType, object_address:string, module:MODULES, query_name:string) : boolean {
269
271
  let query_index = this.query_index(module, query_name);
270
272
  if (!object_address || query_index == -1) { return false; }
273
+ // if future type , object_address must be SERVICE OR MACHINE address
274
+ if (type == OperatorType.TYPE_FUTURE_ORDER_DYNAMIC_QUERY && module != MODULES.order) return false;
275
+ if (type == OperatorType.TYPE_FUTURE_PROGRESS_DYNAMIC_QUERY && module != MODULES.progress) return false;
271
276
 
272
277
  let offset = this.type_validator.length - QUERIES[query_index][3].length;
273
278
  if (offset < 0) {
@@ -280,7 +285,7 @@ export class SenseMaker {
280
285
  }
281
286
 
282
287
  const bcs = new BCS(getSuiMoveConfig());
283
- this.data.push(bcs.ser(BCS.U8, OperatorType.TYPE_DYNAMIC_QUERY).toBytes()); // TYPE
288
+ this.data.push(bcs.ser(BCS.U8, type).toBytes()); // TYPE
284
289
  this.data.push(bcs.ser(BCS.ADDRESS, object_address).toBytes()); // object address
285
290
  this.data.push(bcs.ser(BCS.U8, QUERIES[query_index][2]).toBytes()); // cmd
286
291
 
@@ -349,7 +354,7 @@ export function parse_graphql_senses(senses:any) : string[] {
349
354
  }
350
355
 
351
356
  // parse guard senses input bytes of a guard, return [objectids] for 'query_cmd'
352
- export function parse_sense_bsc(chain_sense_bsc:Uint8Array) : boolean | string[] {
357
+ export function parse_sense_bsc(chain_sense_bsc:Uint8Array, future_order?:string[], future_progress?:string[]) : boolean | string[] {
353
358
  var arr = [].slice.call(chain_sense_bsc.reverse());
354
359
  const bcs = new BCS(getSuiMoveConfig());
355
360
  var result = [];
@@ -359,8 +364,7 @@ export function parse_sense_bsc(chain_sense_bsc:Uint8Array) : boolean | string[
359
364
  // console.log(type);
360
365
  switch (type as Data_Type) {
361
366
  case ContextType.TYPE_CONTEXT_SIGNER:
362
- case ContextType.TYPE_CONTEXT_CURRENT_CLOCK:
363
- case ContextType.TYPE_CONTEXT_CURRENT_PROGRESS:
367
+ case ContextType.TYPE_CONTEXT_CLOCK:
364
368
  case OperatorType.TYPE_LOGIC_OPERATOR_U128_GREATER:
365
369
  case OperatorType.TYPE_LOGIC_OPERATOR_U128_GREATER_EQUAL:
366
370
  case OperatorType.TYPE_LOGIC_OPERATOR_U128_LESSER:
@@ -370,6 +374,9 @@ export function parse_sense_bsc(chain_sense_bsc:Uint8Array) : boolean | string[
370
374
  case OperatorType.TYPE_LOGIC_OPERATOR_HAS_SUBSTRING:
371
375
  case OperatorType.TYPE_LOGIC_ALWAYS_TRUE:
372
376
  break;
377
+ case ContextType.TYPE_CONTEXT_FUTURE_ID: // MACHINE-ID
378
+ arr.splice(0, 32);
379
+ break;
373
380
  case ValueType.TYPE_STATIC_address:
374
381
  //console.log('0x' + bcs.de(BCS.ADDRESS, Uint8Array.from(array)).toString());
375
382
  arr.splice(0, 32);
@@ -392,6 +399,24 @@ export function parse_sense_bsc(chain_sense_bsc:Uint8Array) : boolean | string[
392
399
  result.push('0x' + bcs.de(BCS.ADDRESS, Uint8Array.from(arr)).toString());
393
400
  arr.splice(0, 33); // address + cmd
394
401
  break;
402
+ case OperatorType.TYPE_FUTURE_PROGRESS_DYNAMIC_QUERY: // SERVICE-ID
403
+ if (!future_progress) {
404
+ console.error('OperatorType.TYPE_FUTURE_PROGRESS_DYNAMIC_QUERY need object');
405
+ console.log(arr)
406
+ return false; // error
407
+ }
408
+ result.push(future_progress!.shift() as string) // real query object
409
+ arr.splice(0, 33)
410
+ break;
411
+ case OperatorType.TYPE_FUTURE_ORDER_DYNAMIC_QUERY: //
412
+ if (!future_order) {
413
+ console.error('OperatorType.TYPE_FUTURE_ORDER_DYNAMIC_QUERY need object');
414
+ console.log(arr)
415
+ return false; // error
416
+ }
417
+ result.push(future_order!.shift() as string)
418
+ arr.splice(0, 33)
419
+ break;
395
420
  default:
396
421
  console.error('parse_sense_bsc:undefined');
397
422
  console.log(type as number)
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  export * from './protocol'
2
3
  export * from './passport'
3
4
  export { demand, demand_expand_time, demand_refund, demand_set_description, demand_set_guard, demand_yes, deposit as demand_deposit,
package/src/passport.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import { SuiObjectResponse, SuiObjectDataOptions } from '@mysten/sui.js/client';
2
2
  import { TransactionBlock, TransactionResult, type TransactionObjectInput, Inputs } from '@mysten/sui.js/transactions';
3
- import { PROTOCOL, FnCallType, CLOCK_OBJECT, Query_Param, OBJECTS_TYPE, OBJECTS_TYPE_PREFIX, PassportObject, GuardObject, TXB_OBJECT} from './protocol';
3
+ import { PROTOCOL, FnCallType, CLOCK_OBJECT, Query_Param, OBJECTS_TYPE, OBJECTS_TYPE_PREFIX, PassportObject, GuardObject, TXB_OBJECT, ContextType, IsValidAddress} from './protocol';
4
4
  import { parse_object_type, array_unique } from './utils';
5
5
  import { rpc_sense_objects_fn } from './guard';
6
+ import { BCS } from '@mysten/bcs';
6
7
 
7
8
  export const MAX_GUARD_COUNT = 8;
8
9
 
@@ -26,7 +27,6 @@ export const passport_queries = async (guards:string[]) : Promise<Guard_Query_Ob
26
27
  sense_objects_result = sense_objects_result.concat(value.data);
27
28
  });
28
29
  sense_objects_result = array_unique(sense_objects_result); // objects in guards
29
- // console.log(sense_objects_result);
30
30
 
31
31
  let queries = sense_objects_result.map((value) => {
32
32
  return {objectid:value, callback:rpc_query_cmd_fn, data:[]} as Query_Param;
@@ -58,7 +58,7 @@ export function verify(txb:TransactionBlock, guards:string[], passport_queries:G
58
58
 
59
59
  var passport = txb.moveCall({
60
60
  target: PROTOCOL.PassportFn('new') as FnCallType,
61
- arguments: [ TXB_OBJECT(txb, guards[0]), txb.object(CLOCK_OBJECT)]
61
+ arguments: [ TXB_OBJECT(txb, guards[0])]
62
62
  });
63
63
 
64
64
  // add others guards, if any
@@ -71,24 +71,34 @@ export function verify(txb:TransactionBlock, guards:string[], passport_queries:G
71
71
 
72
72
  // rules: 'verify' & 'query' in turns;'verify' at final end.
73
73
  for (let i = 0; i < passport_queries.length; i++) {
74
- txb.moveCall({
74
+ let res = txb.moveCall({
75
75
  target: PROTOCOL.PassportFn('passport_verify') as FnCallType,
76
- arguments: [ passport ]
76
+ arguments: [ passport, txb.object(CLOCK_OBJECT), ]
77
77
  });
78
78
  txb.moveCall({
79
79
  target: passport_queries[i].target as FnCallType,
80
- arguments: [ txb.object(passport_queries[i].object), passport ],
80
+ arguments: [ txb.object(passport_queries[i].object), passport, res ],
81
81
  typeArguments: passport_queries[i].types,
82
82
  })
83
83
  }
84
84
  txb.moveCall({
85
85
  target: PROTOCOL.PassportFn('passport_verify') as FnCallType,
86
- arguments: [ passport ]
86
+ arguments: [ passport, txb.object(CLOCK_OBJECT) ]
87
87
  });
88
88
 
89
89
  return passport;
90
90
  }
91
91
 
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
+
92
102
  export function destroy(txb:TransactionBlock, passport:PassportObject) : boolean {
93
103
  txb.moveCall({
94
104
  target: PROTOCOL.PassportFn('destroy') as FnCallType,
package/src/protocol.ts CHANGED
@@ -113,6 +113,8 @@ export enum ValueType {
113
113
 
114
114
  export enum OperatorType {
115
115
  TYPE_DYNAMIC_QUERY = 1, // query wowok object
116
+ TYPE_FUTURE_ORDER_DYNAMIC_QUERY = 2,
117
+ TYPE_FUTURE_PROGRESS_DYNAMIC_QUERY = 3,
116
118
  TYPE_LOGIC_OPERATOR_U128_GREATER = 11,
117
119
  TYPE_LOGIC_OPERATOR_U128_GREATER_EQUAL = 12,
118
120
  TYPE_LOGIC_OPERATOR_U128_LESSER = 13,
@@ -125,8 +127,8 @@ export enum OperatorType {
125
127
 
126
128
  export enum ContextType {
127
129
  TYPE_CONTEXT_SIGNER = 60,
128
- TYPE_CONTEXT_CURRENT_PROGRESS = 61,
129
- TYPE_CONTEXT_CURRENT_CLOCK = 62,
130
+ TYPE_CONTEXT_CLOCK = 61,
131
+ TYPE_CONTEXT_FUTURE_ID = 62, // TYPE + MACHINE-ID or SERVICE-ID
130
132
  }
131
133
 
132
134
  export type Data_Type = ValueType | OperatorType | ContextType;
@@ -159,7 +161,7 @@ export class Protocol {
159
161
  case ENTRYPOINT.devnet:
160
162
  break;
161
163
  case ENTRYPOINT.testnet:
162
- this.package = "0x877375bc3bde063e4b95f428df218af7faaeef431993f4a68f2dfa5ceb8acb2e";
164
+ this.package = "0x0e4c1b57d596cda9a26a36567c79d94dffc8419e5be7ecf659ce4a7242abaeff";
163
165
  this.everyone_guard = "0x78a41fcc4f566360839613f6b917fb101ae015e56b43143f496f265b6422fddc";
164
166
  this.graphql = 'https://sui-testnet.mystenlabs.com/graphql';
165
167
  break;
package/src/service.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { TransactionBlock, type TransactionResult } from '@mysten/sui.js/transactions';
2
- import { BCS } from '@mysten/bcs';
2
+ import { bcs, BCS, toHEX, fromHEX, getSuiMoveConfig } from '@mysten/bcs';
3
3
  import { BCS_CONVERT, array_unique } from './utils'
4
4
  import { CLOCK_OBJECT, FnCallType, GuardObject, PROTOCOL, PassportObject, PermissionObject,
5
5
  RepositoryObject, MachineObject, ServiceAddress, ServiceObject, IsValidObjects, IsValidArgType, IsValidDesription,
@@ -72,7 +72,7 @@ export function service_set_description(pay_type:string, txb:TransactionBlock, s
72
72
  return true
73
73
  }
74
74
  export function service_set_price(pay_type:string, txb:TransactionBlock, service:ServiceObject, permission:PermissionObject,
75
- item:string, price:number, passport?:PassportObject) : boolean {
75
+ item:string, price:number, bNotFoundAssert:boolean=true, passport?:PassportObject) : boolean {
76
76
  if (!IsValidObjects([service, permission])) return false;
77
77
  if (!IsValidArgType(pay_type)) return false;
78
78
  if (!IsValidInt(price) || !IsValidName(item)) return false;
@@ -80,20 +80,22 @@ export function service_set_price(pay_type:string, txb:TransactionBlock, service
80
80
  if (passport) {
81
81
  txb.moveCall({
82
82
  target:PROTOCOL.ServiceFn('price_set_with_passport') as FnCallType,
83
- arguments:[passport, TXB_OBJECT(txb, service), txb.pure(item), txb.pure(price, BCS.U64), TXB_OBJECT(txb, permission)],
83
+ arguments:[passport, TXB_OBJECT(txb, service), txb.pure(item), txb.pure(price, BCS.U64),
84
+ txb.pure(bNotFoundAssert, BCS.BOOL), TXB_OBJECT(txb, permission)],
84
85
  typeArguments:[pay_type]
85
86
  })
86
87
  } else {
87
88
  txb.moveCall({
88
89
  target:PROTOCOL.ServiceFn('price_set') as FnCallType,
89
- arguments:[TXB_OBJECT(txb, service), txb.pure(item), txb.pure(price, BCS.U64), TXB_OBJECT(txb, permission)],
90
+ arguments:[TXB_OBJECT(txb, service), txb.pure(item), txb.pure(price, BCS.U64),
91
+ txb.pure(bNotFoundAssert, BCS.BOOL), TXB_OBJECT(txb, permission)],
90
92
  typeArguments:[pay_type]
91
93
  })
92
94
  }
93
95
  return true
94
96
  }
95
97
  export function service_set_stock(pay_type:string, txb:TransactionBlock, service:ServiceObject, permission:PermissionObject,
96
- item:string, stock:number, passport?:PassportObject) : boolean {
98
+ item:string, stock:number, bNotFoundAssert:boolean=true, passport?:PassportObject) : boolean {
97
99
  if (!IsValidObjects([service, permission])) return false;
98
100
  if (!IsValidArgType(pay_type)) return false;
99
101
  if (!IsValidName(item) || !IsValidInt(stock)) return false;
@@ -101,53 +103,59 @@ export function service_set_stock(pay_type:string, txb:TransactionBlock, service
101
103
  if (passport) {
102
104
  txb.moveCall({
103
105
  target:PROTOCOL.ServiceFn('stock_set_with_passport') as FnCallType,
104
- arguments:[passport, TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock, BCS.U64), TXB_OBJECT(txb, permission)],
106
+ arguments:[passport, TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock, BCS.U64),
107
+ txb.pure(bNotFoundAssert, BCS.BOOL), TXB_OBJECT(txb, permission)],
105
108
  typeArguments:[pay_type]
106
109
  })
107
110
  } else {
108
111
  txb.moveCall({
109
112
  target:PROTOCOL.ServiceFn('stock_set') as FnCallType,
110
- arguments:[TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock, BCS.U64), TXB_OBJECT(txb, permission)],
113
+ arguments:[TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock, BCS.U64),
114
+ txb.pure(bNotFoundAssert, BCS.BOOL), TXB_OBJECT(txb, permission)],
111
115
  typeArguments:[pay_type]
112
116
  })
113
117
  }
114
118
  return true
115
119
  }
116
120
  export function service_add_stock(pay_type:string, txb:TransactionBlock, service:ServiceObject, permission:PermissionObject,
117
- item:string, stock_add:number, passport?:PassportObject) : boolean {
121
+ item:string, stock_add:number, bNotFoundAssert:boolean=true, passport?:PassportObject) : boolean {
118
122
  if (!IsValidObjects([service, permission])) return false;
119
123
  if (!IsValidArgType(pay_type)) return false;
120
124
  if (!IsValidName(item) || !IsValidUint(stock_add)) return false;
121
125
  if (passport) {
122
126
  txb.moveCall({
123
127
  target:PROTOCOL.ServiceFn('stock_add_with_passport') as FnCallType,
124
- arguments:[passport, TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock_add, BCS.U64), TXB_OBJECT(txb, permission)],
128
+ arguments:[passport, TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock_add, BCS.U64),
129
+ txb.pure(bNotFoundAssert, BCS.BOOL), TXB_OBJECT(txb, permission)],
125
130
  typeArguments:[pay_type]
126
131
  })
127
132
  } else {
128
133
  txb.moveCall({
129
134
  target:PROTOCOL.ServiceFn('stock_add') as FnCallType,
130
- arguments:[TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock_add, BCS.U64), TXB_OBJECT(txb, permission)],
135
+ arguments:[TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock_add, BCS.U64),
136
+ txb.pure(bNotFoundAssert, BCS.BOOL), TXB_OBJECT(txb, permission)],
131
137
  typeArguments:[pay_type]
132
138
  })
133
139
  }
134
140
  return true
135
141
  }
136
142
  export function service_reduce_stock(pay_type:string, txb:TransactionBlock, service:ServiceObject, permission:PermissionObject,
137
- item:string, stock_reduce:number, passport?:PassportObject) : boolean {
143
+ item:string, stock_reduce:number, bNotFoundAssert:boolean=true, passport?:PassportObject) : boolean {
138
144
  if (!IsValidObjects([service, permission])) return false;
139
145
  if (!IsValidArgType(pay_type)) return false;
140
146
  if (!IsValidName(item) || !IsValidUint(stock_reduce)) return false;
141
147
  if (passport) {
142
148
  txb.moveCall({
143
149
  target:PROTOCOL.ServiceFn('stock_reduce_with_passport') as FnCallType,
144
- arguments:[passport, TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock_reduce, BCS.U64), TXB_OBJECT(txb, permission)],
150
+ arguments:[passport, TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock_reduce, BCS.U64),
151
+ txb.pure(bNotFoundAssert, BCS.BOOL), TXB_OBJECT(txb, permission)],
145
152
  typeArguments:[pay_type]
146
153
  })
147
154
  } else {
148
155
  txb.moveCall({
149
156
  target:PROTOCOL.ServiceFn('stock_reduce') as FnCallType,
150
- arguments:[TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock_reduce, BCS.U64), TXB_OBJECT(txb, permission)],
157
+ arguments:[TXB_OBJECT(txb, service), txb.pure(item), txb.pure(stock_reduce, BCS.U64),
158
+ txb.pure(bNotFoundAssert, BCS.BOOL), TXB_OBJECT(txb, permission)],
151
159
  typeArguments:[pay_type]
152
160
  })
153
161
  }
@@ -372,30 +380,44 @@ export type Service_Sale = {
372
380
  stock:number;
373
381
  }
374
382
 
375
- export function service_add_sale(pay_type:string, txb:TransactionBlock, service:ServiceObject,
376
- permission:PermissionObject, sales:Service_Sale[], passport?:PassportObject) : boolean {
377
- if (!IsValidObjects([service, permission])) return false;
378
- if (!IsValidArgType(pay_type)) return false;
379
- let bValid = true;
383
+ export function is_valid_sale(sales:Service_Sale[]) : boolean {
384
+ let bValid = true; let names:string[] = [];
380
385
  sales.forEach((v) => {
381
386
  if (!IsValidName(v.item)) bValid = false;
382
387
  if (!IsValidInt(v.price)) bValid = false;
383
- if (!IsValidInt(v.stock)) bValid = false;
388
+ if (!IsValidUint(v.stock)) bValid = false;
389
+ if (names.includes(v.item)) bValid = false;
390
+ names.push(v.item)
384
391
  })
392
+ return bValid
393
+ }
394
+ export function service_add_sale(pay_type:string, txb:TransactionBlock, service:ServiceObject,
395
+ permission:PermissionObject, sales:Service_Sale[], passport?:PassportObject) : boolean {
396
+ if (!IsValidObjects([service, permission])) return false;
397
+ if (!IsValidArgType(pay_type)) return false;
398
+ if (!sales) return false;
399
+ let bValid = is_valid_sale(sales);
385
400
  if (!bValid) return false;
401
+
402
+ let names: string[] = []; let price: number[] = []; let stock: number[] = [];
403
+ sales.forEach((s) => {
404
+ names.push(s.item); price.push(s.price); stock.push(s.stock);
405
+ })
386
406
 
387
407
  if (passport) {
388
- sales.forEach((sale) => txb.moveCall({
408
+ txb.moveCall({
389
409
  target:PROTOCOL.ServiceFn('sales_add_with_passport') as FnCallType,
390
- arguments:[passport, TXB_OBJECT(txb, service), txb.pure(sale.item), txb.pure(sale.price, BCS.U64), txb.pure(sale.stock, BCS.U64), TXB_OBJECT(txb, permission)],
410
+ arguments:[passport, TXB_OBJECT(txb, service), txb.pure(BCS_CONVERT.ser_vector_string(names)),
411
+ txb.pure(BCS_CONVERT.ser_vector_u64(price)), txb.pure(BCS_CONVERT.ser_vector_u64(stock)), TXB_OBJECT(txb, permission)],
391
412
  typeArguments:[pay_type]
392
- }))
413
+ })
393
414
  } else {
394
- sales.forEach((sale) => txb.moveCall({
415
+ txb.moveCall({
395
416
  target:PROTOCOL.ServiceFn('sales_add') as FnCallType,
396
- arguments:[TXB_OBJECT(txb, service), txb.pure(sale.item), txb.pure(sale.price, BCS.U64), txb.pure(sale.stock, BCS.U64), TXB_OBJECT(txb, permission)],
417
+ arguments:[TXB_OBJECT(txb, service), txb.pure(BCS_CONVERT.ser_vector_string(names)),
418
+ txb.pure(BCS_CONVERT.ser_vector_u64(price)), txb.pure(BCS_CONVERT.ser_vector_u64(stock)), TXB_OBJECT(txb, permission)],
397
419
  typeArguments:[pay_type]
398
- }))
420
+ })
399
421
  }
400
422
  return true
401
423
  }
@@ -803,6 +825,7 @@ export function customer_refund(pay_type:string, txb:TransactionBlock, service:S
803
825
  }
804
826
  export type Service_Buy = {
805
827
  item: string;
828
+ max_price: number;
806
829
  count: number;
807
830
  }
808
831
 
@@ -828,42 +851,45 @@ export function buy(pay_type:string, txb:TransactionBlock, service:ServiceObject
828
851
  if (!IsValidArgType(pay_type)) return false;
829
852
  if (!buy_items) return false;
830
853
 
831
- let bValid = true;
854
+ let bValid = true; let names:string[] = [];
832
855
  buy_items.forEach((v) => {
833
856
  if (!IsValidName(v.item)) bValid = false;
857
+ if (!IsValidInt(v.max_price)) bValid = false;
834
858
  if (!IsValidUint(v.count)) bValid = false;
859
+ if (names.includes(v.item)) bValid = false;
860
+ names.push(v.item)
835
861
  })
836
862
  if (!bValid) return false;
837
863
 
838
- let i:string[] = []; let c:number[] = []; let order;
839
- buy_items.forEach((item) => { i.push(item.item); c.push(item.count); })
864
+ let name:string[] = []; let price:number[] = []; let stock:number[] = []; let order;
865
+ buy_items.forEach((b) => { name.push(b.item); price.push(b.max_price); stock.push(b.count)})
840
866
 
841
867
  if (passport) {
842
868
  if (discount) {
843
869
  order = txb.moveCall({
844
870
  target:PROTOCOL.ServiceFn('dicount_buy_with_passport') as FnCallType,
845
- arguments: [passport, TXB_OBJECT(txb, service), txb.pure(BCS_CONVERT.ser_vector_string(i)),
846
- txb.pure(BCS_CONVERT.ser_vector_u64(c)), TXB_OBJECT(txb, coin), TXB_OBJECT(txb, discount), txb.object(CLOCK_OBJECT)],
871
+ arguments: [passport, TXB_OBJECT(txb, service), txb.pure(BCS_CONVERT.ser_vector_string(name)), txb.pure(BCS_CONVERT.ser_vector_u64(price)),
872
+ txb.pure(BCS_CONVERT.ser_vector_u64(stock)), TXB_OBJECT(txb, coin), TXB_OBJECT(txb, discount), txb.object(CLOCK_OBJECT)],
847
873
  typeArguments:[pay_type]
848
874
  })} else {
849
875
  order = txb.moveCall({
850
876
  target:PROTOCOL.ServiceFn('buy_with_passport') as FnCallType,
851
- arguments: [passport, TXB_OBJECT(txb, service), txb.pure(BCS_CONVERT.ser_vector_string(i)),
852
- txb.pure(BCS_CONVERT.ser_vector_u64(c)), TXB_OBJECT(txb, coin)],
877
+ arguments: [passport, TXB_OBJECT(txb, service), txb.pure(BCS_CONVERT.ser_vector_string(name)), txb.pure(BCS_CONVERT.ser_vector_u64(price)),
878
+ txb.pure(BCS_CONVERT.ser_vector_u64(stock)), TXB_OBJECT(txb, coin)],
853
879
  typeArguments:[pay_type]
854
880
  })}
855
881
  } else {
856
882
  if (discount) {
857
883
  order = txb.moveCall({
858
884
  target:PROTOCOL.ServiceFn('disoucnt_buy') as FnCallType,
859
- arguments: [TXB_OBJECT(txb, service), txb.pure(BCS_CONVERT.ser_vector_string(i)),
860
- txb.pure(BCS_CONVERT.ser_vector_u64(c)), TXB_OBJECT(txb, coin), TXB_OBJECT(txb, discount), txb.object(CLOCK_OBJECT)],
885
+ arguments: [TXB_OBJECT(txb, service), txb.pure(BCS_CONVERT.ser_vector_string(name)), txb.pure(BCS_CONVERT.ser_vector_u64(price)),
886
+ txb.pure(BCS_CONVERT.ser_vector_u64(stock)), TXB_OBJECT(txb, coin), TXB_OBJECT(txb, discount), txb.object(CLOCK_OBJECT)],
861
887
  typeArguments:[pay_type]
862
888
  })} else {
863
889
  order = txb.moveCall({
864
890
  target:PROTOCOL.ServiceFn('buy') as FnCallType,
865
- arguments: [TXB_OBJECT(txb, service), txb.pure(BCS_CONVERT.ser_vector_string(i)),
866
- txb.pure(BCS_CONVERT.ser_vector_u64(c)), TXB_OBJECT(txb, coin)],
891
+ arguments: [TXB_OBJECT(txb, service), txb.pure(BCS_CONVERT.ser_vector_string(name)), txb.pure(BCS_CONVERT.ser_vector_u64(price)),
892
+ txb.pure(BCS_CONVERT.ser_vector_u64(stock)), TXB_OBJECT(txb, coin)],
867
893
  typeArguments:[pay_type]
868
894
  })}
869
895
  }