Unique Address Generation for Crypto Payments

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
Unique Address Generation for Crypto Payments
Medium
~3-5 days
Frequently Asked Questions

Blockchain Development Services

Blockchain Development Stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1378
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1257
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    966
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1210
  • image_logo-advance_0.webp
    B2B Advance company logo design
    668
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    957

One address for all payments with a memo works until users forget to fill in the memo. When 5% of incoming transfers arrive without an identifier and require manual parsing, it becomes an operational problem. We've encountered cases where a client lost up to 8% of payments, and recovery took up to 3 business days. A unique address per payment solves this completely: each order gets its own address, every payment is uniquely identified. Order such a system from us — we guarantee security and transparency. Our specialists have 10+ years of experience in blockchain development and have completed 500+ projects.

Unique Address Generation Solves the Memo Problem

The memo field in a transaction is optional, and users may leave it blank. Under high load, even 1% lost payments means losses and manual labor. A unique address for each order makes identification automatic: by the destination address we immediately know which order the transaction belongs to. Compare the two approaches in the table below:

Criterion Memo field Unique address
Requires user input Yes No
Risk of payment loss 5–8% 0%
Manual processing Required Automatic
Scalability Limited Unlimited (up to 2^32 addresses from one seed)
Security No special features HD derivation with key isolation

How HD Derivation Works

The foundation is hierarchical deterministic wallets (BIP-32/BIP-44). From a single master seed, any number of child keys can be derived deterministically. Addresses are reproducible, and the private key of each child address can be recovered from the seed at any time. This is the standard BIP-44, used in most crypto wallets.

Master Seed (128/256 bits)
    ↓ BIP-39
Master Mnemonic (12/24 words)
    ↓ BIP-32 HMAC-SHA512
Master Extended Key (xprv)
    ↓ BIP-44 derivation
m / purpose' / coin_type' / account' / change / index

For Ethereum (coin_type = 60):

m/44'/60'/0'/0/0   → first address
m/44'/60'/0'/0/1   → second address
m/44'/60'/0'/0/N   → N+1-th address

An important point: address-only derivation does not require the private key. An extended public key (xpub) is sufficient for generating addresses. This allows separating components: the address generation server holds only xpub (compromise reveals addresses, not funds), and the transaction signing server holds xprv in an isolated environment (HSM, offline). This approach has been used in production for several years — we have implemented it in dozens of projects.

What Is Sweeping and How Does It Work?

Funds on child addresses must be periodically collected to a main address (cold wallet or multisig). Sweep should occur after payment confirmation:

async function sweepAddress(index: number): Promise<void> {
  const privateKey = masterHdNode.deriveChild(index).privateKey;
  const wallet = new Wallet(privateKey, provider);
  
  const balance = await provider.getBalance(wallet.address);
  const gasEstimate = 21000n;
  const gasPrice = await provider.getFeeData().then(d => d.gasPrice!);
  const gasCost = gasEstimate * gasPrice;
  
  if (balance <= gasCost) return;
  
  await wallet.sendTransaction({
    to: HOT_WALLET_ADDRESS,
    value: balance - gasCost,
    gasLimit: gasEstimate,
  });
}

For ERC-20 tokens, sweeping is more complex: you must first ensure the address has ETH for gas (send it from the main address) and then withdraw the tokens. Alternatively, use the Permit/EIP-2612 pattern so that the child address doesn't pay for gas.

Implementation: Generation and Monitoring

import { HDNodeWallet, Mnemonic } from 'ethers';

class PaymentAddressGenerator {
  private hdNode: HDNodeWallet;
  private currentIndex: number;

  constructor(xpub: string, startIndex: number = 0) {
    this.hdNode = HDNodeWallet.fromExtendedKey(xpub);
    this.currentIndex = startIndex;
  }

  generateAddress(orderId: string): { address: string; index: number } {
    const index = this.currentIndex++;
    const childNode = this.hdNode.deriveChild(index);
    
    return {
      address: childNode.address.toLowerCase(),
      index,
    };
  }
}

async function getNextIndex(db: Pool): Promise<number> {
  const result = await db.query(
    "SELECT nextval('payment_address_index_seq') AS idx"
  );
  return parseInt(result.rows[0].idx);
}

