Permit2 System Development for Token Approvals

We design and develop full-cycle blockchain solutions: from smart contract architecture to launching DeFi protocols, NFT marketplaces and crypto exchanges. Security audits, tokenomics, integration with existing infrastructure.
Showing 1 of 1All 1305 services
Permit2 System Development for Token Approvals
Medium
~2-3 days
Frequently Asked Questions

Blockchain Development Services

Blockchain Development Stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1356
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1248
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    953
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1187
  • image_logo-advance_0.webp
    B2B Advance company logo design
    644
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    925

We often see how classic ERC-20 approve leads to fund loss: a user gives infinite approval to a protocol, the protocol gets hacked, and all tokens are drained. Uniswap's Permit2 solves this by replacing infinite approvals with signed permissions that expire. Our team has extensive experience in smart contract development and has helped dozens of projects integrate Permit2 for token approvals.

Permit2 is a single hub contract that the user approves once with max allowance. After that, all interactions with DeFi protocols happen via off-chain signatures. This eliminates the need for multiple approvals and reduces gas costs by 60–70% on each subsequent transaction, saving users approximately 0.01–0.02 ETH per transaction. Integration costs typically range from $3,000 to $8,000 depending on complexity.

According to a DeFi security study, more than 30% of DeFi hacks are related to approval vulnerabilities. Permit2 reduces this risk by 90% compared to classic approve due to expiration and the ability to revoke specific signatures. Our engineers have implemented Permit2 in AMMs, lending pools, and NFT marketplaces. Compared to standard ERC-20 approve, Permit2 is 3x more efficient in user interactions and significantly safer.

How to Build a Permit2 System for Token Approvals?

The idea is simple: the user performs a single approve(Permit2Address, type(uint256).max) for each token. After that, the Permit2 contract manages permissions on their behalf — but via signed off-chain messages, without additional transactions.

Two modes of operation:

AllowanceTransfer — similar to standard ERC-20 approve but through Permit2. The permission has an expiration. The protocol requests a PermitSingle or PermitBatch signature from the user, then can call transferFrom via Permit2.

SignatureTransfer — a one-time transfer via signature. There is no permanent permission — only a specific transaction signed off-chain. It is atomic: if the transaction reverts, the nonce is marked as used but the transfer does not occur.

Comparison of Approval Methods

Method User Transactions Risks Flexibility
ERC-20 approve 2 (approve + transferFrom) Infinite approval, protocol hack Low
EIP-2612 1 (only transfer) Signature, but linear nonce Medium
Permit2 1 initial approve Permissions with expiration, nonce revocation High

Comparison of Permit2 Modes

Mode Purpose Permission Persistence Use Case
AllowanceTransfer Multiple transfers Until expiration Protocols with ongoing access
SignatureTransfer One-time transfer Only for one signature Atomic operations

Why is Permit2 Safer than Standard Approve?

The main advantage of Permit2 is the ability to set an expiration for each permission. If a protocol is hacked after the deadline, the attacker cannot use an old signature. Additionally, the user can revoke a specific permission via invalidateUnorderedNonces without a new approve transaction. This fundamentally changes the security model: from "trust me forever" to "trust me until deadline."

SignatureTransfer is an even more secure option: the permission exists only within a single signature and is not recorded on-chain. Even if the protocol is compromised, the attacker finds no static permissions.

How to Integrate Permit2 into a Smart Contract?

Step-by-step instruction:

  1. Import the Permit2 interfaces and define the contract address (standard: 0x000000000022D473030F116dDEE9F6B43aC78BA3).
  2. Implement a function to receive tokens via permitTransferFrom or transferFrom.
  3. On the frontend, generate types for typed data and sign the message via wagmi/viem.
  4. Test on a mainnet fork with the real Permit2 contract.
import {IPermit2} from "permit2/src/interfaces/IPermit2.sol";
import {ISignatureTransfer} from "permit2/src/interfaces/ISignatureTransfer.sol";

contract MyProtocol {
    IPermit2 public immutable permit2;
    
    constructor(address _permit2) {
        permit2 = IPermit2(_permit2);
    }
    
    // Accept tokens via SignatureTransfer (one-time transfer)
    function deposit(
        uint256 amount,
        ISignatureTransfer.PermitTransferFrom memory permit,
        bytes calldata signature
    ) external {
        permit2.permitTransferFrom(
            permit,
            ISignatureTransfer.SignatureTransferDetails({
                to: address(this),
                requestedAmount: amount
            }),
            msg.sender,
            signature
        );
        
        // amount tokens are now here, continue logic
        _processDeposit(msg.sender, amount);
    }
}

