nerve-sdk-js
Version:
nerve nerve-js nerve-sdk nerve-js-sdk
439 lines (377 loc) • 16.4 kB
JavaScript
/**
* swap工具类测试
*/
const BigNumber = require('bignumber.js');
const nerve = require('../../index');
const txs = require('../../model/txs'); // 设置网络环境
nerve.testnet();
/**
* 根据卖出数量,计算可买进的数量
*/
// getAmountOut();
function getAmountOut() {
let amountIn = '3338955326';
let reserveIn = '1998664399335';
let reserveOut = '300774618024814914753';
let amountOut = nerve.swap.getAmountOut(amountIn, reserveIn, reserveOut);
console.log('amountOut: ' + amountOut);
}
/**
* 根据买进数量,计算可卖出数量
*/
// getAmountIn();
function getAmountIn() {
let amountOut = '3338955326';
let reserveIn = '300774618024814914753';
let reserveOut = '1998664399335';
let amountIn = nerve.swap.getAmountIn(amountOut, reserveIn, reserveOut);
console.log('amountIn: ' + amountIn);
}
/**
* 当交易路径大于等于3时,使用以下函数计算
*
* 根据卖出数量,计算可买进的数量
*/
// getAmountsOut();
function getAmountsOut() {
let amountIn = '110000000000';
let tokenPathArray = [nerve.swap.token(2, 33), nerve.swap.token(5, 25), nerve.swap.token(5, 1), nerve.swap.token(5, 7)];
let pairsArray = [nerve.swap.pair(nerve.swap.token(2, 33), nerve.swap.token(5, 25), '9204387996119851', '10866621900299832899'), nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 25), '88340927', '1132245721610466936'), nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 7), '24526402685', '4477567')];
console.log(nerve.swap.getAmountsOut(amountIn, tokenPathArray, pairsArray));
} // getPriceImpact();
function getPriceImpact() {
console.log("exec [getPriceImpact]...");
let amountIn = '1000000';
let tokenPathArray = [nerve.swap.token(9, 1), nerve.swap.token(1, 1), nerve.swap.token(1, 81), nerve.swap.token(9, 220)];
let pairsArray = [nerve.swap.pair(nerve.swap.token(1, 1), nerve.swap.token(9, 1), '79004277894741', '1207858556439915'), nerve.swap.pair(nerve.swap.token(1, 1), nerve.swap.token(1, 81), '1086018144897', '283986472447021'), nerve.swap.pair(nerve.swap.token(1, 81), nerve.swap.token(9, 220), '100000000', '1000000000000000000'), nerve.swap.pair(nerve.swap.token(9, 1), nerve.swap.token(9, 220), '54542052289588', '13836674483460251861935')];
let amounts = nerve.swap.getAmountsOut(amountIn, tokenPathArray, pairsArray);
let priceImpact = nerve.swap.getPriceImpact(amounts, tokenPathArray, pairsArray);
console.log(priceImpact.toFixed(), 'toFixed');
console.log(priceImpact.toFormat(), 'toFormat');
} // bestTradeExactInTest();
function bestTradeExactInTest() {
console.log("exec [bestTradeExactInTest]...");
let stableInfoArray;
/*let stableInfoArray = [{
"address": "TNVTdTSQoL9quSyGJCA9sY8pcMEVy4RN4EjbB",
"lpToken": "5-102",
"groupCoin": {
"5-72": {
"decimals": 18,
"balance": "20002904580803663208296"
},
"5-73": {
"decimals": 18,
"balance": "19999095419196336791704"
},
"5-74": {
"decimals": 6,
"balance": "19999099898"
}
}
}];*/
let pairs = [
/*nerve.swap.pair(
nerve.swap.token(9, 1),
nerve.swap.token(9, 220),
'52224752005827', '14763892477263583354195'),
nerve.swap.pair(
nerve.swap.token(1, 1),
nerve.swap.token(1, 146),
'19113106412499', '2208031238227330865404540367'),
nerve.swap.pair(
nerve.swap.token(1, 146),
nerve.swap.token(9, 1),
'1240000000000000002636', '150000002'),
nerve.swap.pair(
nerve.swap.token(1, 1),
nerve.swap.token(9, 1),
'79252873416961', '1153409111343822'),*/
nerve.swap.pair(nerve.swap.token(1, 1), nerve.swap.token(9, 1), '79004277894741', '1207858556439915'), nerve.swap.pair(nerve.swap.token(1, 1), nerve.swap.token(1, 81), '1086018144897', '283986472447021'), nerve.swap.pair(nerve.swap.token(1, 81), nerve.swap.token(9, 220), '100000000', '1000000000000000000') // nerve.swap.pair(
// nerve.swap.token(9, 1),
// nerve.swap.token(9, 220),
// '54542052289588', '13836674483460251861935'),
];
pairs = [nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 42), '1998664399335', '300774618024814914753', '500')]; // 10:1 / 20:1 / 20:1 99999999999.003
let tokenAmountIn = nerve.swap.tokenAmount(5, 1, '3333000000');
let tokenOut = nerve.swap.token(5, 42);
let maxPairSize = 3;
let trade = nerve.swap.bestTradeExactIn(5, pairs, tokenAmountIn, tokenOut, maxPairSize, stableInfoArray);
console.log(JSON.stringify(trade));
} // bestTradeExactOutTest();
function bestTradeExactOutTest() {
let stableInfoArray; // let stableInfoArray = [{
// "address": "TNVTdTSQoL9quSyGJCA9sY8pcMEVy4RN4EjbB",
// "lpToken": "5-102",
// "groupCoin": {
// "5-72": {
// "decimals": 18,
// "balance": "20002904580803663208296"
// },
// "5-73": {
// "decimals": 18,
// "balance": "19999095419196336791704"
// },
// "5-74": {
// "decimals": 6,
// "balance": "19999099898"
// }
// }
// }];
let pairs = [nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 72), '10000000000', '10000000000000000000'), nerve.swap.pair(nerve.swap.token(5, 5), nerve.swap.token(5, 73), '20000000000', '10000000000000000000'), nerve.swap.pair(nerve.swap.token(5, 5), nerve.swap.token(5, 74), '20000000000000', '10000000000'), nerve.swap.pair(nerve.swap.token(5, 3), nerve.swap.token(5, 7), '10000000000', '10000000'), nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 3), '17113206913684', '1688774384'), nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 7), '10000000000', '10000000'), nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 5), '1711320691', '168877'), nerve.swap.pair(nerve.swap.token(5, 5), nerve.swap.token(5, 7), '10000000000', '10000000'), nerve.swap.pair(nerve.swap.token(5, 3), nerve.swap.token(5, 5), '10000000000', '10000000')]; // pairs = [nerve.swap.pair(
// nerve.swap.token(5, 1),
// nerve.swap.token(5, 42),
// '1998664399335', '300774618024814914753', '500'),];
let tokenIn = nerve.swap.token(5, 5);
let tokenAmountOut = nerve.swap.tokenAmount(5, 1, '3333000000');
let maxPairSize = 3;
let trade = nerve.swap.bestTradeExactOut(5, pairs, tokenIn, tokenAmountOut, maxPairSize, stableInfoArray);
console.log(JSON.stringify(trade));
} // arraySliceTest();
function arraySliceTest() {
let pairs = [nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 3), '171132069136', '16887743'), nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 7), '10000000000', '10000000')];
let subPairs = pairs.slice(0, 0);
let s2 = pairs.slice(1, 2);
subPairs = subPairs.concat(s2);
console.log('aaaaa');
}
/**
* 当交易路径大于等于3时,使用以下函数计算
*
* 根据买进数量,计算可卖出数量
*/
function getAmountsIn() {
let amountOut = '333620';
let tokenPathArray = [nerve.swap.token(5, 3), nerve.swap.token(5, 1), nerve.swap.token(5, 7)];
let pairsArray = [nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 3), '171132069136', '16887743'), nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 7), '10000000000', '10000000')];
console.log(nerve.swap.getAmountsIn(amountOut, tokenPathArray, pairsArray));
}
/**
* 根据交易对中其中一个币种,计算另外一个币种可添加的流动性
*/
function quote() {
let amountA = '596';
let reserveA = '2222';
let reserveB = '3355';
let amountB = nerve.swap.quote(amountA, reserveA, reserveB);
console.log('amountB: ' + amountB);
}
function tokenEquals() {
console.log(nerve.swap.tokenEquals(nerve.swap.token(5, 1), nerve.swap.token(5, 2)), 'false');
console.log(nerve.swap.tokenEquals(nerve.swap.token(5, 10), nerve.swap.token(5, 10)), 'true');
}
function pair() {
console.log(nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 3), '171132069136', '16887743'), 'pair');
}
function getReserves() {
let pair = nerve.swap.pair(nerve.swap.token(5, 1), nerve.swap.token(5, 3), '171132069136', '16887743');
console.log(nerve.swap.getReserves(nerve.swap.token(5, 1), nerve.swap.token(5, 3), pair));
console.log(nerve.swap.getReserves(nerve.swap.token(5, 3), nerve.swap.token(5, 1), pair));
} // divTest();
function divTest() {
let a = 0;
console.log(typeof a === 'undefined');
console.log(typeof a);
console.log(typeof typeof a);
let b;
console.log(typeof b === 'undefined');
console.log(typeof b);
console.log(typeof typeof b);
let one = new BigNumber(1);
let x = new BigNumber(3);
let y = new BigNumber(1000);
let z = x.div(y);
console.log(one.minus(z));
} // stableLpSwapTradeTest();
/**
0. 假设swap交易: `tokenA`兑换`tokenB`
1. 检查`tokenA`是否为稳定币池中的token
2. 若是(result.success=true),则把`tokenA`替换为`result.lpToken`
3. 使用现有方式查找最优路径
4. 页面上显示 tokenA-> result.lpToken -> ... -> tokenB
5. 交易组装调用此函数: nerve.swap.stableLpSwapTrade
5.1 比swapTrade多出一个stablePairAddrss, 使用result.address填入
5.2 tokenPath 更换为 [tokenA, result.lpToken, ..., tokenB]
*/
async function stableLpSwapTradeTest() {
// 账户信息
let fromAddress = "TNVTdTSPRnXkDiagy7enti1KL75NU5AxC9sQA";
let pri = '';
let amountIn = "2000000000000000000"; // 卖出的资产数量
let amountOutMin = "0"; // 最小买进的资产数量
let feeTo = null; // 交易手续费取出一部分给指定的接收地址
let deadline = nerve.swap.currentTime() + 300; // 过期时间
let toAddress = "TNVTdTSPRnXkDiagy7enti1KL75NU5AxC9sQA"; // 资产接收地址
let remark = 'stable lp swap trade remark...';
let stableInfoArray = [{
"address": "TNVTdTSQoL9quSyGJCA9sY8pcMEVy4RN4EjbB",
"lpToken": "5-102",
"groupCoin": {
"5-90": 1,
"5-72": 1,
"5-73": 1,
"5-74": 1,
"5-7": 1
}
}];
let tokenIn = nerve.swap.token(5, 90);
let tokenOut = nerve.swap.token(5, 1);
let check = nerve.swap.checkStableToken(tokenIn, stableInfoArray);
if (check.success) {
let tokenFirst = check.lpToken;
let stablePairAddress = check.address; // 稳定币交易对地址
// 查找最优路径: 使用 tokenFirst, tokenOut 资产去查找最优路径,可能得到 [tokenFirst, tokenOut] or [tokenFirst, ..., tokenOut]
// 计算出的路径在路径首位加入实际的tokenIn,得到 [tokenIn, tokenFirst, tokenOut] or [tokenIn, tokenFirst, ..., tokenOut]
let tokenPath = [tokenIn, tokenFirst, tokenOut]; // 币币交换资产路径,路径中最后一个资产,是用户要买进的资产
let tx = await nerve.swap.stableLpSwapTrade(fromAddress, stablePairAddress, amountIn, tokenPath, amountOutMin, feeTo, deadline, toAddress, remark);
console.log('稳定币兑换Swap');
console.log('hash: ' + tx.hash);
console.log('hex: ' + tx.hex);
} else {
let tokenPath = [tokenIn, tokenOut]; // 币币交换资产路径,路径中最后一个资产,是用户要买进的资产
let tx = await nerve.swap.swapTrade(fromAddress, amountIn, tokenPath, amountOutMin, feeTo, deadline, toAddress, remark);
console.log('普通Swap');
console.log('hash: ' + tx.hash);
console.log('hex: ' + tx.hex);
}
} // swapTradeStableRemoveLpTest();
/**
0. 假设swap交易: `tokenA`兑换`tokenB`
1. 检查`tokenB`是否为稳定币池中的token
2. 若是(result.success=true),则把`tokenB`替换为`result.lpToken`
3. 使用现有方式查找最优路径
4. 页面上显示 tokenA-> ... -> result.lpToken -> tokenB
5. 交易组装调用此函数: nerve.swap.swapTradeStableRemoveLp
5.1 tokenPath 为 [tokenA, ..., result.lpToken]
5.2 增加targetToken参数,此处为 `tokenB`
*/
async function swapTradeStableRemoveLpTest() {
// 账户信息
let fromAddress = "TNVTdTSPRnXkDiagy7enti1KL75NU5AxC9sQA";
let pri = '';
let amountIn = "2000000000000000000"; // 卖出的资产数量
let amountOutMin = "0"; // 最小买进的资产数量
let feeTo = null; // 交易手续费取出一部分给指定的接收地址
let deadline = nerve.swap.currentTime() + 300; // 过期时间
let toAddress = "TNVTdTSPRnXkDiagy7enti1KL75NU5AxC9sQA"; // 资产接收地址
let remark = 'swap trade stable remove lp remark...';
let stableInfoArray = [{
"address": "TNVTdTSQoL9quSyGJCA9sY8pcMEVy4RN4EjbB",
"lpToken": "5-102",
"groupCoin": {
"5-90": 1,
"5-72": 1,
"5-73": 1,
"5-74": 1,
"5-7": 1
}
}];
let tokenIn = nerve.swap.token(5, 1);
let tokenOut = nerve.swap.token(5, 90);
let check = nerve.swap.checkStableToken(tokenOut, stableInfoArray);
if (check.success) {
let tokenLast = check.lpToken;
let stablePairAddress = check.address; // 稳定币交易对地址
// 查找最优路径: 使用 tokenIn, tokenLast 资产去查找最优路径,可能得到 [tokenIn, tokenLast] or [tokenIn, ..., tokenLast]
let tokenPath = [tokenIn, tokenLast]; // 币币交换资产路径,路径中最后一个资产,是用户要买进的资产
let tx = await nerve.swap.swapTradeStableRemoveLp(fromAddress, amountIn, tokenPath, amountOutMin, feeTo, deadline, toAddress, tokenOut, remark);
console.log('Swap交易聚合稳定币撤销流动性交易');
console.log('hash: ' + tx.hash);
console.log('hex: ' + tx.hex);
} else {
let tokenPath = [tokenIn, tokenOut]; // 币币交换资产路径,路径中最后一个资产,是用户要买进的资产
let tx = await nerve.swap.swapTrade(fromAddress, amountIn, tokenPath, amountOutMin, feeTo, deadline, toAddress, remark);
console.log('普通Swap');
console.log('hash: ' + tx.hash);
console.log('hex: ' + tx.hex);
}
}
let stablePairInfo = {
"address": "TNVTdTSQoL9quSyGJCA9sY8pcMEVy4RN4EjbB",
"tokenLP": {
"assetChainId": 5,
"assetId": 102,
"name": "USDTN",
"symbol": "USDTN",
"decimals": 18
},
"coins": [{
"assetChainId": 5,
"assetId": 7,
"name": "USDT",
"symbol": "USDT",
"decimals": 6
}, {
"assetChainId": 5,
"assetId": 72,
"name": "USDT",
"symbol": "USDT",
"decimals": 18
}, {
"assetChainId": 5,
"assetId": 73,
"name": "USDT",
"symbol": "USDT",
"decimals": 18
}, {
"assetChainId": 5,
"assetId": 74,
"name": "USDT",
"symbol": "USDT",
"decimals": 18
}, {
"assetChainId": 5,
"assetId": 90,
"name": "USDT",
"symbol": "USDT",
"decimals": 6
}, {
"assetChainId": 2,
"assetId": 144,
"name": "USDT",
"symbol": "USDT",
"decimals": 18
}],
"totalLP": "242624559880418148907617",
"balances": ["20472632410", "186440810665380453160712", "13337326273624497142272", "0", "34035", "22373756507916810880374"]
}; // stableSwapAddLiquidityMinReceiveTest();
// 计算用户添加稳定币流动性获取的LP资产
function calcStableSwapAddLiquidityMinReceiveTest() {
// 添加的资产数量
let tokenAmountIn = {
chainId: 5,
assetId: 72,
amount: '222123456789123456789',
decimals: 18
};
let minReceive = nerve.swap.calcStableSwapAddLiquidityMinReceive(stablePairInfo, tokenAmountIn);
console.log(minReceive, 'minReceive');
}
calcStableSwapRemoveLiquidityMinReceiveTest(); // 计算用户移除稳定币流动性LP资产获取的资产
function calcStableSwapRemoveLiquidityMinReceiveTest() {
// 移除的LP资产
let tokenAmountLP = {
chainId: 5,
assetId: 102,
amount: '31030165533002692',
decimals: 18
}; // 31030165534473932
// 31030165533002692
// 指定接收的资产
let receiveIndex = 5;
let minReceive = nerve.swap.calcStableSwapRemoveLiquidityMinReceive(stablePairInfo, tokenAmountLP, receiveIndex);
console.log(minReceive, 'minReceive');
} // calcStableSwapMinReceiveTest();
// 计算用户稳定币兑换获取的资产
function calcStableSwapMinReceiveTest() {
// 卖出的资产
let tokenAmountIn = {
chainId: 5,
assetId: 72,
amount: '222123456789123456789',
decimals: 18
}; // 指定兑换的资产
let tokenOutIndex = 3;
let minReceive = nerve.swap.calcStableSwapMinReceive(stablePairInfo, tokenAmountIn, tokenOutIndex);
console.log(minReceive, 'minReceive');
}