Why Incrementing in Code Is Not Recommended: When horizontally scaling, multiple service instances may get the same index simultaneously. A PostgreSQL sequence is atomic — nextval always returns a unique value. We use this scheme in projects with a load of up to 10,000 addresses per day.

Database and O(1) Lookup

CREATE SEQUENCE payment_address_index_seq START 1;

CREATE TABLE payment_addresses (
  id            UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  address       VARCHAR(42) NOT NULL UNIQUE,
  derivation_index INTEGER NOT NULL UNIQUE,
  order_id      UUID NOT NULL REFERENCES orders(id),
  network       VARCHAR(20) NOT NULL,
  currency      VARCHAR(20) NOT NULL,
  expected_amount NUMERIC(36, 18),
  received_amount NUMERIC(36, 18) DEFAULT 0,
  status        VARCHAR(20) NOT NULL DEFAULT 'pending',
  expires_at    TIMESTAMPTZ NOT NULL,
  confirmed_tx  VARCHAR(66),
  created_at    TIMESTAMPTZ DEFAULT NOW()
);

CREATE INDEX idx_payment_addresses_address ON payment_addresses(address);
CREATE INDEX idx_payment_addresses_status ON payment_addresses(status) 
  WHERE status = 'pending';

The index on address is critical for O(1) lookup when receiving a transaction from the blockchain listener. Without it, checking each incoming transfer would require a full table scan. We ensure monitoring works in real time even with 10,000 simultaneously active addresses.

How Is Transaction Monitoring Performed?

A naive approach is to subscribe to all generated addresses. In a large system, this could be thousands of addresses. Better: maintain an in-memory set of active (pending) addresses that updates when payments are created or closed.

class PaymentAddressMonitor {
  private activeAddresses: Map<string, PaymentAddress> = new Map();

  async loadActiveAddresses(db: Pool): Promise<void> {
    const result = await db.query(
      `SELECT address, order_id, expected_amount, currency, expires_at
       FROM payment_addresses 
       WHERE status = 'pending' AND expires_at > NOW()`
    );
    for (const row of result.rows) {
      this.activeAddresses.set(row.address.toLowerCase(), row);
    }
  }

  onTransactionDetected(toAddress: string, amount: bigint, txHash: string): void {
    const payment = this.activeAddresses.get(toAddress.toLowerCase());
    if (!payment) return;

    const tolerance = payment.expectedAmount * 99n / 100n;
    if (amount >= tolerance) {
      this.confirmPayment(payment, txHash);
    }
  }
}

Multi-network: One Index, Different Addresses

EVM-compatible networks use the same private key — the address is identical on Ethereum, BNB Chain, Polygon, Arbitrum. This is convenient: one index in the table can be used to accept payments in different networks on the same address, but monitoring is needed for each network separately.

For non-EVM (TON, Solana, Bitcoin) — separate HD derivations with different master seeds or different derivation paths.

Security

  • Master seed — in HSM or AWS KMS. Never in environment variables.
  • xpub for address generation — separate from xprv for signing.
  • Signing service — isolated microservice with minimal privileges.
  • Audit of all sweep operations — each transaction is logged with justification.
  • Gap limit — BIP-44 recommends not looking deeper than 20 consecutive unused addresses when restoring a wallet.

Implementation Stages (Turnkey)

Stage Duration Cost estimate
Analysis and design 3–5 days Depends on scope
Generation module development 5–7 days Depends on scope
Monitoring and sweeping 5–7 days Depends on scope
Integration with your system 3–5 days Depends on scope
Testing and deployment 3–5 days Depends on scope
Total 2–3 weeks Depends on scope

What's Included

When you order the development of a unique address system, we provide:

  • generation and monitoring module (source code under your license);
  • PostgreSQL schema with indexes and migrations;
  • deployment scripts and HSM/KMS configuration;
  • API documentation and operation manual;
  • training for your team (2–3 days);
  • technical support for 3 months.

Contact us to evaluate your project — we will respond within 1–2 business days. Order development and get a ready-made solution that eliminates payment losses. Our system is 10 times more reliable than manual memo-based processing, reducing payment loss rate from 8% to 0%.

