Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/transactions/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Given a `TransactionMessage`, this function returns a `Transaction` object. This

Whether a transaction message is ready to be compiled or not is enforced for you at the type level. In order to be signable, a transaction message must:

- have a version and a list of zero or more instructions (ie. conform to `BaseTransactionMessage`)
- have a version and a list of zero or more instructions (ie. conform to `TransactionMessage`)
- have a fee payer set (ie. conform to `TransactionMessageWithFeePayer`)
- have a lifetime specified (ie. conform to `TransactionMessageWithBlockhashLifetime | TransactionMessageWithDurableNonceLifetime`)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {
BaseTransactionMessage,
TransactionMessage,
TransactionMessageWithFeePayer,
TransactionMessageWithinSizeLimit,
} from '@solana/transaction-messages';
Expand All @@ -13,20 +13,19 @@ import {
{
// It narrows the type of the transaction message to include the `TransactionMessageWithinSizeLimit` flag.
{
const transactionMessage = null as unknown as BaseTransactionMessage & TransactionMessageWithFeePayer;
const transactionMessage = null as unknown as TransactionMessage & TransactionMessageWithFeePayer;
if (isTransactionMessageWithinSizeLimit(transactionMessage)) {
transactionMessage satisfies BaseTransactionMessage &
transactionMessage satisfies TransactionMessage &
TransactionMessageWithFeePayer &
TransactionMessageWithinSizeLimit;
}
}

// It keeps any extra properties from the transaction message.
{
const transactionMessage = null as unknown as BaseTransactionMessage &
TransactionMessageWithFeePayer & { some: 1 };
const transactionMessage = null as unknown as TransactionMessage & TransactionMessageWithFeePayer & { some: 1 };
if (isTransactionMessageWithinSizeLimit(transactionMessage)) {
transactionMessage satisfies BaseTransactionMessage & TransactionMessageWithFeePayer & { some: 1 };
transactionMessage satisfies TransactionMessage & TransactionMessageWithFeePayer & { some: 1 };
}
}
}
Expand All @@ -35,18 +34,17 @@ import {
{
// It narrows the type of the transaction message to include the `TransactionMessageWithinSizeLimit` flag.
{
const transactionMessage = null as unknown as BaseTransactionMessage & TransactionMessageWithFeePayer;
const transactionMessage = null as unknown as TransactionMessage & TransactionMessageWithFeePayer;
assertIsTransactionMessageWithinSizeLimit(transactionMessage);
transactionMessage satisfies BaseTransactionMessage &
transactionMessage satisfies TransactionMessage &
TransactionMessageWithFeePayer &
TransactionMessageWithinSizeLimit;
}

// It keeps any extra properties from the transaction message.
{
const transactionMessage = null as unknown as BaseTransactionMessage &
TransactionMessageWithFeePayer & { some: 1 };
const transactionMessage = null as unknown as TransactionMessage & TransactionMessageWithFeePayer & { some: 1 };
assertIsTransactionMessageWithinSizeLimit(transactionMessage);
transactionMessage satisfies BaseTransactionMessage & TransactionMessageWithFeePayer & { some: 1 };
transactionMessage satisfies TransactionMessage & TransactionMessageWithFeePayer & { some: 1 };
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { BaseTransactionMessage, TransactionMessageWithinSizeLimit } from '@solana/transaction-messages';
import type { TransactionMessage, TransactionMessageWithinSizeLimit } from '@solana/transaction-messages';

import { Transaction } from '../transaction';
import {
Expand Down Expand Up @@ -50,7 +50,7 @@ import {
{
type Result = SetTransactionWithinSizeLimitFromTransactionMessage<
Transaction,
BaseTransactionMessage & TransactionMessageWithinSizeLimit
TransactionMessage & TransactionMessageWithinSizeLimit
>;
null as unknown as Result satisfies Transaction & TransactionWithinSizeLimit;
}
Expand All @@ -59,7 +59,7 @@ import {
{
type Result = SetTransactionWithinSizeLimitFromTransactionMessage<
Transaction & { _from_transaction: 1 },
BaseTransactionMessage & TransactionMessageWithinSizeLimit & { _from_transaction_message: 1 }
TransactionMessage & TransactionMessageWithinSizeLimit & { _from_transaction_message: 1 }
>;
null as unknown as Result satisfies { _from_transaction: 1 };
// @ts-expect-error Does not keep extra properties from transaction messages.
Expand All @@ -70,7 +70,7 @@ import {
{
type Result = SetTransactionWithinSizeLimitFromTransactionMessage<
Transaction & { some: 1 },
BaseTransactionMessage
TransactionMessage
>;
null as unknown as Result satisfies Transaction & { some: 1 };
}
Expand Down
8 changes: 4 additions & 4 deletions packages/transactions/src/transaction-message-size.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, SolanaError } from '@solana/errors';
import type {
BaseTransactionMessage,
TransactionMessage,
TransactionMessageWithFeePayer,
TransactionMessageWithinSizeLimit,
} from '@solana/transaction-messages';
Expand All @@ -17,7 +17,7 @@ import { getTransactionSize, TRANSACTION_SIZE_LIMIT } from './transaction-size';
* ```
*/
export function getTransactionMessageSize(
transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer,
transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,
): number {
return getTransactionSize(compileTransaction(transactionMessage));
}
Expand All @@ -36,7 +36,7 @@ export function getTransactionMessageSize(
* ```
*/
export function isTransactionMessageWithinSizeLimit<
TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,
TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer,
>(
transactionMessage: TTransactionMessage,
): transactionMessage is TransactionMessageWithinSizeLimit & TTransactionMessage {
Expand All @@ -59,7 +59,7 @@ export function isTransactionMessageWithinSizeLimit<
* ```
*/
export function assertIsTransactionMessageWithinSizeLimit<
TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,
TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer,
>(
transactionMessage: TTransactionMessage,
): asserts transactionMessage is TransactionMessageWithinSizeLimit & TTransactionMessage {
Expand Down
4 changes: 2 additions & 2 deletions packages/transactions/src/transaction-size.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, SolanaError } from '@solana/errors';
import type { NominalType } from '@solana/nominal-types';
import type { BaseTransactionMessage, TransactionMessageWithinSizeLimit } from '@solana/transaction-messages';
import type { TransactionMessage, TransactionMessageWithinSizeLimit } from '@solana/transaction-messages';

import { getTransactionEncoder } from './codecs';
import { Transaction } from './transaction';
Expand Down Expand Up @@ -49,7 +49,7 @@ export type TransactionWithinSizeLimit = NominalType<'transactionSize', 'withinL
*/
export type SetTransactionWithinSizeLimitFromTransactionMessage<
TTransaction extends Transaction,
TTransactionMessage extends BaseTransactionMessage,
TTransactionMessage extends TransactionMessage,
> = TTransactionMessage extends TransactionMessageWithinSizeLimit
? TransactionWithinSizeLimit & TTransaction
: TTransaction;
Expand Down
6 changes: 3 additions & 3 deletions packages/transactions/src/transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { Address } from '@solana/addresses';
import type { ReadonlyUint8Array } from '@solana/codecs-core';
import type { SignatureBytes } from '@solana/keys';
import type { Brand, EncodedString } from '@solana/nominal-types';
import type { BaseTransactionMessage } from '@solana/transaction-messages';
import type { TransactionMessage } from '@solana/transaction-messages';

import type { SetTransactionLifetimeFromTransactionMessage } from './lifetime';
import type { SetTransactionWithinSizeLimitFromTransactionMessage } from './transaction-size';
Expand All @@ -25,9 +25,9 @@ export type Transaction = Readonly<{

/**
* Helper type that creates a `Transaction` type as narrow as possible
* from the provided `BaseTransactionMessage` type.
* from the provided `TransactionMessage` type.
*/
export type TransactionFromTransactionMessage<TTransactionMessage extends BaseTransactionMessage> =
export type TransactionFromTransactionMessage<TTransactionMessage extends TransactionMessage> =
SetTransactionWithinSizeLimitFromTransactionMessage<
SetTransactionLifetimeFromTransactionMessage<Transaction, TTransactionMessage>,
TTransactionMessage
Expand Down