import { AssetDecimals, Base58Bytes, Base64Script, DataTransactionEntry, ExchangeTransactionOrder, InvokeScriptCall, InvokeScriptPayment, Long, MassTransferItem, SignedIExchangeTransactionOrder, TRANSACTION_TYPE, TransactionType, TStateChanges, WithApiMixin, WithApplicationStatus, WithId, WithVersion, } from '../src'; export type BaseTransaction< LONG = Long, TYPE extends TransactionType = TransactionType > = { type: TYPE; chainId: number; senderPublicKey: string; timestamp: number; fee: LONG; }; export type Transaction = | GenesisTransaction | PaymentTransaction | IssueTransaction | TransferTransaction | ReissueTransaction | BurnTransaction | LeaseTransaction | CancelLeaseTransaction | AliasTransaction | MassTransferTransaction | DataTransaction | SetScriptTransaction | SponsorshipTransaction | ExchangeTransaction | SetAssetScriptTransaction | InvokeScriptTransaction | UpdateAssetInfoTransaction; export type TransactionMap = { [TRANSACTION_TYPE.GENESIS]: GenesisTransaction; [TRANSACTION_TYPE.PAYMENT]: PaymentTransaction; [TRANSACTION_TYPE.ISSUE]: IssueTransaction; [TRANSACTION_TYPE.TRANSFER]: TransferTransaction; [TRANSACTION_TYPE.REISSUE]: ReissueTransaction; [TRANSACTION_TYPE.BURN]: BurnTransaction; [TRANSACTION_TYPE.LEASE]: LeaseTransaction; [TRANSACTION_TYPE.CANCEL_LEASE]: CancelLeaseTransaction; [TRANSACTION_TYPE.ALIAS]: AliasTransaction; [TRANSACTION_TYPE.MASS_TRANSFER]: MassTransferTransaction; [TRANSACTION_TYPE.DATA]: DataTransaction; [TRANSACTION_TYPE.SET_SCRIPT]: SetScriptTransaction; [TRANSACTION_TYPE.SPONSORSHIP]: SponsorshipTransaction; [TRANSACTION_TYPE.EXCHANGE]: ExchangeTransaction; [TRANSACTION_TYPE.SET_ASSET_SCRIPT]: SetAssetScriptTransaction; [TRANSACTION_TYPE.INVOKE_SCRIPT]: InvokeScriptTransaction; [TRANSACTION_TYPE.UPDATE_ASSET_INFO]: UpdateAssetInfoTransaction; }; export type TransactionVersionsMap = { [TRANSACTION_TYPE.GENESIS]: GenesisTransactionMap; [TRANSACTION_TYPE.PAYMENT]: PaymentTransactionMap; [TRANSACTION_TYPE.ISSUE]: IssueTransactionMap; [TRANSACTION_TYPE.TRANSFER]: TransferTransactionMap; [TRANSACTION_TYPE.REISSUE]: ReissueTransactionMap; [TRANSACTION_TYPE.BURN]: BurnTransactionMap; [TRANSACTION_TYPE.LEASE]: LeaseTransactionMap; [TRANSACTION_TYPE.CANCEL_LEASE]: CancelLeaseTransactionMap; [TRANSACTION_TYPE.ALIAS]: AliasTransactionMap; [TRANSACTION_TYPE.MASS_TRANSFER]: MassTransferTransactionMap; [TRANSACTION_TYPE.DATA]: DataTransactionMap; [TRANSACTION_TYPE.SET_SCRIPT]: SetScriptTransactionMap; [TRANSACTION_TYPE.SPONSORSHIP]: SponsorshipTransactionMap; [TRANSACTION_TYPE.EXCHANGE]: ExchangeTransactionMap; [TRANSACTION_TYPE.SET_ASSET_SCRIPT]: SetAssetScriptTransactionMap; [TRANSACTION_TYPE.INVOKE_SCRIPT]: InvokeScriptTransactionMap; [TRANSACTION_TYPE.UPDATE_ASSET_INFO]: UpdateAssetInfoTransactionMap; }; type Omit, B extends keyof A> = { [Key in Exclude]: A[Key]; }; export type GenesisTransactionFields = { recipient: string; amount: LONG; }; export type PaymentTransactionFields = { sender: string; recipient: string; amount: LONG; }; export type IssueTransactionFields = { name: string; description: string; decimals: AssetDecimals; quantity: LONG; reissuable: boolean; script: Base64Script | null; }; export type TransferTransactionFields = { recipient: string; amount: LONG; feeAssetId: string | null; assetId: string | null; attachment: Base58Bytes | null; }; export type ReissueTransactionFields = { assetId: string; quantity: LONG; reissuable: boolean; }; export type BurnTransactionFields = { assetId: string; amount: LONG; }; export type LeaseTransactionFields = { amount: LONG; recipient: string; }; export type CancelLeaseTransactionFields = { leaseId: string; }; export type AliasTransactionFields = { alias: string; }; export type MassTransferTransactionFields = { transfers: Array>; assetId: string | null; attachment: Base58Bytes | null; }; export type DataTransactionFields = { data: Array>; }; export type ExchangeTransactionFields = { order1: SignedIExchangeTransactionOrder>; order2: SignedIExchangeTransactionOrder>; price: LONG; amount: LONG; buyMatcherFee: LONG; sellMatcherFee: LONG; }; export type SetScriptTransactionFields = { script: Base64Script | null; }; export type SponsorshipTransactionFields = { assetId: string; minSponsoredAssetFee: LONG | null; }; export type SetAssetScriptTransactionFields = { assetId: string; script: Base64Script; }; export type InvokeScriptTransactionFields = { dApp: string; call: InvokeScriptCall | null; feeAssetId: string | null; payment: Array> | null; }; export type UpdateAssetInfoTransactionFields = { assetId: string; name: string; description: string; }; export type EthereumTransactionFields = { payload: | ({ type: 'invocation'; stateChanges: TStateChanges; } & InvokeScriptTransactionFields) | { type: 'transfer'; recipient: string; amount: LONG; asset: string | null; }; bytes: string; }; //-------------------------------------------------------------------------------------------------------------------- //GenesisTransaction export type GenesisTransactionV1 = WithVersion< GenesisTransactionFields & Omit, 'senderPublicKey'>, 1 >; export type GenesisTransactionMap = { 1: GenesisTransactionV1; }; //PaymentTransaction export type PaymentTransactionV1 = WithVersion< PaymentTransactionFields & BaseTransaction, 1 >; export type PaymentTransactionMap = { 1: PaymentTransactionV1; }; //IssueTransaction export type IssueTransactionV1 = WithVersion< IssueTransactionFields & BaseTransaction, 1 >; export type IssueTransactionV2 = WithVersion< IssueTransactionFields & BaseTransaction, 2 >; export type IssueTransactionV3 = WithVersion< IssueTransactionFields & BaseTransaction, 3 >; export type IssueTransactionMap = { 1: IssueTransactionV1; 2: IssueTransactionV2; 3: IssueTransactionV3; }; //TransferTransaction export type TransferTransactionV1 = WithVersion< TransferTransactionFields & BaseTransaction, 1 >; export type TransferTransactionV2 = WithVersion< TransferTransactionFields & BaseTransaction, 2 >; export type TransferTransactionV3 = WithVersion< TransferTransactionFields & BaseTransaction, 3 >; export type TransferTransactionMap = { 1: TransferTransactionV1; 2: TransferTransactionV2; 3: TransferTransactionV3; }; //ReissueTransaction export type ReissueTransactionV1 = WithVersion< ReissueTransactionFields & BaseTransaction, 1 >; export type ReissueTransactionV2 = WithVersion< ReissueTransactionFields & BaseTransaction, 2 >; export type ReissueTransactionV3 = WithVersion< ReissueTransactionFields & BaseTransaction, 3 >; export type ReissueTransactionMap = { 1: ReissueTransactionV1; 2: ReissueTransactionV2; 3: ReissueTransactionV3; }; //BurnTransaction export type BurnTransactionV1 = WithVersion< BurnTransactionFields & BaseTransaction, 1 >; export type BurnTransactionV2 = WithVersion< BurnTransactionFields & BaseTransaction, 2 >; export type BurnTransactionV3 = WithVersion< BurnTransactionFields & BaseTransaction, 3 >; export type BurnTransactionMap = { 1: BurnTransactionV1; 2: BurnTransactionV2; 3: BurnTransactionV3; }; //ExchangeTransaction // TODO maybe create map by version for check orders version? export type ExchangeTransactionV1 = WithVersion< ExchangeTransactionFields & BaseTransaction, 1 >; export type ExchangeTransactionV2 = WithVersion< ExchangeTransactionFields & BaseTransaction, 2 >; export type ExchangeTransactionV3 = WithVersion< ExchangeTransactionFields & BaseTransaction, 3 >; export type ExchangeTransactionMap = { 1: ExchangeTransactionV1; 2: ExchangeTransactionV2; 3: ExchangeTransactionV3; }; //LeaseTransaction export type LeaseTransactionV1 = WithVersion< LeaseTransactionFields & BaseTransaction, 1 >; export type LeaseTransactionV2 = WithVersion< LeaseTransactionFields & BaseTransaction, 2 >; export type LeaseTransactionV3 = WithVersion< LeaseTransactionFields & BaseTransaction, 3 >; export type LeaseTransactionMap = { 1: LeaseTransactionV1; 2: LeaseTransactionV2; 3: LeaseTransactionV3; }; //CancelLeaseTransaction export type CancelLeaseTransactionV1 = WithVersion< CancelLeaseTransactionFields & BaseTransaction, 1 >; export type CancelLeaseTransactionV2 = WithVersion< CancelLeaseTransactionFields & BaseTransaction, 2 >; export type CancelLeaseTransactionV3 = WithVersion< CancelLeaseTransactionFields & BaseTransaction, 3 >; export type CancelLeaseTransactionMap = { 1: LeaseTransactionV1; 2: LeaseTransactionV2; 3: LeaseTransactionV3; }; //AliasTransaction export type AliasTransactionV1 = WithVersion< AliasTransactionFields & BaseTransaction, 1 >; export type AliasTransactionV2 = WithVersion< AliasTransactionFields & BaseTransaction, 2 >; export type AliasTransactionV3 = WithVersion< AliasTransactionFields & BaseTransaction, 3 >; export type AliasTransactionMap = { 1: AliasTransactionV1; 2: AliasTransactionV2; 3: AliasTransactionV3; }; //MassTransferTransaction export type MassTransferTransactionV1 = WithVersion< MassTransferTransactionFields & BaseTransaction, 1 >; export type MassTransferTransactionV2 = WithVersion< MassTransferTransactionFields & BaseTransaction, 2 >; export type MassTransferTransactionMap = { 1: MassTransferTransactionV1; 2: MassTransferTransactionV2; }; //DataTransaction export type DataTransactionV1 = WithVersion< DataTransactionFields & BaseTransaction, 1 >; export type DataTransactionV2 = WithVersion< DataTransactionFields & BaseTransaction, 2 >; export type DataTransactionMap = { 1: DataTransactionV1; 2: DataTransactionV2; }; //SetScriptTransaction export type SetScriptTransactionV1 = WithVersion< SetScriptTransactionFields & BaseTransaction, 1 >; export type SetScriptTransactionV2 = WithVersion< SetScriptTransactionFields & BaseTransaction, 2 >; export type SetScriptTransactionMap = { 1: SetScriptTransactionV1; 2: SetScriptTransactionV2; }; //ISponsorshipTransaction export type SponsorshipTransactionV1 = WithVersion< SponsorshipTransactionFields & BaseTransaction, 1 >; export type SponsorshipTransactionV2 = WithVersion< SponsorshipTransactionFields & BaseTransaction, 2 >; export type SponsorshipTransactionMap = { 1: SponsorshipTransactionV1; 2: SponsorshipTransactionV2; }; //SetAssetScriptTransaction export type SetAssetScriptTransactionV1 = WithVersion< SetAssetScriptTransactionFields & BaseTransaction, 1 >; export type SetAssetScriptTransactionV2 = WithVersion< SetAssetScriptTransactionFields & BaseTransaction, 2 >; export type SetAssetScriptTransactionMap = { 1: SetAssetScriptTransactionV1; 2: SetAssetScriptTransactionV2; }; //IInvokeScriptTransaction export type InvokeScriptTransactionV1 = WithVersion< InvokeScriptTransactionFields & BaseTransaction, 1 >; export type InvokeScriptTransactionV2 = WithVersion< InvokeScriptTransactionFields & BaseTransaction, 2 >; export type InvokeScriptTransactionMap = { 1: InvokeScriptTransactionV1; 2: InvokeScriptTransactionV2; }; //UpdateAssetInfoTransaction export type UpdateAssetInfoTransactionV1 = WithVersion< UpdateAssetInfoTransactionFields & BaseTransaction, 1 >; export type UpdateAssetInfoTransactionMap = { 1: UpdateAssetInfoTransactionV1; }; //EthereumTransaction export type EthereumTransactionV1 = WithVersion< EthereumTransactionFields & BaseTransaction, 1 >; export type EthereumTransactionMap = { 1: EthereumTransactionV1; }; //------------------------------------------------------------------------------------------ //Transaction types export type GenesisTransaction = GenesisTransactionV1; export type GenesisTransactionFromNode = SignedTransaction< GenesisTransaction > & WithId & Omit; export type PaymentTransaction = PaymentTransactionV1; export type PaymentTransactionFromNode = SignedTransaction< PaymentTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; }; export type IssueTransaction = | IssueTransactionV1 | IssueTransactionV2 | IssueTransactionV3; export type IssueTransactionFromNode = SignedTransaction< IssueTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; assetId: string; }; export type TransferTransaction = | TransferTransactionV1 | TransferTransactionV2 | TransferTransactionV3; export type TransferTransactionFromNode = SignedTransaction< TransferTransaction > & WithId & WithApplicationStatus & WithApiMixin; export type LeaseTransaction = | LeaseTransactionV1 | LeaseTransactionV2 | LeaseTransactionV3; export type LeaseTransactionFromNode = SignedTransaction< LeaseTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; status: 'canceled' | 'active'; }; export type BurnTransaction = | BurnTransactionV1 | BurnTransactionV2 | BurnTransactionV3; export type BurnTransactionFromNode = SignedTransaction< BurnTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; }; export type ReissueTransaction = | ReissueTransactionV1 | ReissueTransactionV2 | ReissueTransactionV3; export type ReissueTransactionFromNode = SignedTransaction< ReissueTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; }; export type CancelLeaseTransaction = | CancelLeaseTransactionV1 | CancelLeaseTransactionV2 | CancelLeaseTransactionV3; export type CancelLeaseTransactionFromNode = SignedTransaction< CancelLeaseTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; } & { lease: { id: string; originTransactionId: string; sender: string; recipient: string; amount: Long; height: number; status: 'canceled' | 'active'; cancelHeight: number; cancelTransactionId: string; }; }; export type AliasTransaction = | AliasTransactionV1 | AliasTransactionV2 | AliasTransactionV3; export type AliasTransactionFromNode = SignedTransaction< AliasTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; }; export type MassTransferTransaction = | MassTransferTransactionV1 | MassTransferTransactionV2; export type MassTransferTransactionFromNode = SignedTransaction< MassTransferTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; totalAmount: LONG; transferCount: number; }; export type DataTransaction = | DataTransactionV1 | DataTransactionV2; export type DataTransactionFromNode = SignedTransaction< DataTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; }; export type SetScriptTransaction = | SetScriptTransactionV1 | SetScriptTransactionV2; export type SetScriptTransactionFromNode = SignedTransaction< SetScriptTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; }; export type SponsorshipTransaction = | SponsorshipTransactionV1 | SponsorshipTransactionV2; export type SponsorshipTransactionFromNode = SignedTransaction< SponsorshipTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; }; export type ExchangeTransaction = | ExchangeTransactionV1 | ExchangeTransactionV2 | ExchangeTransactionV3; export type ExchangeTransactionFromNode = SignedTransaction< ExchangeTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; }; export type SetAssetScriptTransaction = | SetAssetScriptTransactionV1 | SetAssetScriptTransactionV2; export type SetAssetScriptTransactionFromNode = SignedTransaction< SetAssetScriptTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; }; export type InvokeScriptTransaction = | InvokeScriptTransactionV1 | InvokeScriptTransactionV2; export type InvokeScriptTransactionFromNode = SignedTransaction< InvokeScriptTransaction > & WithId & WithApplicationStatus & WithApiMixin & { stateChanges: TStateChanges; }; export type UpdateAssetInfoTransaction< LONG = Long > = UpdateAssetInfoTransactionV1; export type UpdateAssetInfoTransactionFromNode = SignedTransaction< UpdateAssetInfoTransaction > & WithId & WithApplicationStatus & WithApiMixin & { feeAssetId: null; }; export type EthereumTransaction = EthereumTransactionV1 & WithApiMixin & WithApplicationStatus & { feeAssetId: null; }; // type TWithSignatureMap = { [TRANSACTION_TYPE.GENESIS]: 1; [TRANSACTION_TYPE.PAYMENT]: 1; [TRANSACTION_TYPE.ISSUE]: 1; [TRANSACTION_TYPE.TRANSFER]: 1; [TRANSACTION_TYPE.REISSUE]: 1; [TRANSACTION_TYPE.BURN]: 1; [TRANSACTION_TYPE.EXCHANGE]: 1; [TRANSACTION_TYPE.LEASE]: 1; [TRANSACTION_TYPE.CANCEL_LEASE]: 1; [TRANSACTION_TYPE.ALIAS]: 1; }; type WithSignature = { signature: string; }; type WithProofs = { proofs: Array; }; export type SignedTransaction> = TX & (TX['type'] extends keyof TWithSignatureMap ? TX['version'] extends TWithSignatureMap[TX['type']] ? WithSignature : WithProofs : WithProofs); export type TransactionFromNode = | GenesisTransactionFromNode | PaymentTransactionFromNode | IssueTransactionFromNode | TransferTransactionFromNode | ReissueTransactionFromNode | BurnTransactionFromNode | ExchangeTransactionFromNode | LeaseTransactionFromNode | CancelLeaseTransactionFromNode | AliasTransactionFromNode | MassTransferTransactionFromNode | DataTransactionFromNode | SetScriptTransactionFromNode | SponsorshipTransactionFromNode | SetAssetScriptTransactionFromNode | InvokeScriptTransactionFromNode | UpdateAssetInfoTransactionFromNode | EthereumTransaction;