概要
本系列前两节分别介绍了uniswap的 核心函数mint和 burn, 本章将介绍剩下最重要的swap兑换函数;
swap
与其说该函数是兑换,不如说是借贷,因为你可以先借后还,而且可以同时借两种币,或者借某种token后再用同一种token还掉(整个过程完全不涉及另一种token),只要是整个借贷流程在同一笔交易中完成即可,也就是通常所说的闪电贷 flashswap。
swap源码
1~6行: 两个out是用户想借两种token的数额,上面说过这其实是闪电贷,不是严格上的两种token的兑换,所以是有两个out,用户完全可以同时先借两个或只借一种token。to是用户地址,无需赘言。data相当于是用户用于回调的业务数据,本函数不用,会直接传递给回调函数 uniswapV2Call()。lock修饰器用于防重入和并发控制。
7行:用户至少要借一种代币。
9行: 借的代币数量不能超过交易池中的储备量。
13~23行:此处使用了一个作用域,因为该作用域内的申明的变量超过本作用域就会被舍弃,这样可以防止局部变量太多导致的栈溢出错误。本作用域的主要功能是先给用户转账,然后调用用户自己的智能合约(用户在这里可以进行各种操作,比如砸盘、去其他Dex套利等,然后必须还款),最后获取两种token最新的余额。
24~26行:计算用户转入(还)的token数量,用户必须转入其中一个或两个token,否则肯定不满足恒定乘积公式,也就是一分钱没还。
28~33行:通过恒定乘积公式验证还款金额。因为solidity不支持小数,所以通过乘以一千来代表扣除0.3%的转入金额。32行正是恒定乘积的核心应用,用户可以转入任何组合的代币,只要满足恒定乘积公式即可通过验证。