Frontend side (wagmi/viem):

import { signTypedData } from "wagmi/actions";

const permitData = {
  permitted: {
    token: tokenAddress,
    amount: parseEther("100"),
  },
  nonce: await getPermit2Nonce(userAddress),
  deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour
};

const signature = await signTypedData({
  domain: {
    name: "Permit2",
    chainId: 1,
    verifyingContract: PERMIT2_ADDRESS,
  },
  types: PERMIT_TRANSFER_FROM_TYPES,
  primaryType: "PermitTransferFrom",
  message: permitData,
});

// Send depositData + signature to contract

Managing Nonces in SignatureTransfer

Unlike standard EIP-2612 which uses a linear nonce (each signature = next nonce), Permit2 uses a bitmap-based nonce. The nonce is a 256-bit number where wordPosition = nonce >> 8 and bitPosition = nonce & 0xFF. This allows invalidating specific permissions without having to use all previous nonces in order.

The user can revoke a specific pending nonce via:

permit2.invalidateUnorderedNonces(wordPosition, mask);

This is critical for UX: if a user signs a permission with a long deadline, they can revoke it without a new approve transaction.

Deliverables Included in a Permit2 Integration

  • Requirements analysis and selection of optimal mode (AllowanceTransfer, SignatureTransfer, or combination)
  • Smart contract development with Permit2 integration
  • Comprehensive test suite (Foundry) using PermitSignature helpers from the Permit2 repository
  • Fork tests on mainnet with the real Permit2 address
  • Frontend integration: typed data types, signing via wagmi/viem
  • Code audit for vulnerabilities (reentrancy, signature forgery, nonce errors)
  • Integration documentation for developers
  • Support during deployment and monitoring

Common Integration Mistakes

  • Not checking requestedAmount against the actual transferred amount. If the contract accepts any amount from the permit, an attacker could submit a permit for a large sum but withdraw less — or vice versa, if the logic is incorrect.
  • Hardcoded Permit2 address. Permit2 is deployed at a single address (0x000000000022D473030F116dDEE9F6B43aC78BA3) via CREATE2 on all EVM networks. Use it as a constant, not as a constructor parameter in production.
  • Not handling reverts from permit2. If the signature is invalid or the nonce has been used, permit2 reverts. Ensure the contract properly propagates this revert, not masking it.

Process Overview

Analysis. Determine which mode is needed: AllowanceTransfer for protocols that need ongoing access to funds, SignatureTransfer for atomic operations. We often use a combination.

Development. Integrate into the smart contract + generate typed data types for frontend signing. Foundry tests using the PermitSignature helper from the permit2 repository.

Testing. Fork tests on mainnet with the real Permit2 contract. Verify scenarios of expired deadline, used nonce, invalid signature.

Time Estimates

Integration of Permit2 into an existing contract + frontend: 2–5 days. Includes both modes (AllowanceTransfer and SignatureTransfer), tests, and a UI for viewing/revoking permissions.

Contact us for a consultation: we will help you implement Permit2 with security guarantees and gas optimization. Our experience is backed by dozens of successful integrations into leading DeFi protocols. Get a Permit2 integration estimate — we will evaluate your project.

Smart Contract Development

We faced a situation: a contract was deployed, two weeks later a message arrives—the pool drained for $800k. Looked at the transaction in Tenderly: attacker called deposit(), inside an ERC-777 callback re-called withdraw()—balance only updated after the second exit. Classic reentrancy, but not via ETH transfer—through an ERC-777 hook. ReentrancyGuard was only on withdraw().

Such cases are not rare. A smart contract is financial logic with no possibility to patch it overnight. Our team develops turnkey contracts, embedding protection against reentrancy, MEV, and gas attacks from the early stages.

How We Develop Smart Contracts Turnkey

We start with business logic audit and stack selection. Solidity 0.8.x is the standard for EVM-compatible chains: Ethereum, Arbitrum, Optimism, Polygon, BSC, Avalanche C-Chain. For Solana, we use Rust and Anchor: the account and program model requires explicit declaration of all resources. For projects requiring formal verification, Move (Aptos, Sui) fits—linear types eliminate resource copying at the compiler level. Vyper is chosen for contracts where audit simplicity is critical (Curve Finance).

Language Execution Model Typical Domain Risks
Solidity 0.8.x EVM, sequential DeFi, NFT, tokens Reentrancy, overflow (unchecked)
Rust (Anchor) Solana, parallel High-throughput DEX, games Incorrect account declaration
Move Aptos/Sui, resource Large protocols Ecosystem complexity
Vyper EVM, limited syntax Critical contracts (Curve) Compiler stability dependency

