CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-solc

JavaScript bindings for the Solidity compiler with Standard JSON I/O interface

Pending
Overview
Eval results
Files

utilities.mddocs/

Translation Utilities

Legacy output translation and assembly formatting utilities for compatibility with older compiler versions and tooling.

Capabilities

Legacy Output Translation

Convert raw compiler output from older versions to Standard JSON format.

/**
 * Translate legacy compiler output to Standard JSON format
 * @param output - Raw compiler output object from legacy versions
 * @param libraries - Optional library addresses for bytecode linking
 * @returns Translated output in Standard JSON format or null if translation fails
 */
function translateJsonCompilerOutput(output: any, libraries?: any): any | null;

Usage Examples:

import translate from "solc/translate";

// Translate legacy compiler output
const legacyOutput = {
  contracts: {
    'MyContract': {
      bytecode: '608060405234801561001057...',
      interface: '[{"type":"function","name":"test",...}]',
      gasEstimates: { creation: [21000, 200] },
      functionHashes: { "test()": "f8a8fd6d" }
    }
  },
  errors: ['Warning: Unused variable'],
  sourceList: ['Contract.sol']
};

const modernOutput = translate.translateJsonCompilerOutput(legacyOutput);
console.log(modernOutput.contracts['']['MyContract'].evm.bytecode.object);

Legacy Assembly Formatting

Format old JSON assembly output into human-readable text format.

/**
 * Format legacy assembly JSON output for display
 * @param assembly - Assembly JSON object or string
 * @param source - Original source code string for context
 * @returns Formatted assembly text
 */
function prettyPrintLegacyAssemblyJSON(assembly: any, source?: string): string;

Usage Examples:

import translate from "solc/translate";

// Format assembly output
const assemblyJSON = {
  '.code': [
    { name: 'PUSH1', value: '0x80' },
    { name: 'PUSH1', value: '0x40' },
    { name: 'MSTORE' }
  ],
  '.data': {}
};

const sourceCode = 'contract Test { uint public value = 42; }';
const formattedAssembly = translate.prettyPrintLegacyAssemblyJSON(assemblyJSON, sourceCode);
console.log(formattedAssembly);

Version String Conversion

Convert old-style version strings to semver-compatible format.

/**
 * Convert old-style version strings to semver-compatible format
 * @param version - Version string in any format
 * @returns Semver-compatible version string
 */
function versionToSemver(version: string): string;

Usage Examples:

import translate from "solc/translate";

// Convert various version formats
console.log(translate.versionToSemver("0.3.6-3fc68da5/Release-Emscripten/clang"));
// Output: "0.3.6+commit.3fc68da5"

console.log(translate.versionToSemver("0.1.3-0"));
// Output: "0.1.3"

console.log(translate.versionToSemver("0.4.5+commit.b318366e.Emscripten.clang"));
// Output: "0.4.5+commit.b318366e.Emscripten.clang" (already compatible)

Legacy Compiler Support

These utilities are primarily used for supporting older compiler versions and legacy tooling:

Output Format Evolution

Legacy compilers used different output formats:

Legacy Format:

{
  "contracts": {
    "ContractName": {
      "bytecode": "0x608060405234801561001057...",
      "interface": "[{\"type\":\"function\",\"name\":\"test\"}]",
      "gasEstimates": {
        "creation": [21000, 200],
        "external": { "test()": 500 }
      }
    }
  }
}

Modern Standard JSON:

{
  "contracts": {
    "filename.sol": {
      "ContractName": {
        "evm": {
          "bytecode": {
            "object": "0x608060405234801561001057...",
            "linkReferences": {}
          },
          "gasEstimates": {
            "creation": {
              "executionCost": "21000",
              "codeDepositCost": "200"
            }
          }
        },
        "abi": [{"type":"function","name":"test"}]
      }
    }
  }
}

Assembly Format Changes

Legacy assembly format used nested objects with .code and .data sections:

const legacyAssembly = {
  '.code': [
    { name: 'PUSH1', value: '0x80', begin: 0, end: 5 },
    { name: 'PUSH1', value: '0x40', begin: 5, end: 10 },
    { name: 'MSTORE', begin: 10, end: 15 }
  ],
  '.data': {
    '0': {
      '.code': [...],
      '.data': {}
    }
  }
};

The prettyPrintLegacyAssemblyJSON function converts this to readable text:

.code
  PUSH1 0x80       contract Test { uint p...
  PUSH1 0x40       
  MSTORE           
.data
  0:
    .code
      ...

Integration with Modern Workflows

import solc from "solc";
import translate from "solc/translate";

// Working with legacy compiler output
function processLegacyContract(legacyOutput: any) {
  // Translate to modern format
  const modernOutput = translate.translateJsonCompilerOutput(legacyOutput);
  
  if (!modernOutput) {
    throw new Error('Failed to translate legacy output');
  }
  
  // Now compatible with modern tooling
  return modernOutput;
}

// Version compatibility checking
function checkVersionCompatibility(versionString: string) {
  const semverVersion = translate.versionToSemver(versionString);
  const [major, minor] = semverVersion.split('.').map(Number);
  
  if (major === 0 && minor < 4) {
    console.log('Very old compiler version - may need special handling');
  }
  
  return semverVersion;
}

Install with Tessl CLI

npx tessl i tessl/npm-solc

docs

abi-utilities.md

cli.md

compilation.md

index.md

linking.md

smt-integration.md

utilities.md

version-management.md

tile.json