JavaScript bindings for the Solidity compiler with Standard JSON I/O interface
—
Translate and update ABI definitions across different Solidity compiler versions to ensure compatibility with modern tooling and standards.
Update ABI definitions from older compiler versions to include modern fields and comply with current standards.
/**
* Update ABI to latest standard format with modern fields
* @param compilerVersion - Semantic version string of the compiler that generated the ABI
* @param abi - Original ABI array from compiler output
* @returns Updated ABI array with modern fields added
*/
function update(compilerVersion: string, abi: any[]): any[];Usage Examples:
import abi from "solc/abi";
// Update ABI from old compiler version
const oldABI = [
{
constant: false,
inputs: [],
name: 'hello',
outputs: [{ name: '', type: 'string' }],
payable: false,
type: 'function'
}
];
const updatedABI = abi.update('0.3.6', oldABI);
console.log(updatedABI);
/* Output includes modern fields:
[
{
constant: false,
inputs: [],
name: 'hello',
outputs: [{ name: '', type: 'string' }],
payable: true,
stateMutability: 'payable',
type: 'function'
},
{
type: 'fallback',
payable: true,
stateMutability: 'payable'
}
]
*/The ABI updater applies different transformations based on the compiler version:
Pre-0.4.0 Changes:
payable: true to all non-constant functionsPre-0.4.5 Changes:
Pre-0.4.16 Changes:
stateMutability field based on payable and constant flags:
payable: true → stateMutability: 'payable'constant: true → stateMutability: 'view'stateMutability: 'nonpayable'Pre-0.1.2 Changes:
import abi from "solc/abi";
// Different behavior based on version
const modernVersion = abi.update('0.8.0', originalABI); // Minimal changes
const oldVersion = abi.update('0.3.0', originalABI); // Many compatibility additionsUnderstanding how ABI fields have evolved across compiler versions:
interface ABIFunction {
type: 'function' | 'constructor' | 'fallback' | 'receive' | 'event';
name?: string;
inputs: ABIParameter[];
outputs?: ABIParameter[];
// Legacy field (pre-0.4.16)
constant?: boolean;
// Legacy field (pre-0.4.16)
payable?: boolean;
// Modern field (0.4.16+)
stateMutability?: 'pure' | 'view' | 'nonpayable' | 'payable';
}
interface ABIParameter {
name: string;
type: string;
components?: ABIParameter[]; // For structs and tuples
indexed?: boolean; // For events
}Legacy Contract Integration:
import solc from "solc";
import abi from "solc/abi";
// When working with contracts compiled by old versions
const legacyOutput = JSON.parse(fs.readFileSync('legacy-contract-output.json'));
const contractABI = legacyOutput.contracts['Contract.sol']['MyContract'].interface;
// Parse and update the ABI
const parsedABI = JSON.parse(contractABI);
const modernABI = abi.update('0.3.6', parsedABI);
// Now compatible with modern web3 libraries
const contract = new web3.eth.Contract(modernABI, contractAddress);ABI Compatibility Checking:
import abi from "solc/abi";
function ensureModernABI(contractABI: any[], compilerVersion: string) {
// Check if ABI needs updating
const hasStateMutability = contractABI.some(item =>
item.type === 'function' && 'stateMutability' in item
);
if (!hasStateMutability) {
console.log('Updating legacy ABI to modern format');
return abi.update(compilerVersion, contractABI);
}
return contractABI;
}The most significant change handled by the ABI updater is the migration from constant/payable flags to stateMutability:
// Before (legacy format)
const legacyFunction = {
type: 'function',
name: 'getValue',
constant: true,
payable: false,
inputs: [],
outputs: [{ name: '', type: 'uint256' }]
};
// After ABI update
const modernFunction = {
type: 'function',
name: 'getValue',
constant: true, // Preserved for compatibility
payable: false, // Preserved for compatibility
stateMutability: 'view', // Added based on constant: true
inputs: [],
outputs: [{ name: '', type: 'uint256' }]
};For very old compiler versions, the updater adds missing default functions:
// Original ABI from pre-0.1.2 compiler
const originalABI = [
{
type: 'function',
name: 'myFunction',
inputs: [],
outputs: []
}
];
// Updated ABI includes default constructor and fallback
const updatedABI = abi.update('0.1.1', originalABI);
/* Result:
[
{
type: 'function',
name: 'myFunction',
inputs: [],
outputs: [],
payable: true,
stateMutability: 'payable'
},
{
type: 'constructor',
payable: true,
stateMutability: 'payable',
inputs: []
},
{
type: 'fallback',
payable: true,
stateMutability: 'payable'
}
]
*/Install with Tessl CLI
npx tessl i tessl/npm-solc