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
19 changes: 8 additions & 11 deletions modules/sdk-coin-apt/src/lib/iface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,9 @@ export interface RecipientsValidationResult {
* ```
*
* @remarks
* - The `abi` field is optional but provides type validation when present
* - The `abi` field is required to ensure type safety
* - Invalid ABI will cause transaction building to fail
* - Without ABI, the Aptos SDK performs basic validation
* - All Aptos transactions use the same payload structure regardless of complexity
* - ABI must match the exact function signature of the target entry function
*/
export interface CustomTransactionParams {
/**
Expand Down Expand Up @@ -106,18 +105,16 @@ export interface CustomTransactionParams {
functionArguments?: Array<EntryFunctionArgumentTypes | SimpleEntryFunctionArgumentTypes>;

/**
* Entry function ABI for type validation and safety (optional)
* Entry function ABI for type validation and safety (required)
*
* When provided:
* Provides:
* - Validates argument count matches expected parameters
* - Performs type checking during transaction building
* - Improves error messages for invalid calls
*
* When omitted:
* - Transaction building relies on Aptos SDK basic validation
* - Function signature errors detected at build/simulation time
*
* @remarks Providing incorrect ABI will cause transaction building to fail
* @remarks
* - Providing incorrect ABI will cause transaction building to fail
* - Must match the exact function signature of the target entry function
*/
abi?: EntryFunctionABI;
abi: EntryFunctionABI;
}
25 changes: 24 additions & 1 deletion modules/sdk-coin-apt/src/lib/transaction/customTransaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export class CustomTransaction extends Transaction {
private _functionName: string;
private _typeArguments: string[] = [];
private _functionArguments: Array<EntryFunctionArgumentTypes | SimpleEntryFunctionArgumentTypes> = [];
private _entryFunctionAbi?: EntryFunctionABI;
private _entryFunctionAbi: EntryFunctionABI;

constructor(coinConfig: Readonly<CoinConfig>) {
super(coinConfig);
Expand All @@ -34,11 +34,13 @@ export class CustomTransaction extends Transaction {
setCustomTransactionParams(params: CustomTransactionParams): void {
this.validateModuleName(params.moduleName);
this.validateFunctionName(params.functionName);
this.validateAbi(params.abi);

this._moduleName = params.moduleName;
this._functionName = params.functionName;
this._typeArguments = params.typeArguments || [];
this._functionArguments = params.functionArguments || [];
this._entryFunctionAbi = params.abi;
}

/**
Expand Down Expand Up @@ -122,6 +124,7 @@ export class CustomTransaction extends Transaction {
functionName: this._functionName || '',
typeArguments: this._typeArguments,
functionArguments: this._functionArguments,
abi: this._entryFunctionAbi,
};
}

Expand Down Expand Up @@ -207,4 +210,24 @@ export class CustomTransaction extends Transaction {

return fullName as `${string}::${string}::${string}`;
}

/**
* Validate ABI structure and provide helpful error messages
*
* @param {EntryFunctionABI} abi - The ABI to validate
* @throws {Error} If ABI format is invalid
*/
private validateAbi(abi: EntryFunctionABI): void {
if (!abi || typeof abi !== 'object') {
throw new Error('ABI must be a valid EntryFunctionABI object');
}

if (!Array.isArray(abi.typeParameters)) {
throw new Error('ABI must have a typeParameters array. Use [] if the function has no type parameters');
}

if (!Array.isArray(abi.parameters)) {
throw new Error('ABI must have a parameters array containing TypeTag objects for each function parameter');
}
}
}
Loading