What smart contracts are good for
A smart contract is a program stored on a blockchain that runs exactly as written whenever someone calls it. It can hold assets, enforce rules and release funds without a central operator — which makes it powerful for escrow, token issuance, vesting schedules, royalties, on-chain voting and marketplaces.
The same property makes contracts unforgiving. Once deployed, the code is public, attackers can study it at leisure and funds it holds can be at risk from a single bug. Good smart contract development is therefore mostly about restraint: minimal logic, proven patterns, exhaustive tests and independent review.
Problems we solve
- Contracts copied from tutorials without tests or review
- Admin keys held by one person with no multi-signature or timelock
- Upgradeable proxies set up incorrectly, risking storage collisions
- Gas costs that make common actions too expensive for users
- No monitoring after deployment, so incidents are noticed late
What’s included
Token contracts
ERC-20, ERC-721 and ERC-1155 tokens with roles, pausing and supply rules.
Escrow & payments
Milestone escrow, payment splitting and royalty distribution.
Vesting & staking
Time-based vesting, lockups and reward distribution.
Governance
Proposals, voting and timelocked execution.
Marketplaces
Listings, offers and settlement with clear fee logic.
Audit preparation
Documentation, test coverage and fixes for existing contracts.
Our development and testing process
-
Specification1 week
Write down every rule, role and invariant in plain language before code is written.
-
Implementation1–4 weeks
Solidity using audited OpenZeppelin components wherever possible.
-
TestingThroughout
Unit, fuzz and invariant tests with Foundry or Hardhat, plus fork tests against live networks.
-
Static analysis
Tools such as Slither flag common vulnerability patterns before review.
-
Audit & testnet2–6 weeks
Independent audit, fixes, then a public testnet deployment for final checks.
| Tool | What we use it for |
|---|---|
| Foundry | Fast tests, fuzzing, invariant testing and scripting |
| Hardhat | JavaScript/TypeScript tooling and plugin ecosystem |
| OpenZeppelin | Audited standard implementations and upgrade plugins |
| Slither | Static analysis for common vulnerabilities |
| Tenderly / block explorers | Transaction simulation, debugging and verification |
Upgradeability and administration
Upgradeable contracts let you fix bugs and add features after launch, but they introduce trust and complexity: whoever controls the upgrade can change the rules. Immutable contracts are simpler and more trustworthy but cannot be fixed. We help you choose deliberately, and when upgradeability is needed we use standard proxy patterns (transparent or UUPS) with storage-layout checks in CI.
- Administrative roles held by multi-signature wallets, not single keys
- Timelocks so users can see and react to upcoming changes
- Emergency pause functions with clear, limited scope
- Verified source code on block explorers for transparency
Independent audits reduce risk but do not eliminate it. We plan for incidents with monitoring, alerting on unusual events and a written response plan agreed before launch.
Timeline and budget
| Scope | Typical timeline | Typical budget (USD) |
|---|---|---|
| Standard token or vesting contract | 2–4 weeks | $6k – $18k |
| Custom protocol (escrow, marketplace, governance) | 6–12 weeks | $25k – $80k |
Typical ranges to help you plan. Your written estimate comes after a free discovery call.
Common vulnerabilities we design against
| Risk | What can go wrong | How we prevent it |
|---|---|---|
| Reentrancy | An external call re-enters the contract before balances update | Checks-effects-interactions pattern and reentrancy guards |
| Access control | Anyone can call an admin function | Explicit roles, tests for every restricted function |
| Oracle manipulation | Prices are pushed by a flash loan to drain funds | Robust price feeds and time-weighted values |
| Integer and rounding errors | Fees or shares calculated incorrectly | Fuzz tests and invariants on every calculation |
| Front-running | Transactions are reordered for profit | Commit-reveal schemes, slippage limits and deadlines |
This list is not exhaustive, which is exactly why independent review matters. Our job is to remove the known classes of bugs before an auditor sees the code, so the audit can focus on design-level issues.
Choosing a chain and language
| Platform | Language | Considerations |
|---|---|---|
| Ethereum mainnet | Solidity, Vyper | Highest security and liquidity; higher fees |
| Layer 2s (Arbitrum, Optimism, Base, Polygon zkEVM) | Solidity | EVM-compatible with lower fees; inherit Ethereum security to varying degrees |
| Solana | Rust (Anchor) | High throughput; different programming model |
| Permissioned networks | Varies | For consortia where participants are known |
For most projects we recommend an EVM chain, because tooling, auditors and developer familiarity are deepest there.
Gas optimisation without sacrificing safety
- Pack storage variables and avoid unnecessary writes, which are the most expensive operations
- Use events instead of storage for data that only needs to be read off-chain
- Batch operations where users would otherwise send many transactions
- Prefer well-audited library code, such as OpenZeppelin, over clever custom code
- Measure gas in tests so regressions are caught before deployment
Readability and security always come before shaving gas: a cheaper contract that is harder to audit is a poor trade.
Deployment and launch checklist
- Full test suite passing, including fuzz and invariant tests
- Independent audit completed and findings resolved
- Deployment scripts reviewed and rehearsed on a testnet
- Admin keys held in a multisig with documented signers
- Contracts verified on the block explorer
- Monitoring and alerting for unusual transactions
- Incident response plan, including pause procedures where appropriate
Off-chain components
A smart contract is rarely the whole product. Users need a web or mobile interface, wallet connection, indexed data for fast reads and often a back end for notifications, compliance checks or integration with existing systems. We build these alongside the contracts so the full system is tested together.
See blockchain development and web application development.
Working with external auditors
An independent audit is a standard step before deploying contracts that hold meaningful value. Audits are most effective when the code is finished, documented and well tested, because auditors spend their time on logic and attack paths rather than basic issues. We prepare a handover pack that includes a specification of intended behaviour, a list of privileged roles and trust assumptions, test coverage reports and known limitations.
After the audit we fix findings, explain any accepted risks in writing and give the auditor the changes to review. Audit firms are chosen by the client; we coordinate the process and answer technical questions. An audit reduces risk but does not guarantee the absence of vulnerabilities, so monitoring and incident plans remain important.
Questions to answer before writing code
- Does this logic genuinely need to be on-chain, or would a database work?
- Who can change parameters or upgrade contracts, and how is that controlled?
- What happens to user funds if something goes wrong?
- Which regulations may apply to the tokens or assets involved? (Your legal advisers confirm this.)
Testing strategy in practice
Unit tests check each function in isolation; fuzz tests feed random inputs to find unexpected behaviour; invariant tests assert properties that must always hold, such as total supply never changing unexpectedly; and fork tests run contracts against a copy of the live chain to check integrations with existing protocols. Together they give far more confidence than example-based tests alone.
Related services
Part of our blockchain development services. See also application security and penetration testing.
This page is part of Blockchain Development Services — see the full overview for related services, approach and pricing.