Paxeer Docs logo

Migrate Your EVM dApp to Paxeer

Step-by-step checklist for redeploying your EVM dApp on Paxeer from Ethereum, Arbitrum, Base, Polygon, or Avalanche.

Paxeer offers full EVM bytecode compatibility with fast finality and high throughput. This guide distills what product teams need to do when they already run on Polygon, Base, Ethereum, Arbitrum, Avalanche or another EVM chain and want to bring your dApp stack to Paxeer.

Why Migrate to Paxeer?

  • Fast block times - Sub-second blocks for rapid transaction inclusion
  • High throughput - Designed for demanding workloads without sacrificing EVM compatibility
  • Instant finality - No waiting for confirmations or safe/finalized states
  • Full EVM compatibility - Deploy your existing Solidity contracts unchanged

Chain Comparison Overview

Before diving into migration steps, understand how Paxeer compares to your source chain:

FeaturePaxeerEthereumArbitrumBasePolygon PoSAvalanche C-Chain
Chain ID125142161845313743114
FinalityInstant~15 min (finalized)~7 days (L1 settlement)~7 days (L1 settlement)~5 s (Heimdall v2)~1 s
Native TokenHPXETHETHETHPOL (MATIC)AVAX
EVM VersionPectraFusakaFusakaPectraPectraCancun

Chain-Specific Migration Guides

Select your source chain to see specific migration considerations:

Migrating from Ethereum Mainnet

Key Differences:

AspectEthereumPaxeerMigration Impact
Block time~12 secondsSub-secondReduce deadline buffers in DEX swaps
Finality~15 min for finalizedInstantRemove confirmation polling logic
Fee modelEIP-1559 with burnEIP-1559 different paramsUpdate fee estimation UIs
Pending stateYesNoRemove pending transaction logic

What to Update:

  1. Time-based logic: If your contracts use block timestamps for deadlines, reduce timeouts proportionally.

  2. Confirmation requirements: Remove any logic that waits for multiple confirmations or checks "safe" vs "finalized" states - Paxeer has instant finality.

  3. Gas estimation: Paxeer's execution environment can slightly vary gas estimates. Add a modest buffer (10-15%) to your gasLimit calculations.

  4. Fee UI: Simplify your frontend - you can use a single gasPrice input instead of maxFeePerGas / maxPriorityFeePerGas.

// Before (Ethereum EIP-1559)
const tx = await contract.method({
  maxFeePerGas: ethers.parseUnits('50', 'gwei'),
  maxPriorityFeePerGas: ethers.parseUnits('2', 'gwei')
});

// After (Paxeer - simplified)
const tx = await contract.method({
  gasPrice: ethers.parseUnits('50', 'gwei')
});
  1. PREVRANDAO/DIFFICULTY: If you use these for any randomness, integrate a VRF oracle instead - Paxeer's values are derived from block time, not true randomness.

Step 1: Evaluate Compatibility

Revisit the Divergence from Ethereum doc and confirm every assumption your contracts/frontends make still holds.

DimensionPaxeer EVMPractical Effect
FinalityInstantNo separate "safe/latest" commitment levels to poll
Base feeDynamic but not burnedValidators receive 100% of fees
ExecutionFull EVM compatibilityNo changes to your Solidity code are necessary
Address formatDual (0x + pax1...)Same private key derives both addresses

Features Requiring Attention:

  • Pending state: Paxeer doesn't have pending state - transactions are either included or not
  • Blob opcodes: EIP-4844 blob transactions are not supported
  • PREVRANDAO entropy: Returns block-time-derived value, not true randomness - use VRF oracles here
  • SELFDESTRUCT: Deprecated; refactor to "soft close" patterns

Step 2: Prepare Your Development Environment

Add Paxeer Network Configuration

Hardhat Configuration:

title="hardhat.config.ts"
import { defineConfig, configVariable } from 'hardhat/config';
import hardhatToolboxMochaEthers from '@nomicfoundation/hardhat-toolbox-mocha-ethers';

export default defineConfig({
  networks: {
    paxeerMainnet: {
      type: 'http',
      chainId: 125,
      url: 'https://public-rpc.paxeer.app/evm/reference',
      accounts: [configVariable('PAXEER_PRIVATE_KEY')]
    }
  },
  plugins: [hardhatToolboxMochaEthers]
});

Store your deployer key in Hardhat's encrypted keystore with npx hardhat keystore set PAXEER_PRIVATE_KEY. Contract verification via Sourcify is enabled by default in Hardhat 3's hardhat-verify (bundled with the toolbox).

Foundry Configuration:

title="foundry.toml"
[profile.default]
src = "src"
out = "out"
libs = ["lib"]

[rpc_endpoints]
paxeer_mainnet = "https://public-rpc.paxeer.app/evm/reference"

