inkathoninkathon

Add a New Contract

Create and integrate new ink! smart contracts in your project

Prerequisites

  • Working inkathon project
  • Set up environment for contract development
  • Local node running (optional)

Step-by-Step Guide

Create Contract

Use Pop CLI to scaffold a new contract in the contracts/src directory:

cd contracts/src

# Create a new contract with a template
pop new contract <contract-name> --template <template-name>

# Example: Create an ERC20 token
pop new contract my_token --template erc20

Available Templates

View all available contract templates:

pop new contract --template

Common templates include erc20, erc721, erc1155, dns, multisig, and more.

Update Cargo Configuration

Add your new contract to the workspace members in contracts/Cargo.toml:

contracts/Cargo.toml
[workspace]
members = [
    "src/flipper",
    "src/<contract-name>",
]

Build & Generate Types

Build the contract and generate TypeScript types:

cd contracts

# Build all contracts
bun run build

# Generate TypeScript types with Papi
bun run codegen

This creates:

  • Contract artifacts in /contracts/deployments/<contract-name>/
  • TypeScript types accessible via @polkadot-api/descriptors

Deploy Contract

Deploy your contract to the desired chain:

# Deploy to local dev chain (default)
CHAIN=dev bun run deploy
# Deploy to Pop Network 
CHAIN=pop bun run deploy
# Deploy to any configured chain
CHAIN=<chain-name> bun run deploy

Deployment addresses are exported to /contracts/deployments/<contract-name>/<chain>.ts

Configure Frontend

Import and configure your new contract in the frontend:

frontend/src/lib/inkathon/deployments.ts
import { contracts } from '@polkadot-api/descriptors'
import * as newContractDev from 'contracts/deployments/newContract/dev'
import * as newContractPop from 'contracts/deployments/newContract/pop'

// Add your contract configuration
export const newContract = {
  contract: contracts.newContract,
  evmAddresses: {
    dev: newContractDev.evmAddress,
    pop: newContractPop.evmAddress,
  },
  ss58Addresses: {
    dev: newContractDev.ss58Address,
    pop: newContractPop.ss58Address,
  },
}

export const deployments = {
  newContract,
}

Use Contract in Frontend

Create components to interact with your contract:

frontend/src/components/web3/contract-card.tsx
'use client'

import { createReviveSdk } from '@polkadot-api/sdk-ink'
import { deployments } from '@/lib/inkathon/deployments'
import { useChainId, useApi } from '@reactive-dot/react'

export function ContractCard() {
  const chainId = useChainId()
  const api = useApi()

  const queryContract = useCallback(async () => {
    if (!api || !chainId) return

    // Create SDK & contract instance
    const sdk = createReviveSdk(api, deployments.newContract.contract)
    const contract = sdk.getContract(deployments.newContract.evmAddresses[chainId])

    // Interact with your contract
    // ...
  }, [api, chainId])
}

Learn More