Cross-chain Intents와 ERC-7683
도입
cross-chain intent는 사용자가 "어느 bridge를 눌러야 하는가"를 직접 고르는 방식에서 벗어나, 원하는 결과를 주문으로 표현하고 solver가 여러 chain의 실행과 정산을 맡는 모델이다. 예를 들어 사용자는 "Ethereum의 USDC를 써서 Base의 merchant에게 100 USDC를 지급"이라는 결과만 승인하고, solver가 destination 지급과 source 정산을 연결할 수 있다.
이 모델은 UX를 단순하게 만들지만 위험을 없애지는 않는다. bridge 선택 위험이 solver 선택, resolver 신뢰, payment 조건, timeout/refund, settlement dispute로 이동한다. 이 강의에서는 intent를 "마법 같은 사용자 경험"이 아니라 새로운 리스크 분배 방식으로 읽는다.
학습 목표
- transaction 직접 실행과 intent/order 기반 실행의 차이를 설명한다.
- ERC-7683의 order, solver, payload, resolver 개념을 checkout 설계에 연결한다.
- solver가 destination에서 지급했지만 origin settlement가 실패하는 시나리오를 다룬다.
- resolver vetting, assumption validation, timeout/refund 정책을 만든다.
개념 설명
Cross-chain Intents와 ERC-7683을 제품 설계에 넣어도 되는가?
finality와 attestation 조건이 명확한가
route별 trust assumption이 분리되는가
timeout/refund가 설계되는가
1. Intent는 실행 방법이 아니라 원하는 결과를 표현한다
| 방식 | 사용자가 하는 일 | 실행 책임 | 실패가 드러나는 위치 |
|---|---|---|---|
| 직접 transaction | 특정 chain, contract, calldata를 직접 승인 | 사용자 wallet과 app | transaction revert, gas 부족 |
| Bridge/CCTP flow | source transfer/burn과 destination receive를 진행 | bridge/CCTP integrator | attestation, mint, destination tx |
| Intent/order | 원하는 결과와 조건을 서명하거나 제출 | solver/filler와 settler | fill 실패, settlement dispute, timeout |
intent 모델은 사용자의 행동을 줄인다. 대신 제품은 solver가 실제로 무엇을 했는지, 어떤 조건에서 결제가 완료되는지, solver가 손실을 감수하는 구간이 어디인지 기록해야 한다.
2. ERC-7683은 solver-facing interface를 표준화하려는 draft ERC다
2026년 5월 14일 확인 기준 ERC-7683은 draft 상태다. 이 ERC는 intent protocol 자체를 하나로 통일하기보다, solver가 protocol-specific payload를 공통 order representation으로 해석할 수 있게 resolver를 중심에 둔다.
| 용어 | 강의에서의 의미 | 검수 질문 |
|---|---|---|
| Order | 사용자가 원하는 결과와 지급 조건 | 어떤 token, chain, recipient, deadline을 포함하는가 |
| Solver/Filler | order 요구사항을 실행하고 보상을 받는 actor | 어떤 자본과 권한으로 destination 지급을 하는가 |
| Payload | protocol-specific order encoding | app이 저장하고 재현할 수 있는가 |
| Resolver | payload를 solver가 읽을 수 있는 order로 변환/검증 | resolver address를 누가 검수하고 whitelist하는가 |
| Assumption | resolver가 자체 검증하지 못해 solver가 확인해야 하는 조건 | chain liveness, token behavior, oracle, bridge assumption이 명시되는가 |
draft 표준을 production SLA의 근거로 쓰면 안 된다. 표준화 방향을 이해하되, 실제 채택은 구현체, audit, resolver whitelist, solver market, monitoring을 따로 본다.
3. Intent 결제 시퀀스
제품 DB는 최소한 OrderCreated, Resolved, DestinationFilled, FillProofObserved, OriginSettled, TimedOut, Refunded, Disputed를 분리해야 한다. 사용자에게는 "결제 완료"로 보이더라도 solver settlement가 뒤에서 실패할 수 있기 때문이다.
4. CCTP, bridge, intent의 차이
| 모델 | 핵심 | 좋은 경우 | 조심할 위험 |
|---|---|---|---|
| CCTP | USDC burn/mint와 attestation | native USDC 이동 | attestation 지연, domain support, fee/finality 선택 |
| Bridge | lock/mint 또는 liquidity route | 다양한 asset 이동 | bridge exploit, wrapped asset, liquidity route 실패 |
| Intent | 결과를 order로 표현하고 solver가 실행 | UX 추상화, route competition, solver liquidity | resolver trust, solver default, fill proof, settlement dispute |
intent는 CCTP나 bridge를 대체하는 단일 기술이 아니다. solver가 내부적으로 CCTP, bridge, DEX, inventory를 조합할 수 있다. 따라서 app은 "어떤 route를 썼는가"보다 "사용자에게 약속한 결과가 증명되었는가"를 기준으로 상태를 관리해야 한다.
코드로 확인하기
위 신뢰 모델을 코드와 운영 규칙으로 확인한다. 메시지 상태, 최종성, 재시도, 관측 지점이 어디서 분리되는지 보는 것이 목적이다.
컨트랙트ERC-7683 GaslessCrossChainOrder 구조와 IOriginSettler
ERC-7683은 cross-chain order의 직렬화·서명·resolve를 표준화한다. 핵심은 사용자가 서명한 order를 resolver가 해석해 fill 가능한 형태로 풀고, settler가 사용자 자금을 escrow한 뒤 solver가 destination을 채우는 흐름이다.
struct GaslessCrossChainOrder { address originSettler; address user; uint256 nonce; uint256 originChainId; uint32 openDeadline; uint32 fillDeadline; bytes32 orderDataType; bytes orderData; // resolver-specific payload}struct ResolvedCrossChainOrder { address user; uint256 originChainId; uint32 openDeadline; uint32 fillDeadline; bytes32 orderId; Output[] maxSpent; // 사용자가 지출 가능한 최대 Output[] minReceived; // 사용자가 받아야 할 최소 FillInstruction[] fillInstructions;}interface IOriginSettler { function openFor(GaslessCrossChainOrder calldata order, bytes calldata signature, bytes calldata originFillerData) external; function resolveFor(GaslessCrossChainOrder calldata order, bytes calldata originFillerData) external view returns (ResolvedCrossChainOrder memory);}백엔드Resolver vetting — order 의 minReceived 가드
resolver가 반환한
minReceived가 사용자 의도와 일치하는지 검증. 잘못된 resolver를 신뢰하면 자금이 잘못된 곳으로 흐를 수 있다.
type UserIntent = { fromChainId: number; toChainId: number; tokenIn: `0x${string}`; amountIn: bigint; tokenOut: `0x${string}`; minOut: bigint; recipient: `0x${string}`; fillDeadline: number;};export function verifyResolvedOrder(intent: UserIntent, resolved: any): { ok: boolean; reason?: string } { const minOnDest = resolved.minReceived.find( (o: any) => o.chainId === intent.toChainId && o.token.toLowerCase() === intent.tokenOut.toLowerCase() ); if (!minOnDest) return { ok: false, reason: "no output on intended destination" }; if (BigInt(minOnDest.amount) < intent.minOut) { return { ok: false, reason: `min received ${minOnDest.amount} < user expected ${intent.minOut}` }; } if (minOnDest.recipient.toLowerCase() !== intent.recipient.toLowerCase()) { return { ok: false, reason: "recipient mismatch" }; } if (resolved.fillDeadline < intent.fillDeadline) { return { ok: false, reason: "deadline tighter than requested" }; } return { ok: true };}백엔드Intent payment 상태머신 — solver default 까지 표현
결제 상태는 escrow 잡힘부터 fill verification, settle 완료, 그리고 solver default 처리까지 분리한다.
type IntentStatus = | "Opened" // origin settler 가 사용자 자금 escrow | "FillPending" // solver 가 destination 채우는 중 | "Filled" // destination 출고 확인 | "Settled" // origin escrow 가 solver 에게 정산 | "Expired" // fillDeadline 경과, solver 미실행 | "Refunded" // 사용자에게 자금 반환 완료 | "Disputed"; // fill claim 과 실제 destination 상태가 불일치const ALLOWED: Record<IntentStatus, IntentStatus[]> = { Opened: ["FillPending", "Expired"], FillPending: ["Filled", "Expired", "Disputed"], Filled: ["Settled", "Disputed"], Settled: [], Expired: ["Refunded"], Refunded: [], Disputed: ["Settled", "Refunded"]};export function assertIntentTransition(from: IntentStatus, to: IntentStatus) { if (!ALLOWED[from].includes(to)) throw new Error(`Forbidden ${from} -> ${to}`);}강의 포인트
| 관점 | 수업 중 확인할 질문 | 산출물 |
|---|---|---|
| order | 사용자가 서명한 결과와 조건이 충분히 명확한가 | order schema |
| resolver | 누가 payload를 해석하고 어떤 assumption을 남기는가 | resolver vetting policy |
| solver | solver 실패가 사용자, merchant, app, solver 중 누구에게 귀속되는가 | risk allocation table |
| settlement | destination fill과 origin settlement가 언제 닫히는가 | intent payment state machine |
| timeout | deadline 이후 refund/cancel/dispute가 가능한가 | timeout/refund runbook |
실무 예시
백엔드[CONTRACT] USDC checkout intent 상태머신
| 상태 | 의미 | 완료 조건 | 실패 처리 |
|---|---|---|---|
OrderCreated | 사용자 intent/order 생성 | payload와 payment ID 저장 | malformed order reject |
Resolved | resolver가 steps/payments/assumptions 반환 | resolver whitelist와 simulation 통과 | resolver mismatch |
DestinationPaid | solver가 merchant에게 destination USDC 지급 | destination transfer event 확인 | wrong recipient dispute |
OriginClaimed | solver가 source settlement 청구 | proof/claim tx 확인 | claim revert |
Settled | solver 지급과 merchant ledger가 모두 닫힘 | source/destination ledger reconciliation | none |
TimedOut | deadline 초과 | timeout clock과 no fill proof | refund/cancel |
Disputed | fill proof나 recipient가 불일치 | operator review | manual settlement/refund |
Solver 위험 분배표
| 위험 | 누가 먼저 손실을 보나 | 제품에서 필요한 장치 |
|---|---|---|
| destination paid, origin settlement 실패 | solver | claim proof, retry, dispute window |
| solver가 잘못된 recipient에게 지급 | solver 또는 app | recipient binding, payment ID, receiver validation |
| order price가 실행 중 불리해짐 | solver 또는 user | slippage bound, deadline, quote expiration |
| resolver가 잘못된 order를 반환 | solver/app | resolver audit, whitelist, assumption validation |
| chain liveness 문제 | user/app/solver 모두 | route disable, timeout, refund copy |
흔한 오해와 실패 시나리오
| 오해 | 실제 기준 |
|---|---|
| intent는 bridge UX를 자동으로 안전하게 만든다 | route 위험이 solver/resolver/settlement 위험으로 이동한다 |
| ERC-7683이면 구현체가 모두 호환된다 | draft ERC이며 resolver와 protocol-specific payload 검수가 필요하다 |
| solver가 destination 지급을 했으면 결제가 끝난다 | origin settlement와 dispute window까지 닫아야 한다 |
| resolver가 onchain이면 자동으로 신뢰 가능하다 | resolver는 trust point이므로 audit, whitelist, monitoring이 필요하다 |
| timeout은 실패 처리만 있으면 된다 | refund, cancel, partial fill, support copy를 product state로 설계해야 한다 |
실습 과제
- 컨트랙트Intent order risk sheet 작성: order payload, resolver, solver, payment, deadline, revert policy, assumption, refund/cancel 조건을 표로 정리한다.
- 백엔드USDC checkout intent 상태머신 설계: source order opened, destination paid, proof observed, origin settled, timeout, refund, dispute 상태를 포함한 USDC checkout intent 상태머신을 작성한다.
- 운영Resolver vetting policy 만들기: 어떤 resolver를 solver/app이 신뢰할 수 있는지 audit, address allowlist, assumption validation, simulation, monitoring 기준을 정한다.
완료 기준
- transaction, CCTP/bridge flow, intent/order execution의 차이를 설명했다.
- ERC-7683의 order, solver, payload, resolver, assumption 개념을 checkout 설계에 연결했다.
- solver 실패와 settlement dispute의 책임 분배를 표로 만들었다.
- timeout/refund/dispute 상태를 포함한 payment state machine을 작성했다.
근거 자료
- Cross chain Intents ERC7683: 03-크로스체인-L2/06-Cross-chain-Intents-ERC7683.md
- ERC-7683: Cross Chain Intents: https://eips.ethereum.org/EIPS/eip-7683
- ERC-7683 FAQ: https://www.erc7683.org/faq
- ERC-4337: https://eips.ethereum.org/EIPS/eip-4337
- EIP-7702: https://eips.ethereum.org/EIPS/eip-7702