교육 목적으로만 제공되며, 투자 자문이나 투자 추천이 아닙니다. 투자로 인해 손실이 발생할 수 있습니다.
핵심 답변
DEX 스왑에 서명하기 전에 체인, 대상 컨트랙트, 디코딩된 함수, 토큰 주소, 입력 또는 출력 한도, 경로, 수취인, 마감 시간을 확인해야 합니다. 프런트엔드에 표시되는 “슬리피지” 비율 자체는 온체인 명령이 아닙니다. 일반적으로 exact-input 스왑의 amountOutMin 또는 amountOutMinimum, exact-output 스왑의 amountInMax 또는 amountInMaximum 같은 한도를 계산하는 데 사용됩니다.
마감 시간은 시간 제한이지 가격 보장이 아닙니다. 라우터가 마감 시간을 검사하고 그 이후에 트랜잭션이 실행되면 호출은 되돌려져야 합니다. 그러나 마감 전에는 금액 한도가 허용하는 어떤 가격으로도 체결될 수 있습니다. 마감 시간이 길수록 해당 승인이 더 오래 유효하고, 너무 짧으면 블록 포함 전에 만료될 가능성이 커집니다.
Calldata는 자기 서술형 데이터가 아닙니다. 선택한 체인의 정확한 컨트랙트에 대해 검증된 ABI로 디코딩하고 중첩된 multicall 또는 Universal Router 명령도 모두 펼쳐야 합니다. 지갑이 신뢰할 수 있는 디코딩 필드를 보여주지 못한다면 바이트 위치나 함수 이름 데이터베이스만으로 의미를 추측하지 마십시오.
작동 방식
실제 호출 디코딩
Solidity ABI에서 calldata의 첫 4 bytes는 함수 셀렉터이고 인코딩된 인수는 다섯 번째 바이트부터 시작합니다. 셀렉터는 충돌하거나 잘못 표시될 수 있으므로 검증된 대상 컨트랙트의 ABI와 대조해야 합니다. 프록시, 애그리게이터 또는 라우터는 스왑을 multicall, execute 또는 다른 함수 안에 감쌀 수 있습니다. 토큰을 전송하거나 최종 수취인을 바꿀 수 있는 모든 중첩 페이로드를 디코딩하십시오.
exact-input 스왑은 입력이 고정되고 보호 필드가 허용 가능한 최소 출력을 정합니다. exact-output 스왑은 원하는 출력이 고정되고 보호 필드가 입력 상한을 정합니다. 한도가 영이거나 예상보다 지나치게 느슨하면 실질적인 가격 보호가 사라질 수 있습니다. 토큰 소수 자릿수도 중요합니다. 원시 정수 금액을 비교하기 전에 각 토큰 주소를 정확한 소수 자릿수와 기호에 연결해야 합니다.
경로, 수취인, value 확인
경로가 지출할 토큰으로 시작해 받을 토큰으로 끝나는지 확인하십시오. 중간 토큰, 풀 수수료, 잔액을 래핑·언래핑·회수·전송하는 명령도 살펴보십시오. 수취인은 의도한 지갑이거나 동작을 이해하고 있는 컨트랙트여야 합니다. 트랜잭션의 네이티브 value도 확인해야 합니다. 이는 calldata에 인코딩된 ERC-20 금액과 별개일 수 있습니다.
마감 시간 위치 확인
마감 시간의 위치는 라우터 버전에 따라 다릅니다. Uniswap V2 방식의 라우터 함수에는 deadline 인수가 있고, 원래 Uniswap V3 ISwapRouter 구조체에도 포함됩니다. Universal Router는 execute(commands, inputs, deadline)와 마감 시간이 없는 오버로드를 모두 제공합니다. 따라서 모든 스왑에 마감 시간이 있거나 항상 같은 중첩 스왑 매개변수 안에 있다고 가정하면 안 됩니다.
마감 시간은 보통 실행 시 사용되는 블록 타임스탬프와 비교됩니다. 대기 중인 트랜잭션을 취소하거나 신속한 포함을 보장하거나 금액 한도 안의 불리한 가격을 막지 않습니다. 취소하려면 발신자가 해당 체인과 지갑의 트랜잭션 대체 기능을 사용해야 하며, 원본이 이미 포함되면 대체는 보장되지 않습니다.
구체적 예시
어떤 exact-input 스왑의 견적이 10,000 USDC 수령을 예상하고 사용자가 1% 슬리피지를 선택했다고 합시다. 견적에 이미 포함된 수수료를 제외하면 예상 최소 출력은 9,900 USDC입니다. USDC의 소수 자릿수는 6 decimals이므로 원시 정수 한도는 9900000000입니다.
그런데 디코딩된 호출에는 amountOutMinimum = 9000000000, 즉 9,000 USDC가 들어 있습니다. 이는 견적보다 1%가 아니라 최대 10% 적은 결과를 허용합니다. 수취인도 모르는 주소이고 마감 시간도 몇 시간 뒤입니다. 이 중 하나만 불일치해도 요청을 거절하고 신뢰할 수 있는 인터페이스에서 다시 만들 충분한 이유가 됩니다. 재구성한 후에는 최근 상태를 기준으로 정확히 같은 미서명 트랜잭션을 시뮬레이션하고 서명 전에 디코딩된 페이로드를 다시 확인하십시오.
확인 목록과 위험
- 선택한 체인과 라우터 또는 프록시 주소를 프로토콜의 공식 배포 기록과 대조하십시오.
- 검증된 컨트랙트 ABI로 디코딩하고 외부 함수만 보지 말고 중첩 호출과 라우터 명령을 펼치십시오.
- 토큰 주소, 방향, 소수 자릿수, 고정 금액, 보호 금액 한도, 경로, 수수료 등급, 수취인, 네이티브
value를 대조하십시오. - 마감 시간을 절대 시각으로 변환하고 남은 시간이 의도한 것인지 판단하십시오. 마감 시간이 없으면 별도로 검토할 설계 선택으로 취급하십시오.
- 서명 주소에서 최근 상태를 대상으로 동일한 트랜잭션을 시뮬레이션하십시오. 성공은 해당 상태에 대한 근거일 뿐 포함이나 최종 실행을 보장하지 않습니다.
- 승인 또는 Permit2 권한은 별도로 검토하십시오. 적절한 스왑 한도도 무제한이거나 악의적인 토큰 승인을 안전하게 만들지는 않습니다.
- 한도가 너무 빡빡하면 정상적인 가격 변동에도 되돌려질 수 있고, 너무 느슨하면 체결 가격과 샌드위치 위험이 커집니다. 온체인 트랜잭션은 되돌려져도 gas를 소비할 수 있습니다.
흔한 오해
오해: 표시된 슬리피지 비율에 그대로 서명한다
일반적으로 서명된 페이로드에는 그 설정에서 계산한 금액 한도가 들어갑니다. 실제 정수와 토큰 소수 자릿수를 확인하십시오. 인터페이스 라벨이 정확해 보여도 calldata가 같은 허용 범위를 쓴다는 증거는 아닙니다.
오해: 모든 스왑은 amountOutMin과 deadline을 쓴다
이름과 위치는 라우터와 함수마다 다릅니다. Exact-output 스왑은 입력 측을 보호하며, 일부 진입점은 마감 시간을 생략하거나 외부 호출에 둡니다.
오해: 마감 시간이 나쁜 가격을 막는다
호출된 코드가 실제로 검사할 때 실행 가능한 시간만 제한합니다. 가격 보호는 금액 한도에서 나오며 그 한도 안의 모든 체결은 여전히 허용됩니다.
오해: 외부 함수만 디코딩하면 충분하다
애그리게이터와 유니버설 라우터에는 여러 호출, 토큰 허가, 전송, 정리 명령이 포함될 수 있습니다. 보안상 중요한 수취인이나 금액이 중첩 페이로드 안에 있을 수 있습니다.
관련 주제
출처
- Contract ABI Specification - Solidity Documentation (접속일: 2026-08-21)
- IUniswapV2Router01.sol - Uniswap (접속일: 2026-08-21)
- ISwapRouter.sol - Uniswap (접속일: 2026-08-21)
- Universal Router Commands - Uniswap (접속일: 2026-08-21)