Gasless крос-чейн транзакції
Gasless вирішує головний Web3 бар'єр: користувачам потрібні native токени на кожному чейні для оплати газу. Хочете Arbitrum? Потрібен ETH на Arbitrum. Хочете Base? Потрібен ETH на Base. Погана UX. Gasless кросс-чейн йде далі: користувач не думає про газ І не думає про те, на якому чейні знаходиться.
Компоненти
Layer 1: Meta-транзакції / ERC-4337. Хто платить газ на вихідному чейні.
Layer 2: Paymaster. Спонсор, що покриває газ або приймає ERC-20 оплату.
Layer 3: Крос-чейн relayer. Хто передає повідомлення і платить газ на цільовому.
Layer 4: Solver/intent executor. Знаходить оптимальний маршрут виконання.
ERC-4337 як фундамент
Без ERC-4337 кожна gasless схема — кастомний костиль. З ERC-4337 — стандартизований framework:
interface UserOperation {
sender: string;
nonce: bigint;
initCode: string;
callData: string;
callGasLimit: bigint;
verificationGasLimit: bigint;
preVerificationGas: bigint;
maxFeePerGas: bigint;
maxPriorityFeePerGas: bigint;
paymasterAndData: string;
signature: string;
}
Bundler збирає UserOperations, упаковує в транзакцію, відправляє on-chain. Bundler платить газ та отримує відшкодування від paymaster або рахунку користувача.
Реалізація Paymaster
Paymaster вирішує "хто платить газ":
contract ERC20Paymaster is BasePaymaster {
address public acceptedToken;
AggregatorV3Interface public priceFeed;
function _validatePaymasterUserOp(
UserOperation calldata userOp,
bytes32 userOpHash,
uint256 maxCost
) internal override returns (bytes memory context, uint256 validationData) {
uint256 tokenAmount = _calculateTokenAmount(maxCost);
tokenAmount = tokenAmount * 110 / 100; // 10% буфер
require(
IERC20(acceptedToken).allowance(userOp.sender, address(this)) >= tokenAmount,
"Insufficient token allowance"
);
return (abi.encode(userOp.sender, tokenAmount), 0);
}
function _postOp(
PostOpMode mode,
bytes calldata context,
uint256 actualGasCost
) internal override {
(address sender, uint256 maxTokenAmount) = abi.decode(context, (address, uint256));
uint256 actualTokenAmount = _calculateTokenAmount(actualGasCost);
IERC20(acceptedToken).transferFrom(sender, address(this), actualTokenAmount);
}
}
Крос-чейн gas relay
Хто платить газ на цільовому?
Axelar Gas Service: передоплатити газ для цільового в native токені на вихідному:
function sendGaslessMessage(
string calldata destChain,
string calldata destContract,
bytes calldata payload
) external payable {
gasService.payNativeGasForContractCall{value: msg.value}(
address(this), destChain, destContract, payload, msg.sender
);
gateway.callContract(destChain, destContract, payload);
}
LayerZero з gas drop: airdrop нативний газ на адресу цільового:
function sendWithGasDrop(
uint16 dstChainId,
bytes calldata payload,
address payable refundAddress,
address zroPaymentAddress,
uint256 dstNativeAmount,
address dstNativeAddress
) external payable {
bytes memory adapterParams = abi.encodePacked(
uint16(2),
uint256(200000),
dstNativeAmount,
dstNativeAddress
);
lzEndpoint.send{value: msg.value}(
dstChainId,
abi.encode(destContract),
payload,
refundAddress,
zroPaymentAddress,
adapterParams
);
}
Кастомна relayer мережа: власні relayer ноди, що тримають balances native токенів на всіх чейнах.
Intent-based gasless
Найбільш продвинута: користувач підписує намір, solver виконує і отримує прибуток від арбітражу:
interface GaslessIntent {
user: string;
sourceChain: number;
destChain: number;
action: string;
inputToken: string;
inputAmount: string;
minOutputAmount: string;
deadline: number;
signature: string;
}
class IntentSolver {
async solve(intent: GaslessIntent): Promise<void> {
const route = await this.findOptimalRoute(intent);
const expectedOutput = await this.simulate(route, intent);
const gasCosts = await this.estimateTotalGasCosts(route);
const profit = expectedOutput - BigInt(intent.minOutputAmount) - gasCosts;
if (profit < this.minProfitThreshold) return;
await this.executeRoute(route, intent);
}
}
Permit2 для gasless approvals
Традиційний approve вимагає окремої транзакції (газ). З Permit2 (Uniswap):
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
);
await permit2Contract.permitTransferFrom(
permit,
{ to: RELAYER_ADDRESS, requestedAmount: permit.permitted.amount },
userAddress,
signature
);
Економіка
Хто платить в результаті?
| Модель | Платник | Коли |
|---|---|---|
| Sponsored (freemium) | Додаток | Onboarding, ігри, лояльність |
| ERC-20 paymaster | Користувач в stablecoin | DeFi, trading |
| Solver extracts surplus | Solver з арбітражу | Intent-based протоколи |
| Fee token swap | Система конвертує | Загальний випадок |
Stack
Смарт-контракти: Solidity + ERC-4337 + Permit2 + Foundry. Bundler: Pimlico, StackUp, Alchemy або Alto. Paymaster: кастомний ERC20Paymaster. Крос-чейн: Axelar Gas Service або LayerZero. Relayer: Node.js + viem. Frontend: wagmi v2 + permissionless.js.
Таймлайни
- Gasless один чейн (ERC-4337 + paymaster): 3-4 тижні
- Крос-чейн gas relay (Axelar/LayerZero): +3-4 тижні
- Intent solver: +4-6 тижнів
- Production + моніторинг + аудит: +4-6 тижнів
- Всього: 3-4 місяці







