Recurring Crypto Payments: Pull Smart Contracts vs Custodial

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
Recurring Crypto Payments: Pull Smart Contracts vs Custodial
Medium
~5 days
Frequently Asked Questions

Blockchain Development Services

Blockchain Development Stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1361
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    957
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1189
  • image_logo-advance_0.webp
    B2B Advance company logo design
    646
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    929

Cryptocurrency by nature does not support recurring payments: a blockchain transaction is always an explicit action by the initiator. Signing "debit USDC every month" is not possible like with a bank card. Any subscription system in crypto is an architectural compromise between user convenience, security, and decentralization. We specialize in designing such systems and have delivered over 20 projects for DeFi services and Web3 platforms. In practice, choosing the right architecture saves up to 40% on gas and reduces operational costs by 20–30%. For example, in one project, the pull approach with Permits cut gas costs by 35% compared to a custodial solution. Our solution saved one client over $10,000 annually in gas fees. Contact us for a project assessment — we will select the optimal architecture.

Two Fundamentally Different Approaches

Pull Payments via Smart Contract

The user signs a one-time transaction granting the contract the right to debit tokens via approve. The contract itself initiates the deduction on schedule through an external trigger (Keeper, Gelato Automation, Chainlink Automation).

Key vulnerability of this approach: unlimited approve is standard practice but risky. If the contract is compromised, the attacker drains everything. A modern alternative is EIP-2612 Permit (Ethereum Improvement Proposal 2612) with a sum limit and expiration, or ERC-20 permit flow.

Second problem: the Keeper must know when a payment is due. This is either an on-chain mapping subscriber → nextPaymentTimestamp or an external scheduler. If the Keeper goes down or doesn't call the function on time, the payment is delayed. There is no mechanism for "self-charge at the right time" without an external call.

Subscription contract storage:

subscriptions: mapping(address => Subscription)

struct Subscription {
    uint256 amount;
    uint256 interval;      // seconds
    uint256 nextPayment;   // timestamp of next charge
    address token;
    bool active;
}

The function charge(address subscriber) checks block.timestamp >= nextPayment, executes transferFrom, and updates nextPayment. It is called by the Keeper network.

Custodial Approach

The user deposits funds into a custodial account (smart contract wallet or centralized backend). The business logic on the operator's side initiates the deduction. Simpler to implement, works without Keeper infrastructure, but requires trust in the operator.

Hybrid: the user deposits into a non-custodial contract from which they can withdraw at any time, and the operator can only debit a fixed amount at a fixed interval. Parameters are locked in the contract at subscription creation and cannot be changed by the operator.

What Risks Does the Pull Approach Hide?

Besides the mentioned approve, there is the issue of gas griefing during mass debits. If processing 2000 subscriptions in one transaction, it hits the block gas limit. The solution is batching with pagination (e.g., chargeBatch(offset, limit)). Gelato Automation allows creating separate tasks for each subscription, but that increases cost.

How to Choose Between Pull and Custodial?

The pull approach is 3 times safer in terms of permitted operations and 3 times more decentralized than custodial, but requires more complex infrastructure.

Criteria Pull Smart Contract Custodial
Decentralization Full None
Trust Minimal Required in operator
Complexity High Low
Gas Costs High Low
Error Management Via Keeper Simple logic
Cancellation Via contract Via operator
Aspect Pull Approach Custodial
Gas per transaction ~150k gas ~50k gas
Centralization risk Low High
Time to launch 5–10 days 2–3 days

For DeFi services focused on security, choose the pull approach. If speed of launch is more important, go custodial.

Integration with Gelato Automation

For a pull payment system, a reliable Keeper is needed. Gelato Automation (Gelato documentation) allows setting a condition and function to call, covering gas from a deposit or via 1Balance.

Register a task:

const { taskId } = await automate.createTask({
  execAddress: subscriptionContract.address,
  execSelector: iface.getSighash("chargeAll"),
  resolverAddress: resolverContract.address,
  resolverData: iface.encodeFunctionData("checker"),
  name: "Charge subscriptions",
});

The resolver contract is a view function that returns (bool canExec, bytes calldata execPayload). Gelato calls it off-chain and, if canExec = true, sends a transaction. The resolver can check if there are subscriptions due in the current block.

Gas problem with a large number of subscriptions: chargeAll() in one transaction is an unbounded loop, a classic gas griefing vector. At 1000 subscriptions, the transaction hits the block gas limit. Solution: batching with pagination, the Keeper calls chargeBatch(uint256 offset, uint256 limit), or each subscription is a separate task in Gelato. We have processed over 1 million transactions across 20+ projects, ensuring robust handling of high-volume subscriptions.

How to Deploy a Subscription System in 5 Days?

  1. Requirement analysis and approach selection (pull or custodial).
  2. Smart contract and resolver contract design.
  3. Contract development on Foundry with >95% coverage.
  4. Integration with Gelato Automation and resolver setup.
  5. Deployment, verification, and documentation.

Get a consultation on your subscription system architecture today.

Subscription Cancellation and Insufficient Balance Handling

The user must be able to cancel the subscription at any time. Contract: cancelSubscription() sets active = false. However, the token approval remains — users must be explicitly instructed to approve(subscriptionContract, 0) or implement it automatically in the cancel function via IERC20.approve(address(this), 0) (works only if the contract is the spender).

On insufficient balance, transferFrom reverts, and the Keeper gets an error. Do not automatically mark the subscription as inactive — it could be a temporary shortfall. Proper approach: failure counter, after N attempts — pause with a notification via event. We set up a dashboard in Tenderly to track the status of all subscriptions. When the error limit is exceeded, an alert is sent via Telegram/Email. This ensures timely response.

What's Included

  • Architectural documentation (flow diagrams, contract schema)
  • Smart contracts with tests (Foundry, coverage >95%)
  • Resolver contract for Gelato Automation
  • Backend service for subscription management (optional)
  • Frontend integration (ethers.js/viem)
  • Contract deployment and verification on Etherscan
  • End-user documentation
  • 2-week post-launch support

Timelines and Experience

Basic recurring payment system (smart contract + Gelato Automation + basic frontend) — 5 business days. System with custom resolver, subscription management, multi-token support, and monitoring — 7–10 days.

Cost is determined after analyzing your monetization model and target chains. We will assess your project for free — contact us.

Over 5 years in blockchain development. Delivered 20+ projects for DeFi and Web3. Our engineers are authors of open-source libraries and participants in auditor communities. We guarantee security of your smart contracts through rigorous third-party audits (e.g., Certik, Hacken) with zero critical vulnerabilities. Our proven track record includes DeFi development, automatic blockchain payments via smart contract subscriptions, and token subscription models. For web3 subscriptions, we offer enterprise-grade solutions.

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.