What ERC-20 actually is
Ethereum has its own native currency, Ether (ETH), but it also lets anyone create additional tokens by deploying a smart contract — a program that lives on the chain and keeps track of who owns how much. ERC-20 is the standard those contracts follow. The name comes from "Ethereum Request for Comment" number 20, the proposal that defined it; the number is just an identifier, not a version.
The standard is essentially an interface: a list of functions and events a token contract must expose, such as reporting a balance, transferring tokens, and approving a third party to spend on your behalf. Because every ERC-20 token speaks this same vocabulary, a wallet or a payment processor can support a new one simply by knowing its contract address — no bespoke integration per token. That interoperability is the entire point of the standard.
ERC-20 tokens are fungible: every unit is interchangeable with every other, the way one dollar is the same as any other. (That contrasts with ERC-721, the standard for non-fungible tokens, where each unit is unique.) An ERC-20 token is not a separate blockchain — it lives on Ethereum, its transfers are recorded in Ethereum blocks, and moving it costs a network fee paid in ETH, the gas that pays for the computation.
What it means in a crypto payment
When a customer pays in an Ethereum-based stablecoin, they are almost always sending an ERC-20 token: a USDT or USDC payment on Ethereum is an ERC-20 transfer settled in an Ethereum block. The standard is what lets one receiving address accept many different tokens cleanly — the address is the same, and the contract address on the transfer tells you which token arrived.
Two practical points follow. First, the same token symbol can exist on more than one chain — USDT on Ethereum is an ERC-20 token, while USDT on Tron follows that network's own TRC-20 standard. They are the same dollar of value but different on-chain objects, and the standard a token follows depends on the chain it was sent over. Second, because an ERC-20 transfer is a contract interaction rather than a plain ETH send, it consumes gas paid in ETH; the receiving side does not pay this, but it is why the customer's chosen network affects the fee and confirmation time.
ERC-20 on halfin
halfin runs a gate for ERC-20 tokens on Ethereum, alongside the gate for native ETH. The stablecoins it accepts there — USDT and USDC — are ERC-20 tokens, and a payment in either is detected as a token transfer to your receiving address and credited to the same fiat-anchored balance as any asset. halfin distinguishes one ERC-20 token from another by its contract address, so USDC and USDT payments on Ethereum land in your ledger correctly as the assets they are.
Because invoices are fiat-anchored, accepting an ERC-20 stablecoin does not require you to think about token mechanics. You bill a fiat amount; halfin maps it to the payable token figure using the live rate and locks that figure when the invoice activates, then shows the customer a concrete amount to send. Crediting is reorg-aware and waits for Ethereum's confirmation threshold before the invoice is marked paid. halfin supports only the ERC-20 tokens it has gates for — currently USDT and USDC on Ethereum — not arbitrary tokens just because they exist on the chain.