wowok
Version:
Create, collaborate, and transact on your own terms with the AI-driven web3 collaboration protocol.
425 lines (394 loc) • 21.3 kB
text/typescript
import { type TransactionResult, Transaction as TransactionBlock } from '@mysten/sui/transactions';
import { FnCallType, Protocol, PassportObject, PermissionObject, TreasuryAddress, TxbObject, CoinObject, PaymentObject,
ReceivedObject } from './protocol';
import { IsValidDesription, IsValidU64, IsValidAddress, IsValidArgType, IsValidArray, parseObjectType} from './utils'
import { Errors, ERROR} from './exception'
export enum Treasury_WithdrawMode {
PERMISSION = 0,
GUARD_ONLY_AND_IMMUTABLE = 1,
BOTH_PERMISSION_AND_GUARD = 2,
}
export enum Treasury_Operation {
WITHDRAW = 1,
DEPOSIT = 2,
RECEIVE = 4,
}
export interface DepositParam {
coin: CoinObject,
index: bigint,
remark: string,
for_object?: string,
for_guard?: string,
}
export interface WithdrawItem {
address: string,
amount: bigint | number | string,
}
export interface WithdrawParam {
items: WithdrawItem[],
index: bigint | number | string,
remark: string,
for_object?: string,
for_guard?: string,
withdraw_guard?: string,
}
export class Treasury {
protected token_type;
protected permission ;
protected object : TxbObject;
protected txb;
get_token_type() { return this.token_type }
get_object() { return this.object }
static From(txb:TransactionBlock, token_type:string, permission:PermissionObject, object:TxbObject) : Treasury {
let d = new Treasury(txb, token_type, permission)
d.object = Protocol.TXB_OBJECT(txb, object)
return d
}
private constructor(txb:TransactionBlock, token_type:string, permission:PermissionObject) {
this.token_type = token_type;
this.permission = permission;
this.txb = txb;
this.object = '';
}
static New(txb:TransactionBlock, token_type:string, permission:PermissionObject, description:string, passport?:PassportObject) : Treasury {
if (!Protocol.IsValidObjects([permission])) {
ERROR(Errors.IsValidObjects, 'Treasury.New permission, bounty');
}
if (!IsValidDesription(description)) {
ERROR(Errors.IsValidDesription, 'Treasury.New.description');
}
if (!IsValidArgType(token_type)) {
ERROR(Errors.IsValidArgType, token_type);
}
let d = new Treasury(txb, token_type, permission);
if (passport) {
d.object = txb.moveCall({
target:Protocol.Instance().treasuryFn('new_with_passport') as FnCallType,
arguments:[passport, txb.pure.string(description), Protocol.TXB_OBJECT(txb, permission)],
typeArguments:[token_type],
})
} else {
d.object = txb.moveCall({
target:Protocol.Instance().treasuryFn('new') as FnCallType,
arguments:[txb.pure.string(description), Protocol.TXB_OBJECT(txb, permission)],
typeArguments:[token_type],
})
}
return d
}
launch() : TreasuryAddress {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('create') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object)],
typeArguments:[this.token_type],
})
}
set_deposit_guard(guard?:string, passport?:PassportObject) {
if (guard && !IsValidAddress(guard)) {
ERROR(Errors.IsValidAddress, 'set_deposit_guard.guard')
}
if (passport) {
if (guard) {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('deposit_guard_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object),
this.txb.object(guard), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
} else {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('deposit_guard_none_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
} else {
if (guard) {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('deposit_guard_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object),
this.txb.object(guard), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
} else {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('deposit_guard_none') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
}
}
// return payment address
deposit(param:DepositParam, passport?:PassportObject) :TransactionResult {
if (!Protocol.IsValidObjects([param.coin])) {
ERROR(Errors.IsValidObjects, 'deposit.param.coin')
}
if (!IsValidDesription(param.remark)) {
ERROR(Errors.IsValidDesription, 'deposit.param.remark')
}
if (param?.for_object && !IsValidAddress(param.for_object)) {
ERROR(Errors.IsValidAddress, 'deposit.param.for_object')
}
if (param?.for_guard && !IsValidAddress(param.for_guard)) {
ERROR(Errors.IsValidAddress, 'deposit.param.for_guard')
}
if (param.index !== undefined && !IsValidU64(param.index)) {
ERROR(Errors.InvalidParam, 'deposit.param.index')
}
const for_obj = this.txb.pure.option('address', param.for_object ? param.for_object: undefined);
const clock = this.txb.sharedObjectRef(Protocol.CLOCK_OBJECT);
if (passport) {
if (param.for_guard) {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('deposit_forGuard_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, param.coin), this.txb.pure.u64(param.index),
this.txb.pure.string(param.remark), for_obj, this.txb.object(param.for_guard), this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
} else {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('deposit_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, param.coin), this.txb.pure.u64(param.index),
this.txb.pure.string(param.remark), for_obj, this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
} else {
if (param.for_guard) {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('deposit_forGuard') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, param.coin), this.txb.pure.u64(param.index),
this.txb.pure.string(param.remark), for_obj, this.txb.object(param.for_guard), this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
} else {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('deposit') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, param.coin), this.txb.pure.u64(param.index),
this.txb.pure.string(param.remark), for_obj, this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
}
}
// return current balance
receive(payment:PaymentObject, received:ReceivedObject, passport?:PassportObject) : TransactionResult {
if (!Protocol.IsValidObjects([payment, received])) {
ERROR(Errors.IsValidArray, 'receive.payment&received');
}
const clock = this.txb.sharedObjectRef(Protocol.CLOCK_OBJECT);
if (passport) {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('receive_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.object(received), this.txb.object(payment),
this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
} else {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('receive') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.object(received), this.txb.object(payment),
this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
}
// return payment address
withdraw(param:WithdrawParam, passport?:PassportObject) : TransactionResult | undefined {
if (param.items.length === 0) return undefined;
if (!IsValidArray(param.items, (item:WithdrawItem) => IsValidU64(item.amount) && IsValidAddress(item.address))) {
ERROR(Errors.IsValidArray, 'withdraw.param.items')
}
if (!IsValidDesription(param.remark)) {
ERROR(Errors.IsValidDesription, 'withdraw.param.remark')
}
if (!IsValidU64(param.index)) {
ERROR(Errors.IsValidU64, 'withdraw.param.index')
}
if (param?.for_guard && !IsValidAddress(param.for_guard)) {
ERROR(Errors.IsValidAddress, 'withdraw.param.for_guard')
}
if (param?.for_object && !IsValidAddress(param.for_object)) {
ERROR(Errors.IsValidAddress, 'withdraw.param.for_object')
}
if (param?.withdraw_guard && !IsValidAddress(param.withdraw_guard)) {
ERROR(Errors.IsValidAddress, 'withdraw.param.withdraw_guard')
}
if (param?.withdraw_guard && !passport) {
ERROR(Errors.IsValidAddress, 'withdraw.param.withdraw_guard')
}
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.withdraw_guard && passport) { //@ dont need passport, use withdraw guard!
if (param.for_guard) {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_useGuard_forGuard') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', param.items.map(v=>v.address)),
this.txb.pure.vector('u64', param.items.map(v=>v.amount)), this.txb.pure.u64(param.index), this.txb.pure.string(param.remark),
for_obj, this.txb.object(param.for_guard), this.txb.object(clock), this.txb.object(param.withdraw_guard)],
typeArguments:[this.token_type],
})
} else {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_useGuard') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', param.items.map(v=>v.address)),
this.txb.pure.vector('u64', param.items.map(v=>v.amount)), this.txb.pure.u64(param.index), this.txb.pure.string(param.remark),
for_obj, this.txb.object(clock), this.txb.object(param.withdraw_guard)],
typeArguments:[this.token_type],
})
}
} else {
if (passport) {
if (param.for_guard) {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_forGuard_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', param.items.map(v=>v.address)),
this.txb.pure.vector('u64', param.items.map(v=>v.amount)), this.txb.pure.u64(param.index),
this.txb.pure.string(param.remark), for_obj, this.txb.object(param.for_guard), this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
} else {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', param.items.map(v=>v.address)),
this.txb.pure.vector('u64', param.items.map(v=>v.amount)), this.txb.pure.u64(param.index),
this.txb.pure.string(param.remark), for_obj, this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
} else {
if (param.for_guard) {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_forGuard') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', param.items.map(v=>v.address)),
this.txb.pure.vector('u64', param.items.map(v=>v.amount)), this.txb.pure.u64(param.index),
this.txb.pure.string(param.remark), for_obj, this.txb.object(param.for_guard), this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
} else {
return this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', param.items.map(v=>v.address)),
this.txb.pure.vector('u64', param.items.map(v=>v.amount)), this.txb.pure.u64(param.index),
this.txb.pure.string(param.remark), for_obj, this.txb.object(clock), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
}
}
}
set_description(description:string, passport?:PassportObject) {
if (!IsValidDesription(description)) {
ERROR(Errors.IsValidDesription, 'set_description.description');
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('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.token_type],
})
} else {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('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.token_type],
})
}
}
set_withdraw_mode(mode: Treasury_WithdrawMode, passport?: PassportObject) {
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_mode_set_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.u8(mode), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
} else {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_mode_set') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.u8(mode), Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
}
add_withdraw_guard(guard:string, amount:bigint, passport?:PassportObject) {
if (!IsValidAddress(guard)) {
ERROR(Errors.IsValidAddress, 'add_withdraw_guard.guard')
}
if (!IsValidU64(amount)) {
ERROR(Errors.IsValidU64, 'add_withdraw_guard.amount')
}
if (passport) {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_guard_add_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.object(guard), this.txb.pure.u64(amount),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
} else {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_guard_add') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.object(guard), this.txb.pure.u64(amount),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
}
remove_withdraw_guard(guard:string[], removeall?:boolean, passport?:PassportObject) {
if (guard.length === 0 && !removeall) return ;
if (!IsValidArray(guard, IsValidAddress)) {
ERROR(Errors.IsValidArray, 'add_withdraw_guard.guard')
}
if (passport) {
if (removeall) {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('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.token_type],
})
} else {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_guard_remove_with_passport') as FnCallType,
arguments:[passport, Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', guard),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
} else {
if (removeall) {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_guard_remove_all') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
} else {
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('withdraw_guard_remove') as FnCallType,
arguments:[Protocol.TXB_OBJECT(this.txb, this.object), this.txb.pure.vector('address', guard),
Protocol.TXB_OBJECT(this.txb, this.permission)],
typeArguments:[this.token_type],
})
}
}
}
change_permission(new_permission:PermissionObject) {
if (!Protocol.IsValidObjects([new_permission])) {
ERROR(Errors.IsValidObjects, 'change_permission.new_permission')
}
this.txb.moveCall({
target:Protocol.Instance().treasuryFn('permission_set') as FnCallType,
arguments: [Protocol.TXB_OBJECT(this.txb, this.object), Protocol.TXB_OBJECT(this.txb, this.permission), Protocol.TXB_OBJECT(this.txb, new_permission)],
typeArguments:[this.token_type]
})
this.permission = new_permission
}
static parseObjectType = (chain_type?:string) : string => {
return parseObjectType(chain_type, 'treasury::Treasury<')
}
static MAX_WITHDRAW_GUARD_COUNT = 16;
}