BlockChain를 공부하다가 좋은 Web3 Cybersecurity Academy가 있어서 공유하고자 작성하였다.
Assets Transfer
etherscan을 통해 다음과 같은 정보를 획득할 수 있다.
- From: 트랜잭션의 주소, EOA 지갑 주소
- To: Tether: USDT Contract
- ERC-20 Tokens Transferred: From에서 사용자 A로 651.13 USDT 전송
- Input Data: transfer함수를 호출
해당 Phalcon의 Invocation Flow를 보면 EVM은 부동 소수점 연산을 지원하지 않기 때문에 10진수로 소수점 자릿수를 표현하는 decimal이 대신 사용된다.
각 토큰에는 토큰 값을 나타내는 데 사용되는 소수점 자릿수인 자체 정밀도가 있는 데 ERC-20 토큰의 decimal은 일반적으로 18자리인 반면 USDT는 6자리이다. 그래서 토큰의 정밀도가 제대로 처리되지 않으면 문제가 발생할 수 있다.
Uniswap
위 etherscan을 통해 다음과 같은 정보를 획득할 수 있다.
- Transaction Action: 사용자가 Uniswap V2에서 swap을 호출하여 12,716 USDT를 7,118 UNDEAD로 교환
- From: 트랜잭션 소스의 지갑 주소
- To: MEV Bot이 swap을 위한 Uniswap Contract를 호출
- ERC-20 Tokens Transferred: 토큰 교환 프로세스
해당 Phalcon의 Invocation Flow를 보면 MEV Bot은 Uniswap V2 USDT/UNDEAD 거래 패이 컨트랙트를 호출하여 Swap을 호출하여 토큰을 교환한다.
Foundry
Sample Code를 보면 Uniswap_v2_router.swapExactTokensForTokens()함수를 호출하여 1 BTC를 23587 DAI로 교환한다.
Curve 3pool - DAI/USDC/USDT 유동성 추가
위 etherscan을 통해 다음과 같은 정보를 획득할 수 있다.
- 해당 거래의 목적: Curve 3pool에 유동성을 추가하는 것
- From: 이 트랙잭션의 소스 주소
- To: Curve.fi: DAT/USDC/USDT pool
- ERC-20 Tokens Transferred: A가 3,524,968.44 USDT를 Curve 3pool로 전송한 다음 Curve 사용자 A를 위해 3,447,897.54 3Crv 토큰을 발행
해당 Phalcon의 Invocation Flow를 보면 호출 순서에 따라 3 단계가 진행되었다.
- add_liqudity
- transferFrom
- mint
Compound Propose
위 etherscan을 통해 다음과 같은 정보를 획득할 수 있다.
사용자가 compound에 대한 제안서를 제출했다.
위 Phalcon의 Invocation Flow에 따르면 propose() 함수를 통해 제안을 제출하여 제안 번호 44가 생성되었다.
Uniswap FlashSwap
Sample code를 보면 Uniswap UNI/WETH 교환을 통해 100 WETH의 flashloan을 빌린다. 상환 시 0.3%의 수수료를 지불해야 한다.
foundry를 분석하면 flashswap는 swap을 호출한 다음 uniswapV2Call을 다시 호출하여 상환한다.
Flashloan과 Flashswap의 특징
- 공통점: 두 함수다 무담보로 토큰을 빌릴 수 있으며 동일한 블록에서 반환을 해야 함. 그렇지 않으면 거래가 실패
- 차이점: Flashloan token0/token1을 통해 token0을 빌린 경우 token0을 반환해야 한다. 하지만 Flashswap은 token0을 빌려주고 token0 또는 token1을 반환할 수 있어 좀 더 유연함
출처: https://github.com/SunWeb3Sec/DeFiHackLabs/tree/main/academy/onchain_debug/02_warmup/en