Система об'єднаних рахунків крос-чейн
Об'єднані рахунки — користувач має один ідентифікатор та один "логічний" баланс, що автоматично використовується на будь-якому чейні. Еволюція від "мультичейн" (багато гаманців) до chain-abstracted (один гаманець, прозора мультичейн). Нетривіально реалізувати правильно: вирішити кілька незалежних проблем одночасно.
Технічний рівень
Наївна: той же адрес на кожному чейні via CREATE2, синхронізація стану через bridge. Працює але створює складність — фрагментований стан, затримка синхронізації та вартість.
Продвинута розділяє:
- Identity layer — хто ви (один ідентифікатор усіх чейнів)
- Intent layer — що ви хочете (абстраговано від конкретного чейна)
- Execution layer — як це виконується (маршрутизація, bridging, виконання)
- Settlement layer — остаточний розрахунок
Детермінhuvані адреси via CREATE2
Перший крок — той же адрес усіх EVM чейнів:
// Factory з тим же адресом на всіх чейнах
contract AccountFactory {
function deployAccount(
bytes32 salt,
bytes calldata initCode
) external returns (address account) {
// CREATE2: адрес залежить тільки від factory + salt + initCode
// Та сама factory на всіх EVM → той же Account адрес
assembly {
account := create2(0, add(initCode, 32), mload(initCode), salt)
}
}
function predictAddress(
bytes32 salt,
bytes32 initCodeHash
) external view returns (address) {
return address(uint160(uint256(keccak256(abi.encodePacked(
bytes1(0xff),
address(this),
salt,
initCodeHash
)))));
}
}
Keyless deployment через ERC-2470 Singleton Factory забезпечує той же factory адрес на всіх EVM. Той же salt + initCode = той же account адрес.
Крос-чейн синхронізація стану
Другий крок — синхронізація даних рахунку між чейнами. Паттерн: Primary chain + синхронізація via bridge.
contract UnifiedAccountPrimary {
mapping(address => bool) public owners;
uint256 public nonce;
function addOwnerAndSync(
address newOwner,
uint64[] calldata targetChains,
address[] calldata targetAccounts
) external onlyOwner {
owners[newOwner] = true;
for (uint i = 0; i < targetChains.length; i++) {
bytes memory payload = abi.encode(
"ADD_OWNER",
newOwner,
++nonce
);
bridge.sendMessage(targetChains[i], targetAccounts[i], payload);
}
emit OwnerAdded(newOwner);
}
}
contract UnifiedAccountReplica {
uint256 public lastSyncedNonce;
function receiveSync(
bytes calldata payload,
bytes32 originMessageId
) external onlyBridge {
(string memory action, address target, uint256 nonce) =
abi.decode(payload, (string, address, uint256));
require(nonce == lastSyncedNonce + 1, "Invalid nonce");
lastSyncedNonce = nonce;
if (keccak256(bytes(action)) == keccak256(bytes("ADD_OWNER"))) {
_addOwner(target);
}
}
}
Intent-based виконання
User intent (stake, swap, transfer) абстраговано від чейна. Система маршрутизує та виконує:
interface UserIntent {
action: "stake" | "swap" | "transfer" | "borrow";
targetProtocol: string;
targetChain?: number;
inputToken: string;
inputAmount: string;
minOutputAmount?: string;
}
class IntentRouter {
async resolveIntent(intent: UserIntent, userProfile: UserProfile): Promise<ExecutionPlan> {
const targetChain = intent.targetChain ||
await this.findOptimalChain(intent, userProfile);
const fundingSource = await this.findBestFundingSource(
intent.inputToken,
intent.inputAmount,
userProfile.balances,
targetChain
);
const steps: ExecutionStep[] = [];
if (fundingSource.chainId !== targetChain) {
steps.push({
type: "bridge",
fromChain: fundingSource.chainId,
toChain: targetChain,
token: intent.inputToken,
amount: intent.inputAmount,
});
}
steps.push({
type: intent.action,
chainId: targetChain,
protocol: intent.targetProtocol,
});
return { steps };
}
}
Stack
| Компонент | Рішення |
|---|---|
| Smart accounts | ERC-4337 (ZeroDev Kernel або Safe) |
| Крос-чейн мессенджинг | LayerZero / Axelar / CCIP |
| Gas абстракція | ERC-4337 Paymaster |
| Intent маршрутизація | Кастомний сервіс + 1inch/LiFi |
| State синхронізація | Merkle proofs + bridge |
| Frontend | wagmi v2 + viem + React |
Таймлайни
- Базова identity (CREATE2 адреси, базова синхронізація): 4-6 тижнів
- Intent маршрутизація + крос-чейн виконання: 6-8 тижнів
- Gas абстракція + fee токен: 3-4 тижні
- Аудит безпеки: 6-8 тижнів
- Всього: 4-6 місяців







