Documentation Index
Fetch the complete documentation index at: https://docs.portalhq.io/llms.txt
Use this file to discover all available pages before exploring further.
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:
import { EvaluateTransactionOperationType } from '@portal-hq/core'
// 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.evaluateTransaction(
transaction,
'eip155:1',
EvaluateTransactionOperationType.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.evaluateTransaction(
transaction,
'eip155:1',
EvaluateTransactionOperationType.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:
EvaluateTransactionOperationType.SIMULATION: Perform transaction simulation only
EvaluateTransactionOperationType.VALIDATION: Perform security validation only
EvaluateTransactionOperationType.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.