Skip to main content
Portal provides the function portal.api.evaluateTransaction, which gives you insights into what will happen upon executing a transaction. This function can perform transaction simulation, security validation, or both. Here’s how it works:
// Basic transaction evaluation
const handleEvaluateTransaction = async () => {
  try {
    const transaction = {
      to: '0x742d35Cc6634C0532925a3b844Bc454e4438f44e',
      value: '1000000000000000000', // 1 ETH
      data: undefined,
      maxFeePerGas: '30000000000',
      maxPriorityFeePerGas: '1500000000',
      gas: '21000',
      gasPrice: undefined
    };

    const evaluation = await portal.api.evaluateTransaction(
      'eip155:1',
      transaction,
      'ALL' // Can be 'SIMULATION', 'VALIDATION', or 'ALL'
    );

    // Check validation results
    if (evaluation.validation) {
      console.log('Security Status:', evaluation.validation.status);

      if (evaluation.validation.status !== 'VALIDATED') {
        console.log('Warning:', evaluation.validation.description || 'Unknown issue');

        // Print detected security features
        evaluation.validation.features?.forEach((feature) => {
          console.log('Security Feature:', feature.type);
          console.log('Description:', feature.description);
        });
      }
    }

    // Check simulation results
    if (evaluation.simulation) {
      console.log('Simulation Status:', evaluation.simulation.status);

      // Print asset changes
      Object.entries(evaluation.simulation.assetsDiffs).forEach(([token, diffs]) => {
        console.log('\nToken:', token);
        diffs.forEach((diff) => {
          console.log('Incoming transfers:', diff['in']);
          console.log('Outgoing transfers:', diff.out);
        });
      });
    }
  } catch (error) {
    console.error('Evaluation failed:', error);
  }
};

// Contract interaction evaluation
const handleValidateTransaction = async () => {
  try {
    const transaction = {
      to: '0x742d35Cc6634C0532925a3b844Bc454e4438f44e',
      value: '0',
      data: '0xa9059cbb000000000000000000000000742d35cc6634c0532925a3b844bc454e4438f44e0000000000000000000000000000000000000000000000000de0b6b3a7640000', // ERC20 transfer
      maxFeePerGas: undefined,
      maxPriorityFeePerGas: undefined,
      gas: '65000',
      gasPrice: '20000000000'
    };

    // Validate only
    const evaluation = await portal.api.evaluateTransaction(
      'eip155:1',
      transaction,
      'VALIDATION'
    );

    if (evaluation.validation) {
      // Handle potential security issues
      switch (evaluation.validation.status) {
        case 'VALIDATED':
          console.log('Transaction is safe');
          break;
        case 'WARNING':
          console.log('Warning:', evaluation.validation.description || 'Unknown warning');
          break;
        case 'BLOCKED':
          console.log('Blocked:', evaluation.validation.reason || 'Unknown reason');
          break;
        default:
          console.log('Unknown status:', evaluation.validation.status);
      }
    }
  } catch (error) {
    console.error('Validation failed:', error);
  }
};
The operationType parameter determines what type of evaluation is performed. It can be one of the following values:
  • 'SIMULATION': Perform transaction simulation only
  • 'VALIDATION': Perform security validation only
  • 'ALL': Perform both validation and simulation
This function returns a BlockaidValidateTrxRes containing:
  • simulation: Transaction simulation results including:
    • accountAddress: Address being analyzed
    • accountSummary: Summary of account state changes
    • addressDetails: Detailed information about involved addresses
    • assetsDiffs: Asset balance changes, containing:
      • asset: Asset information
      • in: Incoming transfers
      • out: Outgoing transfers
    • exposures: Risk exposure analysis
    • status: Simulation status
    • totalUsdDiff: Total USD value change
    • totalUsdExposure: Total USD value at risk
  • validation: Security validation results (when operationType is 'VALIDATION' or 'ALL') including:
    • classification: Type of potential security issue
    • description: Detailed description of the validation results
    • features: Array of detected security features
    • status: Validation status
  • block: Block number used for evaluation
  • chain: Chain identifier
By incorporating transaction simulations, you can provide your users with a preview of the transaction outcomes and preemptively detect and handle errors, ensuring a smoother user experience.
And now you are evaluating transactions with Portal! 🙌 🚀 Next, we’ll explore how to back up the wallet for recovery if the user loses device access.