PRANA contract dev · deploy Solidity to the EVM compute chain
PRANA is an EVM chain — chainId 712217
(0xade19), symbol PRANA, ~13s blocks. Every Ethereum tool works
unchanged; you only point it at PRANA's RPC. Add the network, wire your toolchain, and deploy —
the addresses and ABIs you'll build against are on Deployed contracts.
1 · Add PRANA to MetaMask
One click (needs a MetaMask-compatible wallet in the
browser). It sends the EIP-3085 wallet_addEthereumChain request:
Or copy the params into any wallet:
{
"chainId": "0xade19",
"chainName": "PRANA",
"nativeCurrency": {
"name": "PRANA",
"symbol": "PRANA",
"decimals": 18
},
"rpcUrls": [
"https://rpc.prana.melek.salon"
],
"blockExplorerUrls": [
"https://pranascan.soapbox.community"
]
}
A wallet rejects the add unless the RPC actually reports
chainId 0xade19 over HTTPS — that's the EIP-3085 contract, and PRANA's RPC
does report it (verified).
2 · Point your toolchain at PRANA
Foundry
# foundry.toml [rpc_endpoints] prana = "https://rpc.prana.melek.salon" # deploy: forge create src/MyToken.sol:MyToken \ # --rpc-url prana --private-key $PK --broadcast # call: cast call <addr> "totalSupply()(uint256)" --rpc-url https://rpc.prana.melek.salon # chainId: cast chain-id --rpc-url https://rpc.prana.melek.salon # → 712217
Hardhat
// hardhat.config.js
module.exports = {
solidity: '0.8.24',
networks: {
prana: {
url: 'https://rpc.prana.melek.salon',
chainId: 712217,
accounts: [process.env.PK], // deployer private key (env var, never committed)
},
},
};
// deploy: npx hardhat run scripts/deploy.js --network prana
viem
import { createPublicClient, createWalletClient, http, defineChain } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
export const prana = defineChain({
id: 712217,
name: 'PRANA',
nativeCurrency: { name: 'PRANA', symbol: 'PRANA', decimals: 18 },
rpcUrls: { default: { http: ['https://rpc.prana.melek.salon'] } },
blockExplorers: { default: { name: 'PRANAScan', url: 'https://pranascan.soapbox.community' } },
});
const pub = createPublicClient({ chain: prana, transport: http() });
console.log(await pub.getBlockNumber());
ethers v6
import { JsonRpcProvider, Wallet, Contract } from 'ethers'; // ethers v6
const provider = new JsonRpcProvider('https://rpc.prana.melek.salon', 712217);
console.log((await provider.getNetwork()).chainId); // → 712217n
// read KULA's total supply with a 1-line minimal ABI
const kula = new Contract(
'0x32255D0138f5D645894FA89b5D5B5a68cF9Aa631',
['function totalSupply() view returns (uint256)'],
provider,
);
console.log(await kula.totalSupply());
3 · Deploy your first contract
A standard OpenZeppelin ERC-20 — a PRC-20 the moment it lands on PRANA (see token standards):
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor() ERC20("My Token", "MYT") {
_mint(msg.sender, 1_000_000 ether);
}
}
With Foundry
forge install OpenZeppelin/openzeppelin-contracts forge create src/MyToken.sol:MyToken \ --rpc-url https://rpc.prana.melek.salon \ --private-key $PK --broadcast # then verify it exists: cast code <deployed-address> --rpc-url https://rpc.prana.melek.salon
With Hardhat
// scripts/deploy.js
const f = await ethers.getContractFactory('MyToken');
const c = await f.deploy();
await c.waitForDeployment();
console.log('deployed at', await c.getAddress());
// npx hardhat run scripts/deploy.js --network prana
Confirm it on PRANAScan: pranascan.soapbox.community. Contract source verification on the explorer is coming — for now, publish your ABI alongside the address (that's exactly what Deployed contracts does for the core set).
4 · Gas — the faucet
Deploying costs a little PRANA for gas. The ecosystem gas faucet: faucet.alpha.soapbox.community. A dedicated developer faucet (higher limits, dev allowlist) is coming; until then the gas faucet above is the closest drip, and mining PRANA (it's a useful-work chain — see the pool) is the other way to fund a deployer.
Deployed contracts + ABIs → · MELEK app dev → · Token standards (PRC-20) →