Розробка системи 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+ проєктів.