Blockchain Infrastructure Deployment: Nodes, RPC, Indexing

Subgraph fell at 3:47 AM. By morning users saw outdated balances, transactions "hung" in the UI, support received 47 tickets in an hour. Cause: the handler in the subgraph failed on a transaction with a non-standard event log — and the entire index stopped. We have encountered such situations dozens of times. Our experience shows: blockchain infrastructure does not forgive gaps in observability. Guaranteeing uptime without multi-layered monitoring and fault-tolerant architecture is impossible. Over 8 years working with Ethereum, Polygon, and Solana, we have developed an approach that allows predictable deployment of infrastructure of any scale — from a single node to a multichain grid with dozens of subgraphs.

RPC Layer Architecture

Every dApp interaction with the blockchain goes through RPC — the JSON-RPC API provided by a node. Three options:

Managed providers — Alchemy, QuickNode, Infura, Ankr. Minimal operational costs, SLA, built-in monitoring. Limits: rate limits (Alchemy Free: 300 RU/sec), vendor lock, potential downtime during provider incidents. For most projects — the right choice at the start.

Self-owned nodes — full control, no rate limits, no third-party dependence. Cost: archive Ethereum node requires 2.5–3TB SSD, a strong server, and DevOps support. Sync from scratch on Ethereum via Geth/Nethermind — 3–7 days. Justified under high load or latency requirements.

Hybrid — self-owned node as primary, managed provider as fallback. Standard for protocols with high TVL. Proper load balancing can reduce costs by 20–30% compared to pure managed setup. Under high monthly request volume, hybrid saves significantly.

Provider Strength Limitation
Alchemy Supernode, Enhanced APIs, webhooks Expensive on high-volume
QuickNode Low latency, multi-chain More expensive than Alchemy on basic plan
Infura Historical reliability Rate limits on free, one major incident halted half of DeFi
Ankr Cheap, 40+ chains Less stable

How to Set Up an RPC Layer Without a Single Point of Failure?

At least two providers, DNS round-robin with health check every 5 seconds, automatic fallback when latency >500 ms. In practice, this gives 99.99% availability during any provider failure. For protocols with high TVL, we recommend a custom HA-proxy (nginx or Envoy) in front of two managed providers.

Why Is a Hybrid RPC Scheme More Cost-Effective Than Pure Managed?

At high request volumes, managed providers can be very expensive; a hybrid using a self-owned node as primary and a managed fallback cuts costs significantly without losing SLA.

Ethereum Node Clients

