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
:
[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:
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:
'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])
}