PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-sui/src/lib/mystenlab/builder

Просмотр файла: Transactions.ts

import { BCS } from '@mysten/bcs';
import {
  is,
  any,
  array,
  Infer,
  integer,
  literal,
  object,
  optional,
  string,
  union,
  assert,
  Struct,
  define,
} from 'superstruct';
import { ObjectId } from '../types/common';
import { TRANSACTION_TYPE, WellKnownEncoding, create } from './utils';

const option = <T extends Struct<any, any>>(some: T) =>
  union([object({ None: literal(null) }), object({ Some: some })]);

export const TransactionBlockInput = object({
  kind: literal('Input'),
  index: integer(),
  value: optional(any()),
  type: optional(union([literal('pure'), literal('object')])),
});
export type TransactionBlockInput = Infer<typeof TransactionBlockInput>;

const TransactionArgumentTypes = [
  TransactionBlockInput,
  object({ kind: literal('GasCoin') }),
  object({ kind: literal('Result'), index: integer() }),
  object({
    kind: literal('NestedResult'),
    index: integer(),
    resultIndex: integer(),
  }),
] as const;

// Generic transaction argument
export const TransactionArgument = union([...TransactionArgumentTypes]);
export type TransactionArgument = Infer<typeof TransactionArgument>;

// Transaction argument referring to an object:
export const ObjectTransactionArgument = union([...TransactionArgumentTypes]);
(ObjectTransactionArgument as any)[TRANSACTION_TYPE] = {
  kind: 'object',
} as WellKnownEncoding;

export const PureTransactionArgument = (type: string) => {
  const struct = union([...TransactionArgumentTypes]);
  (struct as any)[TRANSACTION_TYPE] = {
    kind: 'pure',
    type,
  } as WellKnownEncoding;
  return struct;
};

export const MoveCallTransaction = object({
  kind: literal('MoveCall'),
  target: define<`${string}::${string}::${string}`>('target', string().validator),
  typeArguments: array(string()),
  arguments: array(TransactionArgument),
});
export type MoveCallTransaction = Infer<typeof MoveCallTransaction>;

export const TransferObjectsTransaction = object({
  kind: literal('TransferObjects'),
  objects: array(ObjectTransactionArgument),
  address: PureTransactionArgument(BCS.ADDRESS),
});
export type TransferObjectsTransaction = Infer<typeof TransferObjectsTransaction>;

export const SplitCoinsTransaction = object({
  kind: literal('SplitCoins'),
  coin: ObjectTransactionArgument,
  amounts: array(PureTransactionArgument('u64')),
});
export type SplitCoinsTransaction = Infer<typeof SplitCoinsTransaction>;

export const MergeCoinsTransaction = object({
  kind: literal('MergeCoins'),
  destination: ObjectTransactionArgument,
  sources: array(ObjectTransactionArgument),
});
export type MergeCoinsTransaction = Infer<typeof MergeCoinsTransaction>;

export const MakeMoveVecTransaction = object({
  kind: literal('MakeMoveVec'),
  type: optional(option(string())),
  objects: array(ObjectTransactionArgument),
});
export type MakeMoveVecTransaction = Infer<typeof MakeMoveVecTransaction>;

export const PublishTransaction = object({
  kind: literal('Publish'),
  modules: array(array(integer())),
  dependencies: array(ObjectId),
});
export type PublishTransaction = Infer<typeof PublishTransaction>;

const TransactionTypes = [
  MoveCallTransaction,
  TransferObjectsTransaction,
  SplitCoinsTransaction,
  MergeCoinsTransaction,
  PublishTransaction,
  MakeMoveVecTransaction,
] as const;

export const TransactionType = union([...TransactionTypes]);
export type TransactionType = Infer<typeof TransactionType>;

export function getTransactionType(data: unknown) {
  assert(data, TransactionType);
  return TransactionTypes.find((schema) => is(data, schema as Struct))!;
}

/**
 * Simple helpers used to construct transactions:
 */
export const Transactions = {
  MoveCall(
    input: Omit<MoveCallTransaction, 'kind' | 'arguments' | 'typeArguments'> & {
      arguments?: TransactionArgument[];
      typeArguments?: string[];
    }
  ): MoveCallTransaction {
    return create(
      {
        kind: 'MoveCall',
        target: input.target,
        arguments: input.arguments ?? [],
        typeArguments: input.typeArguments ?? [],
      },
      MoveCallTransaction
    );
  },
  TransferObjects(objects: TransactionArgument[], address: TransactionArgument): TransferObjectsTransaction {
    return create({ kind: 'TransferObjects', objects, address }, TransferObjectsTransaction);
  },
  SplitCoins(coin: TransactionArgument, amounts: TransactionArgument[]): SplitCoinsTransaction {
    return create({ kind: 'SplitCoins', coin, amounts }, SplitCoinsTransaction);
  },
  MergeCoins(destination: TransactionArgument, sources: TransactionArgument[]): MergeCoinsTransaction {
    return create({ kind: 'MergeCoins', destination, sources }, MergeCoinsTransaction);
  },
  Publish(modules: number[][], dependencies: ObjectId[]): PublishTransaction {
    return create({ kind: 'Publish', modules, dependencies }, PublishTransaction);
  },
  MakeMoveVec({
    type,
    objects,
  }: Omit<MakeMoveVecTransaction, 'kind' | 'type'> & {
    type?: string;
  }): MakeMoveVecTransaction {
    return create(
      {
        kind: 'MakeMoveVec',
        type: type ? { Some: type } : { None: null },
        objects,
      },
      MakeMoveVecTransaction
    );
  },
};

Выполнить команду


Для локальной разработки. Не используйте в интернете!