const axios = require('axios');
const fs = require('fs');
require('dotenv').config();
async function verifyContract(contractAddress, sourceCode, contractName, constructorArgs = "") {
const apiUrl = "https://testnet.plasmascan.to/api";
const data = {
module: 'contract',
action: 'verifysourcecode',
contractaddress: contractAddress,
sourceCode: sourceCode,
codeformat: 'solidity-single-file',
contractname: contractName,
compilerversion: 'v0.8.28+commit.7893614a',
optimizationUsed: '1',
runs: '200',
constructorArguements: constructorArgs, // Note: API uses this spelling.
evmversion: 'default',
licenseType: '3' // MIT License
};
try {
console.log('Submitting contract for verification...');
const response = await axios.post(apiUrl, new URLSearchParams(data));
if (response.data.status === '1') {
const guid = response.data.result;
console.log('Verification submitted successfully!');
console.log('GUID:', guid);
// Check verification status.
await checkVerificationStatus(guid);
} else {
console.error('Verification submission failed:', response.data.result);
}
} catch (error) {
console.error('Error submitting verification:', error.message);
}
}
async function checkVerificationStatus(guid) {
const apiUrl = "https://testnet.plasmascan.to/api";
const maxAttempts = 30;
let attempts = 0;
while (attempts < maxAttempts) {
try {
const response = await axios.get(apiUrl, {
params: {
module: 'contract',
action: 'checkverifystatus',
guid: guid
}
});
const status = response.data.status;
const result = response.data.result;
if (status === '1') {
console.log('✅ Contract verified successfully!');
console.log('Result:', result);
break;
} else if (result.includes('Fail')) {
console.error('❌ Verification failed:', result);
break;
} else {
console.log('⏳ Verification pending...');
attempts++;
if (attempts < maxAttempts) {
await new Promise(resolve => setTimeout(resolve, 10000)); // Wait 10 seconds.
}
}
} catch (error) {
console.error('Error checking status:', error.message);
break;
}
}
if (attempts >= maxAttempts) {
console.log('⚠️ Verification status check timed out. Please check manually.');
}
}
// Verify SimpleStorage contract.
async function verifySimpleStorage() {
const contractAddress = "0x742d35Cc6610C7532C8582d4C371Acb1D5f44D7F";
const sourceCode = fs.readFileSync('SimpleStorage.sol', 'utf8');
const constructorArgs = "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20506c61736d612100000000000000000000000000000000000000";
await verifyContract(contractAddress, sourceCode, "SimpleStorage", constructorArgs);
}
// Verify TokenVault contract.
async function verifyTokenVault() {
const contractAddress = "0x9876543210987654321098765432109876543210";
const sourceCode = fs.readFileSync('TokenVault.sol', 'utf8');
// Complex constructor arguments (ABI encoded).
const constructorArgs = "0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000123456789012345678901234567890123456789000000000000000000000000098765432109876543210987654321098765432100";
await verifyContract(contractAddress, sourceCode, "TokenVault", constructorArgs);
}
// Run verification (uncomment the one you need).
verifySimpleStorage();
// verifyTokenVault();