인텐트와 솔버 정산 모델
도입
Intent는 사용자가 실행 방법이 아니라 원하는 결과를 서명하는 방식이다. "Base에서 merchant에게 100 USDC를 지급하고 싶다"는 결과와 제약 조건을 표현하면 solver가 route, bridge, swap, gas를 선택할 수 있다. UX는 단순해지지만 위험이 사라지는 것은 아니다. 위험은 solver 선택, deadline, refund, settlement proof로 이동한다.
ERC-7683 같은 cross-chain intent 표준화 논의는 중요한 학습 재료지만, 강의에서는 status를 항상 확인해야 한다. 표준이 draft라면 "이미 확정된 표준"이라고 쓰지 않는다. 대신 mechanism을 배우고, adoption이나 volume은 날짜와 출처를 붙이는 대상으로 둔다.
학습 목표
- intent를 사용자가 원하는 결과와 제약 조건을 서명한 주문으로 설명한다.
- solver, filler, escrow, deadline, replay protection이 settlement risk를 어떻게 나누는지 이해한다.
- ERC-7683을 확정 표준이 아니라 draft mechanism으로 보수적으로 다룬다.
개념 설명
SignedIntent
전이 조건을 확인한다.
Filled
전이 조건을 확인한다.
ProofSubmitted
전이 조건을 확인한다.
Settled
전이 조건을 확인한다.
Refunded
전이 조건을 확인한다.
| Actor | 역할 | 실패 상태 |
|---|---|---|
| User | 결과와 제약 조건 서명 | deadline, replay, wrong output |
| Solver | 실행 route 선택 | underfill, delayed fill |
| Escrow | origin funds 보관 | proof validation failure |
| Resolver | settlement 증거 확인 | dispute or stale proof |
코드로 확인하기
export type IntentOrder = { maker: `0x${string}`; inputToken: `0x${string}`; outputToken: `0x${string}`; amountIn: bigint; minAmountOut: bigint; destinationChainId: number; receiver: `0x${string}`; deadline: number; nonce: `0x${string}`;};export function validateIntent(order: IntentOrder, now: number) { if (now > order.deadline) throw new Error("intent expired"); if (order.minAmountOut <= 0n) throw new Error("missing output constraint"); if (order.destinationChainId <= 0) throw new Error("invalid destination"); return { ok: true, settlementKey: `${order.maker}:${order.nonce}` };}코드는 intent를 swap instruction이 아니라 settlement contract가 검증할 수 있는 typed data로 본다. 실제 구현에서는 EIP-712 domain, chain binding, permit, escrow, proof verification이 추가된다.
강의 포인트
| 관점 | 확인할 질문 | 증거로 남길 것 |
|---|---|---|
| Constraint | 사용자가 최소 결과와 deadline을 정했는가 | order fields |
| Solver | 누가 execution risk를 맡는가 | solver registry and quote |
| Settlement | fill proof가 어떻게 검증되는가 | receipt and proof |
| Refund | 실패 시 사용자가 빠져나오는가 | timeout path |
실무 예시
백엔드[CONTRACT] cross-chain checkout에서 사용자는 "어느 bridge를 쓸지"를 모를 수 있다. intent model은 이 복잡성을 solver에게 넘긴다. 그러나 solver가 destination에서 merchant에게 먼저 지급하고 origin settlement가 실패하면 누가 손실을 부담하는지 정해야 한다.
좋은 product state는 "결제 중" 하나가 아니다. Signed, Filled, ProofSubmitted, Settled, Refunded가 분리되어야 support와 reconciliation이 같은 증거를 볼 수 있다.
흔한 오해와 실패 시나리오
| 오해 | 실패 시나리오 | 교정 방식 |
|---|---|---|
| intent는 UX 기능이다 | settlement와 refund risk가 숨어 있다 | 상태머신을 명시한다 |
| solver가 알아서 최적 route를 찾는다 | solver trust와 competition이 필요하다 | registry와 quote evidence를 둔다 |
| deadline만 있으면 안전하다 | replay와 chain binding이 남는다 | nonce와 domain separation을 넣는다 |
| draft EIP는 확정 표준이다 | adoption status를 과장한다 | status와 날짜를 표시한다 |
실습 과제
- Intent order 타입 정의하기: maker, inputToken, outputToken, minAmountOut, destination, deadline, nonce를 가진 typed order를 정의한다.
- Solver 실패 상태표 만들기: fill, timeout, refund, dispute, settlement failure 상태와 사용자 문구를 작성한다.
완료 기준
- intent order의 maker, input, output, deadline, nonce, settlement proof 필드를 정의했다.
- solver가 destination에서 먼저 지급하고 origin에서 나중에 정산받는 실패 상태를 작성했다.
근거 자료
- 08 Trends 2026
- ERC-7683
- UniswapX Overview