wowok
Version:
Create, collaborate, and transact on your own terms with the AI-driven web3 collaboration protocol.
1,029 lines (960 loc) • 63.6 kB
text/typescript
import { IsValidArray, IsValidPercent, IsValidName_AllowEmpty, parseObjectType, array_unique, IsValidTokenType, IsValidDesription,
IsValidAddress, IsValidEndpoint, IsValidU64,
IsValidName, } from './utils'
import { FnCallType, GuardObject, PassportObject, PermissionObject, RepositoryObject, MachineObject, ServiceAddress,
ServiceObject, DiscountObject, OrderObject, OrderAddress, CoinObject, Protocol, ValueType,
TxbObject, TreasuryObject, PaymentAddress, ArbObject,
ArbitrationObject, ProgressObject, ProgressAddress} from './protocol';
import { ERROR, Errors } from './exception';
import { Transaction as TransactionBlock, } from '@mysten/sui/transactions';
import { SuiObjectData } from '@mysten/sui/client';
export type Service_Guard_Percent = {
guard:GuardObject;
percent: number; // [0-100]
}
export type Service_Sale = {
item: string;
price: string | number | bigint;
stock: string | number | bigint;
endpoint?:string | null;
}
export enum Service_Discount_Type {
ratio = 0, // -off%
minus = 1, // -off
}
export type Service_Discount = {
name: string; // not empty
type: Service_Discount_Type;
off: number;
duration_minutes: number;
time_start?: number; // current time if undefined
price_greater?: bigint | string | number;
}
export type Service_Buy_RequiredInfo = {
pubkey: string;
customer_info: string[];
}
export type Customer_RequiredInfo = {
customer_pubkey: string;
customer_info_crypt: string;
}
export enum BuyRequiredEnum {
address = 'address',
phone = 'phone',
name = 'name',
postcode = 'postcode'
}
export type Service_Buy = {
item: string;
max_price: string | number | bigint;
count: string | number | bigint;
}
export type DicountDispatch = {
receiver: string;
count: number;
discount: Service_Discount;
}
export interface WithdrawPayee {
withdraw_guard: GuardObject;
treasury: TreasuryObject,
index: bigint | number | string,
remark: string,
for_object?: string,
for_guard?: GuardObject,
}
export interface BuyResult {
order: OrderAddress;
progress?: ProgressAddress;
}
export interface OrderResult {
order: OrderObject;
progress?: ProgressObject;
}
export type handleDiscountObject = (owner:string, objects:(SuiObjectData|null|undefined)[]) => void;
export class Service {
protected pay_token_type;
protected permission;
protected object : TxbObject;
protected txb;
//static token2coin = (token:string) => { return '0x2::coin::Coin<' + token + '>'};
get_pay_type() { return this.pay_token_type }
get_object() { return this.object }
private constructor(txb: TransactionBlock, pay_token_type:string, permission:PermissionObject) {
this.pay_token_type = pay_token_type
this.txb = txb
this.permission = permission
this.object = ''
}
static From(txb: TransactionBlock, token_type:string, permission:PermissionObject, object:TxbObject) : Service {
let s = new Service(txb, token_type, permission);
s.object = Protocol.TXB_OBJECT(txb, object);
return s
}
static New(txb: TransactionBlock, token_type:string, permission:PermissionObject, description:string,
payee_treasury:TreasuryObject, passport?:PassportObject) : Service {
if (!Protocol.IsValidObjects([permission, payee_treasury])) {
ERROR(Errors.IsValidObjects)
}
if (!IsValidTokenType(token_type)) {
ERROR(Errors.IsValidTokenType, 'New: pay_token_type')
}
if (!IsValidDesription(description)) {
ERROR(Errors.IsValidDesription)
}
let pay_token_type = token_type;
let s = new Service(txb, pay_token_type, permission);
if (passport) {
s.object = txb.moveCall({
target:Protocol.Instance().serviceFn('new_with_passport') as FnCallType,
arguments:[passport, txb.pure.string(description), txb.object(payee_treasury), Protocol.TXB_OBJECT(txb, permission)],
typeArguments:[pay_token_type],
})
} else {
s.object = txb.moveCall({
target:Protocol.Instance().serviceFn('new') as FnCallType,
arguments:[txb.pure.string(description), txb.object(payee_treasury), Protocol.TXB_OBJECT(txb, permission)],
typeArguments:[pay_token_type],
})
}
return s
}
launch() : ServiceAddress {
return this.txb.moveCall({
target:Protocol.Instance().serviceFn('create') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object)],
typeArguments:[this.pay_token_type]
})
}
set_description(description:string, passport?:PassportObject) {
if (!IsValidDesription(description)) {
ERROR(Errors.IsValidDesription)
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('description_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(description), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('description_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(description), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
set_price(item:string, price:bigint, bNotFoundAssert:boolean=true, passport?:PassportObject) {
if (!IsValidU64(price)) {
ERROR(Errors.IsValidU64, 'set_price price')
}
if (!Service.IsValidItemName(item)) {
ERROR(Errors.IsValidServiceItemName, 'set_price item')
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('price_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(item),
this.txb.pure.u64(price),
this.txb.pure.bool(bNotFoundAssert), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('price_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(item),
this.txb.pure.u64(price),
this.txb.pure.bool(bNotFoundAssert), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
set_stock(item:string, stock:bigint, bNotFoundAssert:boolean=true, passport?:PassportObject) {
if (!Service.IsValidItemName(item)) {
ERROR(Errors.IsValidServiceItemName, 'item')
}
if (!IsValidU64(stock)) {
ERROR(Errors.IsValidU64, 'stock')
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('stock_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(item),
this.txb.pure.u64(stock),
this.txb.pure.bool(bNotFoundAssert), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('stock_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(item),
this.txb.pure.u64(stock),
this.txb.pure.bool(bNotFoundAssert), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
add_stock(item:string, stock_add:bigint, bNotFoundAssert:boolean=true, passport?:PassportObject) {
if (!Service.IsValidItemName(item)) {
ERROR(Errors.IsValidServiceItemName, 'add_stock item')
}
if (!IsValidU64(stock_add)) {
ERROR(Errors.IsValidUint, 'add_stock stock_add')
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('stock_add_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(item),
this.txb.pure.u64(stock_add),
this.txb.pure.bool(bNotFoundAssert), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('stock_add') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(item),
this.txb.pure.u64(stock_add),
this.txb.pure.bool(bNotFoundAssert), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
reduce_stock(item:string, stock_reduce:bigint, bNotFoundAssert:boolean=true, passport?:PassportObject) {
if (!Service.IsValidItemName(item)) {
ERROR(Errors.IsValidServiceItemName, 'reduce_stock item')
}
if (!IsValidU64(stock_reduce)) {
ERROR(Errors.IsValidUint, 'reduce_stock stock_reduce')
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('stock_reduce_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(item),
this.txb.pure.u64(stock_reduce),
this.txb.pure.bool(bNotFoundAssert), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('stock_reduce') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(item),
this.txb.pure.u64(stock_reduce),
this.txb.pure.bool(bNotFoundAssert), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
set_sale_endpoint(item:string, endpoint?:string|null, bNotFoundAssert:boolean=true, passport?:PassportObject) {
if (!Service.IsValidItemName(item)) {
ERROR(Errors.IsValidServiceItemName, 'set_sale_endpoint item')
}
if (endpoint && !IsValidEndpoint(endpoint)) {
ERROR(Errors.IsValidEndpoint, 'set_sale_endpoint endpoint')
}
let ep = this.txb.pure.option('string', endpoint ? endpoint : undefined);
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('sale_endpoint_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(item), ep,
this.txb.pure.bool(bNotFoundAssert), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('sale_endpoint_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(item), ep,
this.txb.pure.bool(bNotFoundAssert), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
set_payee(payee:TreasuryObject, passport?:PassportObject) {
if (!Protocol.IsValidObjects([payee])) {
ERROR(Errors.IsValidObjects, 'set_payee');
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('payee_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.object(payee), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('payee_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.object(payee), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
add_repository(repository:RepositoryObject, passport?:PassportObject) {
if (!Protocol.IsValidObjects([repository])) {
ERROR(Errors.IsValidObjects, 'repository_add');
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('repository_add_with_passport') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, repository), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('repository_add') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, repository), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
remove_repository(repository_address:string[], removeall?:boolean, passport?:PassportObject) {
if (!removeall && repository_address.length===0) return;
if (!IsValidArray(repository_address, IsValidAddress)) {
ERROR(Errors.IsValidArray, 'repository_address');
}
if (passport) {
if (removeall) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('repository_remove_all_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('repository_remove_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', array_unique(repository_address!)),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
} else {
if (removeall) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('repository_remove_all') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('repository_remove') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', array_unique(repository_address!)),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
}
add_arbitration(arbitraion:ArbitrationObject, arbitraion_token_type:string, passport?:PassportObject) {
if (!Protocol.IsValidObjects([arbitraion])) {
ERROR(Errors.IsValidObjects, 'add_arbitration.arbitraion');
}
if (!IsValidTokenType(arbitraion_token_type)) {
ERROR(Errors.IsValidTokenType, 'add_arbitration.arbitraion_token_type')
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('arbitration_add_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, arbitraion), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type, arbitraion_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('arbitration_add') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, arbitraion), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type, arbitraion_token_type]
})
}
}
remove_arbitration(address:string[], removeall?:boolean, passport?:PassportObject) {
if (!removeall && address.length===0) return;
if (!IsValidArray(address, IsValidAddress)) {
ERROR(Errors.IsValidArray, 'remove_arbitration.address');
}
if (passport) {
if (removeall) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('arbitration_remove_all_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('arbitration_remove_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', array_unique(address!)),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
} else {
if (removeall) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('arbitration_remove_all') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('arbitration_remove') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', array_unique(address!)),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
}
add_withdraw_guards(guards:Service_Guard_Percent[], passport?:PassportObject) {
if (guards.length === 0) return;
let bValid = true;
guards.forEach((v) => {
if (!Protocol.IsValidObjects([v.guard])) bValid = false;
if (!IsValidPercent(v.percent)) bValid = false;
})
if (!bValid) {
ERROR(Errors.InvalidParam, 'guards')
}
guards.forEach((guard) => {
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('withdraw_guard_add_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, guard.guard),
this.txb.pure.u8(guard.percent), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('withdraw_guard_add') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, guard.guard), this.txb.pure.u8(guard.percent),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
})
}
remove_withdraw_guards(guard_address:string[], removeall?:boolean, passport?:PassportObject) {
if (!removeall && guard_address.length===0) {
return
}
if (!IsValidArray(guard_address, IsValidAddress)) {
ERROR(Errors.IsValidArray, 'guard_address')
}
if (passport) {
if (removeall) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('withdraw_guard_remove_all_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('withdraw_guard_remove_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', array_unique(guard_address!)),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
} else {
if (removeall) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('withdraw_guard_remove_all') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('withdraw_guard_remove') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', array_unique(guard_address!)),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
}
add_refund_guards(guards:Service_Guard_Percent[], passport?:PassportObject) {
if (guards.length === 0) return;
let bValid = true;
guards.forEach((v) => {
if (!Protocol.IsValidObjects([v.guard])) bValid = false;
if (!IsValidPercent(v.percent)) bValid = false;
})
if (!bValid) {
ERROR(Errors.InvalidParam, 'guards')
}
guards.forEach((guard) => {
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('refund_guard_add_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, guard.guard),
this.txb.pure.u8(guard.percent), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('refund_guard_add') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, guard.guard), this.txb.pure.u8(guard.percent),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
})
}
remove_refund_guards(guard_address:string[], removeall?:boolean, passport?:PassportObject) {
if (guard_address.length===0 && !removeall) return ;
if (!IsValidArray(guard_address, IsValidAddress)) {
ERROR(Errors.InvalidParam, 'guard_address')
}
if (passport) {
if (removeall) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('refund_guard_remove_all_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('refund_guard_remove_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', array_unique(guard_address!)),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
} else {
if (removeall) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('refund_guard_remove_all') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('refund_guard_remove') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', array_unique(guard_address!)),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
}
is_valid_sale(sales:Service_Sale[]) {
let bValid = true; let names:string[] = [];
sales.forEach((v) => {
if (!Service.IsValidItemName(v.item)) bValid = false;
if (!IsValidU64(v.price)) bValid = false;
if (!IsValidU64(v.stock)) bValid = false;
if (names.includes(v.item)) bValid = false;
names.push(v.item)
})
return bValid
}
add_sales(sales:Service_Sale[], bExistAssert:boolean=false, passport?:PassportObject) {
if (sales.length === 0) return;
if (!this.is_valid_sale(sales)) {
ERROR(Errors.InvalidParam, 'add_sales')
}
let names: string[] = []; let price: (string | number | bigint)[] = []; let stock: (string | number | bigint)[] = []; let endpoint: string[] = [];
sales.forEach((s) => {
if (s.endpoint && !IsValidEndpoint(s.endpoint)) {
ERROR(Errors.IsValidEndpoint, 'add_sales')
}
names.push(s.item); price.push(s.price); stock.push(s.stock); endpoint.push(s.endpoint ?? '')
})
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('sales_add_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('string', names),
this.txb.pure.vector('string', endpoint),
this.txb.pure.vector('u64', price), this.txb.pure.vector('u64', stock),
this.txb.pure.bool(bExistAssert),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('sales_add') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('string', names),
this.txb.pure.vector('string', endpoint),
this.txb.pure.vector('u64', price), this.txb.pure.vector('u64', stock),
this.txb.pure.bool(bExistAssert),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
remove_sales(sales:string[], passport?:PassportObject) {
if (sales.length === 0) return;
if (!IsValidArray(sales, Service.IsValidItemName)) {
ERROR(Errors.IsValidArray, 'remove_sales')
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('sales_remove_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('string', array_unique(sales!)),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('sales_remove') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('string', array_unique(sales!)),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
discount_transfer(discount_dispatch:DicountDispatch[], passport?:PassportObject) {
if (!discount_dispatch || discount_dispatch.length > Service.MAX_DISCOUNT_RECEIVER_COUNT) {
ERROR(Errors.InvalidParam, 'discount_dispatch')
}
let bValid = true;
discount_dispatch.forEach((v) => {
if (!IsValidAddress(v.receiver)) bValid = false;
if (!IsValidU64(v.count) || v.count > Service.MAX_DISCOUNT_COUNT_ONCE) bValid = false;
if (!IsValidName_AllowEmpty(v.discount.name)) bValid = false;
if (v.discount.type == Service_Discount_Type.ratio && !IsValidPercent(v.discount.off)) bValid = false;
if (!IsValidU64(v.discount.duration_minutes)) bValid = false;
if (v.discount?.time_start && !IsValidU64(v.discount.time_start)) bValid = false;
if (v.discount?.price_greater && !IsValidU64(v.discount.price_greater)) bValid = false;
})
if (!bValid) {
ERROR(Errors.InvalidParam, 'discount_dispatch')
}
const clock = this.txb.sharedObjectRef(Protocol.CLOCK_OBJECT);
discount_dispatch.forEach((discount) => {
let price_greater = this.txb.pure.option('u64', discount.discount?.price_greater ? discount.discount?.price_greater : undefined);
let time_start = this.txb.pure.option('u64', discount.discount?.time_start ? discount.discount?.time_start : undefined);
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('dicscount_create_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(discount.discount.name),
this.txb.pure.u8(discount.discount.type),
this.txb.pure.u64(discount.discount.off), price_greater, time_start,
this.txb.pure.u64(discount.discount.duration_minutes), this.txb.pure.u64(discount.count),
Protocol.TXB_OBJECT(this.txb, this.permission), this.txb.pure.address(discount.receiver), this.txb.object(clock)],
typeArguments:[this.pay_token_type]
});
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('dicscount_create') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(discount.discount.name),
this.txb.pure.u8(discount.discount.type),
this.txb.pure.u64(discount.discount.off), price_greater, time_start,
this.txb.pure.u64(discount.discount.duration_minutes), this.txb.pure.u64(discount.count),
Protocol.TXB_OBJECT(this.txb, this.permission), this.txb.pure.address(discount.receiver),
this.txb.object(clock)],
typeArguments:[this.pay_token_type]
})
}
});
}
// support both withdraw guard and permission guard
// withdraw_guard & passport must BOTH valid.
withdraw(order:OrderObject, param:WithdrawPayee, passport:PassportObject) : PaymentAddress {
if (!Protocol.IsValidObjects([order, param.treasury, param.withdraw_guard, passport])) {
ERROR(Errors.IsValidObjects,)
}
if (param?.for_guard && !Protocol.IsValidObjects([param.for_guard])) {
ERROR(Errors.IsValidObjects, 'withdraw.param.for_guard')
}
if (param?.for_object && !IsValidAddress(param.for_object)) {
ERROR(Errors.IsValidAddress, 'withdraw.param.for_object')
}
if (!IsValidU64(param.index)) {
ERROR(Errors.IsValidU64, 'withdraw.param.index')
}
if (!IsValidDesription(param.remark)) {
ERROR(Errors.IsValidDesription, 'withdraw.param.remark')
}
const for_obj = this.txb.pure.option('address', param.for_object ? param.for_object : undefined);
const clock = this.txb.sharedObjectRef(Protocol.CLOCK_OBJECT);
if (param.for_guard) {
return this.txb.moveCall({
target:Protocol.Instance().serviceFn('withdraw_forGuard_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, order), this.txb.object(param.withdraw_guard),
this.txb.object(param.treasury), for_obj, this.txb.object(param.for_guard), this.txb.pure.u64(param.index), this.txb.pure.string(param.remark),
this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
return this.txb.moveCall({
target:Protocol.Instance().serviceFn('withdraw_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, order), this.txb.object(param.withdraw_guard),
this.txb.object(param.treasury), for_obj, this.txb.pure.u64(param.index), this.txb.pure.string(param.remark),
this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
set_buy_guard(guard?:GuardObject, passport?:PassportObject) {
if (passport) {
if (guard) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('buy_guard_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, guard), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('buy_guard_none_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
} else {
if (guard) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('buy_guard_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, guard), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('buy_guard_none') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
}
set_machine(machine?:MachineObject, passport?:PassportObject) {
if (passport) {
if (machine) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('machine_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, machine), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('machine_none_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
} else {
if (machine) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('machine_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, machine), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('machine_none') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
}
set_endpoint(endpoint?:string, passport?:PassportObject) {
if (endpoint && !IsValidEndpoint(endpoint)) {
ERROR(Errors.IsValidEndpoint);
}
let ep = this.txb.pure.option('string', endpoint ? endpoint : undefined);
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('endpoint_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), ep, Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('endpoint_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), ep, Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
publish(passport?:PassportObject) {
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('publish_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('publish') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
clone(new_token_type?:string, bLaunch?:boolean, passport?:PassportObject) : ServiceObject | ServiceAddress {
let ret : ServiceObject | undefined;
if (passport) {
ret = this.txb.moveCall({
target:Protocol.Instance().serviceFn('clone_withpassport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type, new_token_type ? new_token_type : this.pay_token_type]
})
} else {
ret = this.txb.moveCall({
target:Protocol.Instance().serviceFn('clone') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type, new_token_type ? new_token_type : this.pay_token_type]
})
}
if (bLaunch) {
return this.txb.moveCall({
target:Protocol.Instance().serviceFn('create') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, ret)],
typeArguments:[new_token_type ? new_token_type : this.pay_token_type]
})
} else {
return ret;
}
}
set_customer_required(pubkey:string, customer_required: (BuyRequiredEnum | string)[], passport?:PassportObject) {
if(customer_required.length > 0 && !pubkey) {
ERROR(Errors.InvalidParam, 'set_customer_required')
}
if(pubkey.length > Service.MAX_PUBKEY_SIZE) {
ERROR(Errors.InvalidParam, 'set_customer_required.pubkey')
}
if(customer_required.length > Service.MAX_REQUIRES_COUNT) {
ERROR(Errors.InvalidParam, 'set_customer_required.customer_required')
}
if(!IsValidArray(customer_required, IsValidName)) {
ERROR(Errors.IsValidArray, 'set_customer_required.customer_required')
}
let req = array_unique(customer_required) as string[];
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('required_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object),
this.txb.pure.vector('string', req),
this.txb.pure.string(pubkey), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('required_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object),
this.txb.pure.vector('string', req),
this.txb.pure.string(pubkey), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
remove_customer_required(passport?:PassportObject) {
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('required_none_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('required_none') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
change_required_pubkey(pubkey:string, passport?:PassportObject) {
if (!pubkey) {
ERROR(Errors.InvalidParam, 'pubkey')
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('required_pubkey_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(pubkey),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('required_pubkey_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.string(pubkey),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
/*
change_order_required_pubkey(order:OrderObject, pubkey:string, passport?:PassportObject) {
if (!Protocol.IsValidObjects([order])) {
ERROR(Errors.IsValidObjects, 'order')
}
if (!pubkey) {
ERROR(Errors.InvalidParam, 'pubkey')
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('order_pubkey_update_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, order), this.txb.pure.string(pubkey),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('order_pubkey_update') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, order), this.txb.pure.string(pubkey),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
} */
pause(pause:boolean, passport?:PassportObject) {
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('pause_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.bool(pause), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('pause') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.bool(pause), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.pay_token_type]
})
}
}
refund_withArb(order:OrderObject, arb:ArbObject, arb_type:string) {
if (!Protocol.IsValidObjects([order, arb])) {
ERROR(Errors.IsValidObjects, 'refund_withArb.order or arb')
}
if (!IsValidTokenType(arb_type)) {
ERROR(Errors.IsValidTokenType, 'refund_withArb.arb_type')
}
const clock = this.txb.sharedObjectRef(Protocol.CLOCK_OBJECT);
this.txb.moveCall({
target:Protocol.Instance().serviceFn('refund_with_arb') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, order), this.txb.object(arb), this.txb.object(clock)],
typeArguments:[this.pay_token_type, arb_type]
})
}
refund(order:OrderObject, refund_guard?:GuardObject, passport?:PassportObject) {
if (!Protocol.IsValidObjects([order])) {
ERROR(Errors.IsValidObjects, 'refund.order')
}
if (refund_guard && !Protocol.IsValidObjects([refund_guard])) {
ERROR(Errors.IsValidObjects, 'refund.refund_guard')
}
if (passport && !refund_guard) {
ERROR(Errors.InvalidParam, 'refund.passport need refund_guard')
}
const clock = this.txb.sharedObjectRef(Protocol.CLOCK_OBJECT);
if (passport && refund_guard) {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('refund_with_passport') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, order), this.txb.object(refund_guard),
passport, this.txb.object(clock)],
typeArguments:[this.pay_token_type]
})
} else {
this.txb.moveCall({
target:Protocol.Instance().serviceFn('refund') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, order)],
typeArguments:[this.pay_token_type]
})
}
}
update_order_required_info(order:OrderObject, customer_info_crypto: Customer_RequiredInfo) {
if (!customer_info_crypto.customer_pubkey) {
return
}
if (!Protocol.IsValidObjects([order])) {
ERROR(Errors.IsValidObjects, 'update_order_required_info.order')
}
this.txb.moveCall({
target:Protocol.Instance().serviceFn('order_required_info_update') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, order),
this.txb.pure.string(customer_info_crypto.customer_pubkey),
this.txb.pure.string(customer_info_crypto.customer_info_cry