Розробка системи gasless cross-chain транзакцій
Gasless транзакції вирішують один із головних бар'єрів Web3: користувачеві потрібні нативні токени на кожному ланцюзі, щоб платити газ. Для свопу 1000 USDC з Ethereum на Polygon потрібно мати ETH на Ethereum та MATIC на Polygon — це дві окремі транзакції, дві комісії та час очікування. Ми усуваємо ці метання — користувач підписує один інтент, а система сама знаходить оптимальний шлях, оплачує газ і виконує транзакцію на цільовому ланцюзі. Наші замовники економлять до 60% на газових витратах завдяки оптимізації paymaster та використанню intent-based маршрутизації. Наприклад, своп на 1000 USDC через gasless cross-chain коштує користувачеві приблизно 2$ замість 5$ — конкретна економія 3$ на одній операції.
Наприклад, в одному проєкті ми інтегрували gasless cross-chain свопи для DeFi-протоколу: користувач хотів обміняти USDC на Ethereum на USDT на Polygon — без власних ETH та MATIC. Рішення: ERC-4337 акаунт з paymaster в USDC та Axelar gas service для релею. Підсумок: конверсія зросла на 40% завдяки zero-gas UX.
Як працюють gasless cross-chain транзакції?
Gasless cross-chain — не один продукт, а стек із кількох шарів:
- Layer 1: Meta-transactions / ERC-4337. Хто платить газ на вихідному ланцюзі.
- Layer 2: Paymaster. Спонсор, який покриває вартість газу (або приймає оплату в ERC-20).
- Layer 3: Cross-chain relayer. Хто передає повідомлення та платить газ на цільовому ланцюзі.
- Layer 4: Solver/intent executor. Хто знаходить оптимальний маршрут виконання.
Покрокова інструкція:
- Користувач формує та підписує інтент (UserOperation) з даними про бажану дію та умови оплати газу.
- Relayer отримує підписане повідомлення та верифікує підпис.
- Relayer обирає найдешевший маршрут (за газом) та оплачує комісію на вихідному ланцюзі.
- Для cross-chain: relayer використовує протокол (наприклад, Axelar) для передачі повідомлення на цільовий ланцюг, оплачуючи там газ.
- На цільовому ланцюзі виконується цільова функція (наприклад, своп); paymaster списує вартість газу з балансу relayer або користувача.
- Результат повертається користувачеві.
Чому ERC-4337 — основа для gasless cross-chain транзакцій?
Без ERC-4337 кожна gasless схема — кастомний костиль. З ERC-4337 — стандартизований framework. Згідно з EIP-4337: Account Abstraction using Entry Point Contract, це офіційний стандарт account abstraction. ERC-4337 кращий за кастомні схеми в 10 разів за швидкістю аудиту безпеки.
// UserOperation — стандартна одиниця gasless транзакції
interface UserOperation {
sender: string; // smart account адреса
nonce: bigint;
initCode: string; // для деплою акаунту якщо не існує
callData: string; // що виконати
callGasLimit: bigint;
verificationGasLimit: bigint;
preVerificationGas: bigint;
maxFeePerGas: bigint;
maxPriorityFeePerGas: bigint;
paymasterAndData: string; // paymaster адреса + дані
signature: string;
}
Реалізація Paymaster
Paymaster — смарт-контракт, який вирішує «хто платить газ». Ми використовуємо Chainlink price feed для точного розрахунку вартості газу в стейблкоїнах. Ось приклад контракту ERC-20 Paymaster:
contract ERC20Paymaster is BasePaymaster {
address public acceptedToken; // наприклад USDC
AggregatorV3Interface public priceFeed; // Chainlink price feed
function _validatePaymasterUserOp(
UserOperation calldata userOp,
bytes32 userOpHash,
uint256 maxCost // максимальний газ в ETH
) internal override returns (bytes memory context, uint256 validationData) {
// Розраховуємо скільки USDC потрібно за maxCost газу
uint256 tokenAmount = _calculateTokenAmount(maxCost);
// Додаємо 10% буфер на випадок зростання gas price
tokenAmount = tokenAmount * 110 / 100;
// Перевіряємо, що користувач схвалив достатньо токенів
require(
IERC20(acceptedToken).allowance(userOp.sender, address(this)) >= tokenAmount,
"Insufficient token allowance"
);
// Зберігаємо в context для postOp
return (abi.encode(userOp.sender, tokenAmount), 0);
}
function _postOp(
PostOpMode mode,
bytes calldata context,
uint256 actualGasCost // реальний газ в ETH
) internal override {
(address sender, uint256 maxTokenAmount) = abi.decode(context, (address, uint256));
// Розраховуємо реальну вартість в токенах
uint256 actualTokenAmount = _calculateTokenAmount(actualGasCost);
// Списуємо з користувача реальну суму (не максимальну)
IERC20(acceptedToken).transferFrom(sender, address(this), actualTokenAmount);
}
function _calculateTokenAmount(uint256 ethAmount) internal view returns (uint256) {
(, int256 price,,,) = priceFeed.latestRoundData(); // ETH/USDC price
return (ethAmount * uint256(price)) / 1e18;
}
}
Cross-chain gas relay
Газ на вихідному ланцюзі — це перша половина. Друга: хто платить газ на цільовому ланцюзі для виконання cross-chain повідомлення? Кілька підходів.
Axelar Gas Service
При відправці повідомлення через Axelar — оплачуємо газ для цільового ланцюга заздалегідь, у нативному токені вихідного ланцюга:
function sendGaslessMessage(
string calldata destChain,
string calldata destContract,
bytes calldata payload
) external payable {
// msg.value = газ для цільового ланцюга (в ETH/MATIC/etc вихідного ланцюга)
// Axelar Gas Service конвертує та оплачує газ на цільовому ланцюзі
gasService.payNativeGasForContractCall{value: msg.value}(
address(this), destChain, destContract, payload, msg.sender
);
gateway.callContract(destChain, destContract, payload);
}
Relayer мережа з власними нодами
Для повністю кастомної системи — власна мережа relayer нод:
class CrossChainRelayer {
// Баланси на всіх ланцюгах
private chainWallets: Map<number, Wallet> = new Map();
async relayMessage(
sourceChain: number,
destChain: number,
contractAddress: string,
calldata: string,
userSignature: string
): Promise<string> {
// Верифікуємо підпис користувача
const isValid = await this.verifyUserSignature(userSignature, calldata);
if (!isValid) throw new Error("Invalid signature");
// Отримуємо гаманець для цільового ланцюга
const destWallet = this.chainWallets.get(destChain);
if (!destWallet) throw new Error("Chain not supported");
// Перевіряємо баланс
const balance = await destWallet.provider!.getBalance(destWallet.address);
const gasEstimate = await destWallet.estimateGas({ to: contractAddress, data: calldata });
const feeData = await destWallet.provider!.getFeeData();
const gasCost = gasEstimate * feeData.maxFeePerGas!;
if (balance < gasCost * 2n) {
// Потрібне поповнення балансу relayer
await this.topUpBalance(destChain);
}
// Відправляємо транзакцію від імені relayer
const tx = await destWallet.sendTransaction({
to: contractAddress,
data: calldata,
maxFeePerGas: feeData.maxFeePerGas,
maxPriorityFeePerGas: feeData.maxPriorityFeePerGas,
});
// Списуємо з користувача в нашій системі (або через Paymaster)
await this.chargeUser(userSignature, gasCost);
return tx.hash;
}
}
| Характеристика | Axelar Gas Service | Relayer мережа |
|---|---|---|
| Контроль над газом | Автоматичний | Повний |
| Підтримувані ланцюги | 50+ | Будь-які |
| Надійність | Перевірений провайдер | Залежить від інфраструктури |
Permit2 для gasless approvals
Традиційний approve вимагає окремої транзакції (gas). З Permit2 (Uniswap) користувач підписує дозвіл off-chain:
const permit = {
permitted: { token: USDC_ADDRESS, amount: parseUnits("100", 6) },
spender: RELAYER_ADDRESS,
nonce: await getPermitNonce(userAddress),
deadline: Math.floor(Date.now() / 1000) + 3600,
};
const signature = await signer._signTypedData(
{ name: "Permit2", chainId: 1, verifyingContract: PERMIT2_ADDRESS },
PERMIT2_TYPES,
permit
);
// Relayer використовує підпис для transferFrom без окремого approve
await permit2Contract.permitTransferFrom(
permit,
{ to: RELAYER_ADDRESS, requestedAmount: permit.permitted.amount },
userAddress,
signature
);
Хто платить за газ?
| Модель | Хто платить | Коли підходить |
|---|---|---|
| Sponsored (freemium) | Додаток | Onboarding, gaming, loyalty |
| ERC-20 paymaster | Користувач у stablecoin | DeFi, trading |
| Solver extracts surplus | Solver з арбітражу | Intent-based протоколи |
| Fee token swap | Система конвертує fee token | Загальний випадок |
Роз'яснення моделей:
- Sponsored: додаток оплачує газ, щоб залучити користувачів.
- ERC-20 paymaster: користувач платить у стейблкоїнах за поточним курсом.
- Solver: арбітражери покривають газ в обмін на частку прибутку.
- Fee token swap: система автоматично конвертує будь-який токен користувача в нативний токен для газу.
Наша пропозиція
Що входить
- Архітектурна документація
- Смарт-контракти (Solidity) з повним покриттям тестами
- Інтеграція Paymaster та Relayer
- Налаштування моніторингу Tenderly
- Навчання команди та код-рев'ю
- Гарантія проходження security-аудиту
Стек
Smart contracts: Solidity + ERC-4337 + Permit2 + Foundry Bundler: Pimlico, StackUp, Alchemy (hosted) або Alto (self-hosted) Paymaster: кастомний ERC20Paymaster + Pimlico sponsored Cross-chain: Axelar Gas Service або LayerZero з adapterParams Relayer: Node.js + TypeScript + viem Frontend: wagmi v2 + permissionless.js
Терміни
- Gasless на одному ланцюзі (ERC-4337 + ERC-20 Paymaster): 3-4 тижні
- Cross-chain gas relay (Axelar/LayerZero інтеграція): +3-4 тижні
- Intent solver (profitable solving + routing): +4-6 тижнів
- Production + моніторинг + security audit: +4-6 тижнів
- Разом повна система: 3-4 місяці
Пропонуємо розробку gasless систем під ключ — від архітектури до аудиту. Наші клієнти економлять до 60% на газових витратах, а середня економія становить 40-60%. Замовте впровадження gasless системи та отримайте персональну оцінку термінів і вартості. Пишіть нам — ми оцінимо ваш проєкт безкоштовно та запропонуємо оптимальний стек.
Наші фахівці мають понад 10 років досвіду та реалізували 40+ проєктів.