# Verification uses Sourcify (no API key needed)
# Run: forge verify-contract --verifier sourcify --chain-id 125 <ADDRESS> <PATH:CONTRACT>

See the Hardhat tutorial and Foundry guide for complete setup instructions.

Wallet Configuration

Pre-configure MetaMask or other wallets with Paxeer chain params:

const paxeerMainnet = {
  chainId: '0x7d', // 125
  chainName: 'Paxeer',
  nativeCurrency: { name: 'Paxeer', symbol: 'HPX', decimals: 18 },
  rpcUrls: ['https://public-rpc.paxeer.app/evm/reference'],
  blockExplorerUrls: ['https://paxscan.io']
};

await window.ethereum.request({
  method: 'wallet_addEthereumChain',
  params: [paxeerMainnet]
});

Step 3: Bootstrap Common Infrastructure

Paxeer already exposes canonical helper contracts - reference them instead of redeploying:

ComponentAddressNotes
Permit20xB952578f3520EE8Ea45b7914994dcf4702cEe578Shared allowance manager for DEX and wallet flows
Multicall30xcA11bde05977b3631167028862bE2a173976CA11Enables batching and view aggregation
ImmutableCreate2Factory0x0000000000FFe8B47B3e2130213B802212439497Deterministic deployments with CREATE2
SingletonFactory0xce0042B868300000d44A59004Da54A005ffdcf9fEIP-2470 singleton factory

For third-party contracts (LayerZero, Safe, etc.), consult the full Ecosystem Contracts page.

Step 4: Port Contracts and Configuration

Parameterize Chain-Specific Constants

// Example: Chain-aware deadline calculation
function getDeadline(uint256 secondsFromNow) internal view returns (uint256) {
    if (block.chainid == 125) { // Paxeer mainnet
        return block.timestamp + secondsFromNow;
    } else if (block.chainid == 1) { // Ethereum
        return block.timestamp + secondsFromNow;
    }
    return block.timestamp + secondsFromNow;
}

Adjust Gas and Size Assumptions

  • Keep gasLimit buffers modest but ensure calldata stays under the block limit
  • Large deployments may need batching

Refactor Deprecated Patterns

// Before: SELFDESTRUCT (deprecated)
function destroy() external onlyOwner {
    selfdestruct(payable(owner));
}

// After: Soft close pattern
bool public closed;

function close() external onlyOwner {
    closed = true;
    // Transfer remaining funds
    payable(owner).transfer(address(this).balance);
}

modifier notClosed() {
    require(!closed, "Contract is closed");
    _;
}

Step 5: Plan Bridging and Cross-Chain Connectivity

LayerZero V2

See the complete LayerZero integration guide.

title="layerzero.config.ts"
import { EndpointId } from '@layerzerolabs/lz-definitions';

const paxeerContract = {
  eid: EndpointId.PAXEER_V2_MAINNET,
  contractName: 'MyOFT'
};

Other Bridge Options

  • Circle CCTP: For USDC bridging (check availability)

Step 6: Handle Assets and Oracles

Oracle Integration

Paxeer supports multiple oracle solutions:

ProviderUse CaseDocumentation
Pyth NetworkHigh-frequency price feedsPyth Network
ChainlinkIndustry-standard data feedsChainlink on Paxeer
RedStoneModular oracle with push modelRedStone on Paxeer
API3First-party oracle dataAPI3 on Paxeer

Step 7: Launch Checklist

Mainnet Deployment (chain ID 125)

  • Deploy contracts to mainnet (chain ID: 125)
  • Run full integration test suite
  • Verify contracts via Sourcify
  • Test wallet connections and transaction flows
  • Validate oracle integrations
  • Test cross-chain messaging if applicable
  • Re-run smoke tests
  • Update frontend configurations
  • Prepare user migration documentation
Fee Redistribution Warning: Fees on Paxeer are not burned. If your protocol redistributes "burn rebates" to users, redesign that logic so it does not expect a base-fee burn component.

Step 8: Operational Readiness

Contract Verification

Automate verification through CI using Sourcify:

# Foundry verification
forge verify-contract --watch \
  --verifier sourcify \
  --chain-id 125 \
  <CONTRACT_ADDRESS> \
  <CONTRACT_NAME>

RPC and Indexer Health

  • Primary RPC: https://public-rpc.paxeer.app/evm/reference
  • For mission-critical paths, consider self-hosted nodes or premium RPC providers

Monitoring Gas Parameters

Periodically query fee data to keep dashboards aligned:

// Monitor current gas prices
const feeHistory = await provider.send('eth_feeHistory', ['0x5', 'latest', []]);
const gasPrice = await provider.getGasPrice();

Helpful References