import {
SomniaAgentKit,
SOMNIA_NETWORKS,
ContractDeployer,
ContractVerifier,
parseEther
} from 'somnia-agent-kit';
import { ethers } from 'ethers';
// Contract ABI and Bytecode
const MyContract_ABI = [
'constructor(string name, uint256 value)',
'function name() view returns (string)',
'function value() view returns (uint256)',
];
const MyContract_BYTECODE = '0x...'; // Your compiled bytecode
const MyContract_SOURCE = `
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract MyContract {
string public name;
uint256 public value;
constructor(string memory _name, uint256 _value) {
name = _name;
value = _value;
}
}
`;
async function deployAndVerify() {
// Initialize SDK
const kit = new SomniaAgentKit({
network: SOMNIA_NETWORKS.testnet,
privateKey: process.env.PRIVATE_KEY,
});
await kit.initialize();
console.log('π Starting deployment...\n');
// Step 1: Estimate gas
const deployer = kit.getContractDeployer();
const gasEstimate = await deployer.estimateDeploymentCost({
abi: MyContract_ABI,
bytecode: MyContract_BYTECODE,
constructorArgs: ['My Contract', 100],
});
console.log('π Gas estimate:', gasEstimate.toString());
// Step 2: Deploy contract
console.log('\nπ¦ Deploying contract...');
const result = await deployer.deployContract({
abi: MyContract_ABI,
bytecode: MyContract_BYTECODE,
constructorArgs: ['My Contract', 100],
});
console.log('β
Contract deployed!');
console.log(' Address:', result.address);
console.log(' TX Hash:', result.txHash);
console.log(' Block:', result.blockNumber);
console.log(' Gas Used:', result.gasUsed.toString());
// Step 3: Wait for confirmations
console.log('\nβ³ Waiting for confirmations...');
await deployer.waitForDeployment(result.txHash, 3);
console.log('β
3 confirmations received!');
// Step 4: Verify contract exists
const exists = await deployer.verifyContractExists(result.address);
if (!exists) {
throw new Error('Contract not found on-chain!');
}
// Step 5: Verify on explorer
console.log('\nπ Verifying contract on explorer...');
const verifier = kit.getContractVerifier({
apiKey: process.env.EXPLORER_API_KEY,
apiUrl: 'https://explorer.somnia.network/api',
});
// Encode constructor arguments
const constructorArgs = ethers.AbiCoder.defaultAbiCoder()
.encode(['string', 'uint256'], ['My Contract', 100])
.slice(2); // Remove '0x' prefix
const verifyResult = await verifier.verifyContract({
address: result.address,
sourceCode: MyContract_SOURCE,
contractName: 'MyContract',
compilerVersion: 'v0.8.20+commit.a1b79de6',
constructorArgs: constructorArgs,
optimization: true,
runs: 200,
});
if (!verifyResult.success) {
throw new Error(`Verification failed: ${verifyResult.error}`);
}
console.log('β
Verification submitted!');
console.log(' GUID:', verifyResult.guid);
// Step 6: Wait for verification
console.log('\nβ³ Waiting for verification...');
const finalStatus = await verifier.waitForVerification(
verifyResult.guid,
120000 // 2 minutes timeout
);
if (finalStatus.status === 'success') {
console.log('\nπ Contract verified successfully!');
console.log(' View on explorer:');
console.log(` https://explorer.somnia.network/address/${result.address}`);
} else {
console.error('\nβ Verification failed:', finalStatus.message);
}
return result;
}
deployAndVerify().catch(console.error);