msgRejectCode

Get the rejection code from a failed inter-canister call.

import { call, msgRejectCode, IDL, update, Principal } from 'azle';

export default class {
    @update(
        [IDL.Principal],
        IDL.Record({
            success: IDL.Bool,
            rejectCode: IDL.Opt(IDL.Nat8),
            message: IDL.Text
        })
    )
    async tryCall(canisterId: Principal): Promise<{
        success: boolean;
        rejectCode: [number] | [];
        message: string;
    }> {
        try {
            await call(canisterId, 'some_method', {});
            return {
                success: true,
                rejectCode: [],
                message: 'Call succeeded'
            };
        } catch (error) {
            const rejectCode = msgRejectCode();
            return {
                success: false,
                rejectCode: [rejectCode],
                message: this.getRejectMessage(rejectCode)
            };
        }
    }

    private getRejectMessage(rejectCode: number): string {
        switch (rejectCode) {
            case 1: // SysFatal
                return 'Error: System fatal error';
            case 2: // SysTransient
                return 'Error: System transient error';
            case 3: // DestinationInvalid
                return 'Error: Invalid destination canister';
            case 4: // CanisterReject
                return 'Error: Canister rejected the call';
            case 5: // CanisterError
                return 'Error: Canister error occurred';
            default:
                return `Error: Unknown rejection code ${rejectCode}`;
        }
    }
}

The msgRejectCode function returns the rejection code from the most recent failed inter-canister call. Use this in catch blocks to understand why a call failed.

Returns: Rejection code as number

Rejection Codes:

  • 1: SysFatal - Fatal system error
  • 2: SysTransient - Transient system error (may retry)
  • 3: DestinationInvalid - Invalid destination canister
  • 4: CanisterReject - Target canister rejected the call
  • 5: CanisterError - Error occurred in target canister

Use Cases:

  • Error handling and recovery logic
  • Retry mechanisms based on error type
  • Logging and debugging failed calls
  • User-friendly error messages