import { readFileSync, mkdirSync, writeFileSync } from 'node:fs'; import solc from 'solc'; import { build } from 'esbuild'; const sources = Object.fromEntries(['Veylock.sol', 'TestToken.sol'].map(name => [name, { content: readFileSync(`contracts/${name}`, 'utf8') }])); const resolvedSources = { ...sources }; const input = { language: 'Solidity', sources, settings: { optimizer: { enabled: true, runs: 200 }, evmVersion: 'shanghai', outputSelection: { '*': { '*': ['abi', 'evm.bytecode.object', 'evm.deployedBytecode.object'] } } } }; const output = JSON.parse(solc.compile(JSON.stringify(input), { import: name => { try { const content=readFileSync(`node_modules/${name}`, 'utf8');resolvedSources[name]={content};return { contents:content }; } catch { return { error: `Missing import: ${name}` }; } } })); const errors = (output.errors || []).filter(e => e.severity === 'error'); if (errors.length) throw new Error(errors.map(e => e.formattedMessage).join('\n')); const artifacts = {}; for (const contracts of Object.values(output.contracts)) for (const [name, c] of Object.entries(contracts)) { if (['Veylock', 'TestToken', 'TaxToken', 'SenderTaxToken'].includes(name)) artifacts[name] = { abi: c.abi, bytecode: `0x${c.evm.bytecode.object}`, runtimeBytecode: `0x${c.evm.deployedBytecode.object}` }; } mkdirSync('artifacts', { recursive: true }); mkdirSync('public/build', { recursive: true }); writeFileSync('artifacts/solidity-standard-input.json', JSON.stringify({...input,sources:resolvedSources},null,2)); writeFileSync('artifacts/compiler-version.txt',solc.version()+'\n'); writeFileSync('artifacts/contracts.json', JSON.stringify(artifacts, null, 2)); writeFileSync('public/build/contracts.json', JSON.stringify({ Veylock: artifacts.Veylock })); await build({ entryPoints: ['src/app.js', 'src/public-vesting.js'], bundle: true, minify: true, format: 'esm', target: 'es2022', outdir: 'public/build' }); console.log(`Built VEYLOCK with Solidity ${solc.version()}`); await import('./build-themes.mjs'); await import('./build-docs.mjs');