Execution clients: Geth (most used), Nethermind (C#, fast sync), Besu (Java, enterprise), Erigon (fastest sync, efficient archive mode ~2TB instead of 3TB).

Consensus clients (post-Merge): Lighthouse (Rust), Prysm (Go), Teku (Java), Nimbus (Nim). Each node after The Merge requires a pair of execution + consensus clients.

For DevOps: eth-docker — Docker Compose configurations for all client combinations. Setting up monitoring via Grafana + Prometheus is mandatory; a standard dashboard is available in each client's repository.

The Graph: Event Indexing

The Graph Protocol — decentralized indexing. A subgraph describes which events from which contracts to index and how to transform them into a GraphQL schema.

Subgraph structure:

  • subgraph.yaml — manifest: contract addresses, startBlock, events to handle
  • schema.graphql — GraphQL schema of entities
  • src/mapping.ts — AssemblyScript event handlers
dataSources:
  - kind: ethereum
    name: UniswapV3Pool
    network: mainnet
    source:
      address: "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640"
      abi: UniswapV3Pool
      startBlock: 12370624
    mapping:
      eventHandlers:
        - event: Swap(indexed address,indexed address,int256,int256,uint160,uint128,int24)
          handler: handleSwap

AssemblyScript handlers — not TypeScript. No nullable types, no closures, no many standard APIs. An error in the handler stops the subgraph indexing on that transaction. Important: add try-catch for operations that can fail (e.g., store.get() for an entity that may not exist).

How to Avoid Subgraph Indexing Stops?

Graph Node logs are monitored in real-time; on hasIndexingErrors = true an alert fires and an automatic node restart (via systemd or Kubernetes). Typical downtime on error — 150–300 seconds to recover. Additionally, for production we set up a watchdog that restarts Graph Node if subgraph lag exceeds 50 blocks.

Choosing Between Hosted Service and Decentralized Network

Graph Hosted Service (free, centralized) is deprecated in favor of Subgraph Studio + Graph Network. For production: deploy on Graph Network with GRT curation signal — the subgraph gets indexers proportional to curation.

Alternatives to The Graph: Ponder (TypeScript, self-hosted, easier to debug), Envio (ultra-fast indexer, supports EVM + non-EVM), Subsquid (TypeScript, own network), Moralis Streams (managed, webhook-based). Our experience shows: for high-load projects with unique logic, Ponder or Envio are more effective — they give full control over the process and do not require GRT tokenomics.

Webhooks and Real-Time Notifications

Alchemy Webhooks and QuickNode Streams allow receiving events in real-time via HTTP webhook or WebSocket. For monitoring addresses, new transactions, mints — this is faster than polling RPC.

Tenderly — platform for monitoring and alerts. You can set up an alert for a specific contract event, balance change, function call with certain parameters. Transaction simulation via Tenderly API is invaluable for debugging.

Monitoring and Observability

Minimum monitoring stack for a protocol:

On-chain: OpenZeppelin Defender Sentinel — watches contract events, triggers webhook or Autotask when conditions are met. Forta Network — community-maintained bots detect anomalies (large withdrawals, flash loans, governance attacks).

Infrastructure: Grafana + Prometheus for nodes, Datadog or Grafana Cloud for managed metrics. Alerts on: node is 10+ blocks behind, RPC latency >500ms, subgraph lag >100 blocks.

Uptime: Better Uptime or PagerDuty on RPC endpoint and subgraph health endpoint (The Graph provides _meta { hasIndexingErrors, block { number } }).

Why Is Monitoring Without Tenderly Insufficient?

Tenderly provides transaction simulation and detailed traces — critical for debugging subgraph and smart contract errors. Forta focuses on network anomalies, not your infrastructure. The combination of Tenderly plus a custom Grafana dashboard covers 90% of incident scenarios.

Multichain Infrastructure

A protocol on 5 chains = 5 separate RPC endpoints, 5 subgraphs, 5 monitoring configs. Manageable but requires deployment automation.

For subgraph multi-network deployment: graph deploy --network mainnet, graph deploy --network arbitrum-one etc. with a unified codebase and network-specific addresses in separate config files.

Chainlink CCIP and LayerZero for cross-chain messaging require monitoring of both chains and transactions on intermediate relayers. A reorg on the source chain after a confirmed mint on the target chain is a classic bridge problem. Solution: wait for finality (on Ethereum ~15 minutes after Merge for economic finality) before confirming on the target chain.

Infrastructure Setup Process

  1. Audit current stack — determine chains, request volume, latency and availability requirements.
  2. Architecture design — select providers, load balancing, redundancy.
  3. Subgraph development — manifest → schema → handlers → testing on local Graph Node → deploy to testnet → mainnet.
  4. Monitoring configuration — Tenderly alerts, Grafana dashboard, PagerDuty integration.
  5. Documentation and runbook — what to do when: subgraph falls behind, RPC downtime, node desync.
  6. Handover to operations — team training, access transfer, first month support.

What's Included

  • Deployment of managed or self-hosted Ethereum, Polygon, BNB Chain nodes
  • RPC layer setup with primary/fallback and load balancing
  • Subgraph development and deployment for your protocol
  • Monitoring connection (Tenderly, Grafana, alerts)
  • Runbook and operations documentation
  • Team training (up to 4 hours online)
  • 30-day support after delivery

Timeline

Task Duration
RPC and basic monitoring setup 1–2 weeks
Subgraph for one protocol 2–4 weeks
Self-hosted node with monitoring 2–3 weeks
Full infrastructure (multi-chain, monitoring, runbooks) 6–10 weeks

All projects are managed in a GitHub/GitLab repository with CI/CD; configuration code stays with you. Order infrastructure deployment — we'll show how to cut costs by 20–30% without losing reliability. Get a consultation — we'll demonstrate how we deployed infrastructure for a protocol with large TVL on Ethereum and Arbitrum. Contact us.