Recharge Community Pool

If the user does not have funds in the Community Pool, IMA will freeze the user from exits until the user’s pool has sufficient balance to fund the exit process.

The CommunityPool contract is on Rinkeby. Check out the current release page for ABIs.

  • IMA-JS

  • Web3 JS

// import & init ima-js here

export async function communityPoolUsage() {
    let address = "[YOUR_ADDRESS]";
    let privateKey = "[YOUR_PRIVATE_KEY]";
    let schainName = "[YOUR_SKALE_CHAIN_NAME]";

    let value = "[recharge value in wei]";

    let opts = {
        address: address,
        privateKey: privateKey // remove privateKey from txOpts to use Metamask signing

    let balance = await mainnet.communityPool.balance(address, schainName);

    await mainnet.communityPool.recharge(
            value: value,
            address: address,
            privateKey: privateKey

    await mainnet.communityPool.withdraw(
const Web3 = require("web3");
const Tx = require("ethereumjs-tx").Transaction;

const communityPoolAddress = rinkebyABIs.community_pool_address;
const communityPoolABI = rinkebyABIs.community_pool_abi;

const web3 = new Web3(rinkeby);

let CommunityPool = new web3.eth.Contract(

let registerMainnetCommunityPool = CommunityPool.methods

web3.eth.getTransactionCount(accountForMainnet).then((nonce) => {
  //create raw transaction
  const rawRechargeUserWallet = {
    chainId: chainId,
    from: accountForMainnet,
    nonce: "0x" + nonce.toString(16),
    data: registerMainnetCommunityPool,
    to: communityPoolAddress,
    gas: 6500000,
    gasPrice: 1000000000,
    value: web3.utils.toHex(web3.utils.toWei("0.5", "ether")) // Recharge pool with 0.5 ETH

const txRechargeUserWallet = new Tx(rawRechargeUserWallet, {
      chain: "rinkeby",
      hardfork: "petersburg"

//serialize transaction
const serializedRechargeUserWallet = txRechargeUserWallet.serialize();

//send signed transaction
    "0x" + serializedRechargeUserWallet.toString("hex")
  .on("receipt", (receipt) => {
    //record receipt to console

Exit Reimbursement Flow Process to Ethereum

The exit flow and reimbursement process through IMA to Ethereum is conducted as follows:



Using gasPayer() implementing contracts
  1. User must first fund CommunityPool.

  2. User executes exitToMain().

  3. TokenManager then checks Community Locker whether exit conditions are met.

  4. TokenManager then burns the token(s) and posts an outgoing message via MessageProxy for Schain.

  5. MessageProxy for Schain posts a new event which is found by 1 out of 16 SKALE Chain nodes running IMA agent.

  6. The selected node’s agent prepares the transaction and estimates the gas required

  7. Agent sends the transaction via transaction-manager through MessageProxy for Mainnet, and the node wallet funds the transaction.

  8. MessageProxy for Mainnet then requests CommmunityPool to refund the node.

  9. CommunityPool sends funds to the node.

  10. If CommunityPool has insufficient user’s funds, then CommunityPool posts a LockUser request to CommunityLocker, and refund is requested by the SKALE Chain self-recharging wallet. In this case, the self-recharging wallet sends funds to the node wallet and the user is Locked via the CommunityLocker.