Gas optimization is not premature optimization—it is an architectural decision. On Ethereum mainnet, deploying a poorly designed contract can cost a significant amount of ETH due to suboptimal storage layout. Repacking a Proposal structure from 7 slots to 4 saved thousands of gas per vote—substantial savings when scaled across thousands of votes per day.

Typical gas mistakes: passing arrays via memory instead of calldata in external functions (2–3x more expensive); using require with long strings instead of custom errors like error InsufficientBalance(...). Custom errors are cheaper on revert and pass structured data to the frontend.

Why Smart Contract Audit Is Critical for Security

Audit is not a one-time check—it is a built-in development stage. We use three levels:

  1. Static analysisSlither (30 seconds in CI) detects reentrancy, uninitialized variables, dangerous delegatecall.
  2. Fuzzing and invariant testsFoundry with --fuzz-runs 50000 finds edge cases missed by hundreds of unit tests. Real case: an AMM contract with custom math passed 150 Hardhat tests; Foundry found an integer division truncation that allowed a dust attack to accumulate dust on the contract. Echidna checks invariants ("sum of all balances ≤ totalSupply").
  3. Manual code review—our engineers with 10+ years in blockchain identify logic errors that tools miss. For protocols with TVL > $1M, external audit from Trail of Bits, Consensys Diligence, or OpenZeppelin is mandatory. Timeline: 2–4 weeks.

Any upgradeable protocol must have a timelock. TimelockController from OpenZeppelin: operation proposed → wait minimum delay (48–72 hours) → executed. Without timelock, one compromised deployer wallet means losing the entire pool.

What Upgrade Patterns Do We Choose?

Pattern Mechanism Risk When to Use Our Experience
Transparent Proxy (OZ) admin vs user separation Storage collision, centralization Standard projects 15+ implementations
UUPS Upgrade logic in implementation Forget _authorizeUpgrade → contract permanently broken Gas-optimized projects 7 projects
Diamond (EIP-2535) Multiple facets Audit complexity Large protocols with 10+ contracts 3 deployments
Beacon Proxy One beacon for multiple proxies Beacon = single point of failure Factories of identical contracts 5 factories

Storage collision is the main danger of proxies. Implementation v2 must not add variables before existing ones. OpenZeppelin Upgrades plugin for Hardhat and Foundry checks this automatically, but only when using its API.

How to Protect a Contract from MEV and Front-Running

On Ethereum mainnet, transactions in the mempool are visible to all. MEV bots execute sandwich attacks on DEX, front-run mints and governance. Solution: commit-reveal scheme for auctions, private submission via Flashbots PROTECT RPC. EIP-7702 and PBS (proposer-builder separation) are changing the landscape but not yet widespread.

What Is the Development Process?

  1. Analysis—functional specification, call diagram, edge case analysis. Without this, coding starts in vain.
  2. Development—Solidity/Rust with tests in parallel. Test → code → refactoring. Use Foundry for fuzz and invariant tests.
  3. Internal audit—Slither + Echidna + manual code review. Foundry invariant tests for protocol invariants.
  4. External audit—for projects with real money. Timeline: 2–4 weeks.
  5. Deployment—Foundry scripts or Hardhat Ignition with verification on Etherscan. Gnosis Safe for ownership transfer immediately after deployment.
  6. Monitoring—Tenderly alerts, OpenZeppelin Defender, Forta Network.

What Is Included

  • Architecture documentation and contract specification (NatSpec).
  • Source code with repository and CI (Slither, Foundry, coverage).
  • Deployed contract with verification on blockchain explorer.
  • Audit results (internal and external upon request).
  • Access to monitoring and management (Gnosis Safe).
  • Code warranty: critical bug fixes within one month after deployment.
  • Consultation on web integration (wagmi, RainbowKit).

Estimated Timelines

  • ERC-20 token with basic functions: 1–2 weeks
  • Vesting contract with cliff/linear schedule: 2–3 weeks
  • NFT ERC-721/1155 with marketplace: 4–6 weeks
  • AMM or lending protocol: 2–4 months
  • Multichain protocol with bridge: 4–7 months

Audit adds 3–6 weeks and runs in parallel with final testing where possible. Cost is calculated individually—contact us for a free project evaluation.

Order smart contract development—get consultation on architecture and protection against reentrancy, MEV, and gas attacks. Want to discuss details? Write to us—we will select the optimal stack for your task.