此时卖出 1 个 eth,1inch 可以买到 148.47DAI,而 Coinbase 是 148.12。1inch 给出的最佳兑换方案是通过 Uniswap 兑换 96%,再通过 Bancor 兑换 4%,这样可以获得 148.47 DAI,这样比单独通过 Uniswap 或 Bancor 举办兑换都划算。
let amountWithDecimals = new BigNumber(amountToExchange).shiftedBy(fromTokenDecimals).toFixed() getQuote(fromToken, toToken, amountWithDecimals, function(quote) { approveToken(daiToken, onesplitAddress, amountWithDecimals, async function() { // We get the balance before the swap just for logging purpose let ethBalanceBefore = await web3.eth.getBalance(fromAddress); let daiBalanceBefore = await daiToken.methods.balanceOf(fromAddress).call(); onesplitContract.methods.swap(fromToken, toToken, amountWithDecimals, quote.returnAmount, quote.distribution, 0).send({ from: fromAddress, gas: 8000000 }, async function(error, txHash) { if (error) { console.log("Could not complete the swap", error); return; } const status = await waitTransaction(txHash); // We check the final balances after the swap for logging purpose let ethBalanceAfter = await web3.eth.getBalance(fromAddress); let daiBalanceAfter = await daiToken.methods.balanceOf(fromAddress).call(); console.log("Final balances:") console.log("Change in ETH balance", new BigNumber(ethBalanceAfter).minus(ethBalanceBefore).shiftedBy(-fromTokenDecimals).toFixed(2)); console.log("Change in DAI balance", new BigNumber(daiBalanceAfter).minus(daiBalanceBefore).shiftedBy(-fromTokenDecimals).toFixed(2)); }); }); });最后的执行功效看起来是下面这样的:
distribution:兑换生意业务拆分漫衍数组
[ "Uniswap", "Kyber", "Bancor", "Oasis", "CurveCompound", "CurveUsdt", "CurveY", "Binance", "Synthetix", "UniswapCompound", "UniswapChai", "UniswapAave" ]留意:假如你想生意业务 Eth 而不是 ERC20 token,fromToken 需要配置为非凡的值 0x0或 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE。
利用第一步的获取的 token 数量举办生意业务
授权(Approve)生意业务所利用你的 token
留意,这个价值不能作为智能合约的 Oracle 价值,由于各类百般的错误,DEX 可以提供很是低的价值,因此大概会严重哄骗这个价值。
disableFlags:标志位,譬喻可配置禁用某个特定的 DEX
disableFlags:标志位,用于调解 1inch 的算法,譬喻可配置禁用某个特定的 DEX
async function getQuote(fromToken, toToken, amount, callback) { let quote = null; try { quote = await onesplitContract.methods.getExpectedReturn(fromToken, toToken, amount, 100, 0).call(); } catch (error) { console.log('Impossible to get the quote', error) } console.log("Trade From: " + fromToken) console.log("Trade To: " + toToken); console.log("Trade Amount: " + amountToExchange); console.log(new BigNumber(quote.returnAmount).shiftedBy(-fromTokenDecimals).toString()); console.log("Using Dexes:"); for (let index = 0; index < quote.distribution.length; index++) { console.log(oneSplitDexes[index] + ": " + quote.distribution[index] + "%"); } callback(quote); }一旦我们获得了兑换 token 的比率,接下来需要授权 1inch 可以操纵我们持有的 token,ERC20 token 尺度不答允在一次生意业务中向合约发送 token 并触发下一个操纵。我们写了一个简朴的函数,挪用approval函数,并利用 waitTransaction 期待生意业务确认。
这个函数需要传入兑换参数,返回兑换的期望功效,以及生意业务在各个 dex 之间的兑换比例。
getExpectedReturn()
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function waitTransaction(txHash) { let tx = null; while (tx == null) { tx = await web3.eth.getTransactionReceipt(txHash); await sleep(2000); } console.log("Transaction " + txHash + " was mined."); return (tx.status); }我们在之前已经得到了兑换比率,此刻把代码变的更可读,界说 1 个getQuote函数,返回一个包括所有参数的工具。
ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 --unlock 0x78bc49be7bae5e0eec08780c86f0e8278b8b035b -l 8000000 实战 - 估算最佳兑换方案阐明完了 1inch 的要害要领,我们将举办第一笔兑换生意业务,代码已在 github 开源:https://github.com/liushooter/ethereumdevio-dex-tutorial/blob/master/part1/index.js。
从代码角度上看懂DEX的聚合生意业务?
我们用 1000 DAI 换返来 5.85 ETH。
接下来就可以挪用 1inch 聚合器的 swap 函数了。在下面的代码中,我们在挪用swap函数执行生意业务后,期待生意业务确认,并在生意业务确认后,显示转出账户的 eth 余额和 dai 余额。
授权1inch合约操纵你的代币
文章的主要步调如下:
getExpectedReturn函数的返回值很是重要,因为接下来需要操作它来执行实际的链上兑换操纵。
(2)该数组指定要利用的 DEX
按照输入的 token 或 ETH 数量,得到预期可兑换的 token 数量
这个要领有 2 个返回值:
swap - 执行多 DEX 兑换生意业务要执行链上 token 兑换生意业务,就需要利用合约提供的另一个函数swap。挪用swap时,需要传入我们之前从getExpectedReturn返回的数据,这个操纵需要耗费 gas。假如要卖出的是 ERC20 token,那么还需要先授权 1inch 合约可以操纵你持有的待卖出 token。swap函数的界说如下:
在 1inch 执行生意业务,进程其实很简朴:
什么是去中心化生意业务所聚合器?
去中心化生意业务所聚合器,即 DEX,以下都用 DEX 暗示。DEX 聚合器是一个平台,它将搜索一组 DEX,以寻找在给按时间和数量下执行生意业务的最佳价值。
function swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256[] memory distribution, uint256 disableFlags ) public payable;swap 函数吸收 6 个参数:
代码执行后返回功效雷同下面这样:
1inch DEX 聚合器1inch 的一大特色就是聚合生意业务,它会在许多个 DEX 找到收益最大的成交方法。好比 100000dai 想买 x 个 eth,在 uniswap 成交 77%, 在 Bancor 成交 23% ,是最合算的,买到的 eth 最多。
总结1inch 提供了精彩的链上 DEX 聚合实现,可以在一个生意业务内操作多个 DEX 实现最优的兑换计策。1inch 的 API 利用也很简朴,只需要用 getExpectedReturn 估算兑换方案, 然后利用 swap 执行兑换方案,就可以获得最好的兑换功效。你不必老是用 eth 生意业务,也可以互换 2 个 ERC20 token,甚至可以用 weth 生意业务。
returnAmount:执行生意业务后将收到的 token 数量。
function approveToken(tokenInstance, receiver, amount, callback) {
tokenInstance.methods.approve(receiver, amount).send({ from: fromAddress }, async function(error, txHash) {
if (error) {
console.log("ERC20 could not be approved", error);
return;
}
console.log("ERC20 token approved to " + receiver);
const status = await waitTransaction(txHash);
if (!status) {
console.log("Approval transaction failed.");
return;
}
callback();
})
}
留意,这里演示的时候 授权额度远远高于当前实际需要的数量,这样后续就不需要重复执行这个操纵了。
我们首先仔细相识一下 1inch 的智能合约,让我们感乐趣的是这两个要领:
minReturn:期望获得的待买入 token 的最少数量
getExpectedReturn - 估算最佳兑换方案getExpectedReturn 可以随意挪用,,不需要耗损任何 gas。
今朝 1inch 支持的生意业务所和排序(与 distribution 对应)如下:
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。