h-agent-swap 2.0.0 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/abi/PancakePair.json +718 -0
- package/src/abi/TokenMarket.json +20 -98
- package/src/agent-swap.js +192 -19
- package/src/index.js +4 -2
- package/src/swap-pair.js +26 -0
package/src/agent-swap.js
CHANGED
|
@@ -4,10 +4,10 @@ let { abi, bytecode } = require("./abi/TokenMarket.json")
|
|
|
4
4
|
|
|
5
5
|
let { plus, reduce, multiplication, division, saveNum, charCompare,longHandle,toSmall } = require("h-token-staking/src/utils")
|
|
6
6
|
const ERC20 = require("h-token-staking/src/ERC20")
|
|
7
|
-
|
|
7
|
+
let SwapLP = require("./swap-pair")
|
|
8
8
|
|
|
9
9
|
class AgentSwap extends HI {
|
|
10
|
-
constructor({ provider, account, rpcUrl, privateKey, contract }) {
|
|
10
|
+
constructor({ provider, account, rpcUrl, privateKey, contract,lp = "" }) {
|
|
11
11
|
super({ provider, account, rpcUrl, privateKey, contract, abi })
|
|
12
12
|
this.mainToken = "0x0000000000000000000000000000000000000000"
|
|
13
13
|
this.maxVal = "999000000000000000000000000000000000000000000000000"
|
|
@@ -16,6 +16,159 @@ class AgentSwap extends HI {
|
|
|
16
16
|
this.pointMax = "100000000"
|
|
17
17
|
|
|
18
18
|
this.point = 0.01
|
|
19
|
+
this.lp = lp
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async estimate({ side = 0,amount = 0, point = 0 , wallet = "" ,usdt = "" }) {
|
|
23
|
+
let usdt_precision = 6
|
|
24
|
+
let tau_precision = 18
|
|
25
|
+
let user = this.web3.eth.defaultAccount
|
|
26
|
+
let data = {
|
|
27
|
+
wallet:wallet ? wallet : user,
|
|
28
|
+
usdt_pool:0,
|
|
29
|
+
tau_pool:0,
|
|
30
|
+
usdt:usdt ? usdt : "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
|
|
31
|
+
tau:"",
|
|
32
|
+
inAmount:0,
|
|
33
|
+
outAmount:0,
|
|
34
|
+
tau_balance:0,
|
|
35
|
+
feeAmount:0,
|
|
36
|
+
realOutAmount:0,
|
|
37
|
+
win:false,
|
|
38
|
+
change:0,
|
|
39
|
+
buyAmount:0,
|
|
40
|
+
taxAmount:0,
|
|
41
|
+
backAmount:0,
|
|
42
|
+
buyType:1
|
|
43
|
+
}
|
|
44
|
+
let lp = new SwapLP({ ...this.network, contract:this.lp })
|
|
45
|
+
let result = await lp.getReserves()
|
|
46
|
+
|
|
47
|
+
if(result.token0.toLocaleLowerCase() == data.usdt.toLocaleLowerCase()) {
|
|
48
|
+
data.usdt_pool = saveNum(toSmall(result._reserve0,usdt_precision),usdt_precision)
|
|
49
|
+
data.tau_pool = saveNum(toSmall(result._reserve1,tau_precision),tau_precision)
|
|
50
|
+
data.tau = result.token1
|
|
51
|
+
}else {
|
|
52
|
+
data.usdt_pool = saveNum(toSmall(result._reserve1,usdt_precision),usdt_precision)
|
|
53
|
+
data.tau_pool = saveNum(toSmall(result._reserve0,tau_precision),tau_precision)
|
|
54
|
+
data.tau = result.token0
|
|
55
|
+
}
|
|
56
|
+
let tau = new ERC20({ ...this.network,contract:data.tau })
|
|
57
|
+
let balance = await tau.balanceOf(data.wallet)
|
|
58
|
+
data.tau_balance = toSmall(balance,18)
|
|
59
|
+
|
|
60
|
+
console.log(`
|
|
61
|
+
<=======swap before amount=======>
|
|
62
|
+
${JSON.stringify(data,null,2)}
|
|
63
|
+
`)
|
|
64
|
+
|
|
65
|
+
// 第一次兑换
|
|
66
|
+
let path = [data.tau,data.usdt]
|
|
67
|
+
if(side == 0) {
|
|
68
|
+
data.inAmount = amount
|
|
69
|
+
let amountInWithFee = multiplication(data.inAmount,9975)
|
|
70
|
+
let numerator = multiplication(amountInWithFee,data.usdt_pool)
|
|
71
|
+
let denominator = plus(multiplication(data.tau_pool,10000),amountInWithFee)
|
|
72
|
+
data.outAmount = saveNum(division(numerator,denominator),6)
|
|
73
|
+
|
|
74
|
+
data.tau_balance = reduce(data.tau_balance,data.inAmount)
|
|
75
|
+
data.tau_pool = plus(data.tau_pool,data.inAmount)
|
|
76
|
+
data.usdt_pool = reduce(data.usdt_pool,data.outAmount)
|
|
77
|
+
|
|
78
|
+
}else {
|
|
79
|
+
data.outAmount = amount
|
|
80
|
+
let numerator = multiplication(multiplication(data.tau_pool,data.outAmount),10000)
|
|
81
|
+
let denominator = multiplication(reduce(data.usdt_pool,data.outAmount),9975)
|
|
82
|
+
let inAmount = saveNum(division(numerator,denominator),18)
|
|
83
|
+
data.inAmount = this.pointOffset({
|
|
84
|
+
amount:inAmount,
|
|
85
|
+
point
|
|
86
|
+
})
|
|
87
|
+
data.tau_balance = reduce(data.tau_balance,data.inAmount)
|
|
88
|
+
data.tau_pool = plus(data.tau_pool,inAmount)
|
|
89
|
+
data.usdt_pool = reduce(data.usdt_pool,data.outAmount)
|
|
90
|
+
}
|
|
91
|
+
console.log(`
|
|
92
|
+
<=======swap after amount =======>
|
|
93
|
+
${JSON.stringify(data,null,2)}
|
|
94
|
+
`)
|
|
95
|
+
|
|
96
|
+
// 历史累加输入输出
|
|
97
|
+
let amounts = await this.SC.methods.tokenAmounts(data.wallet,data.usdt).call()
|
|
98
|
+
amounts.outAmount = toSmall(amounts.outAmount,usdt_precision)
|
|
99
|
+
amounts.inAmount = toSmall(amounts.inAmount,usdt_precision)
|
|
100
|
+
// 获取手续费比率
|
|
101
|
+
let config = await this.SC.methods.rateAmount(data.tau,data.usdt).call()
|
|
102
|
+
config.feeRate = division(config.feeRate,this.pointMax)
|
|
103
|
+
|
|
104
|
+
data.feeAmount = multiplication(data.outAmount,config.feeRate)
|
|
105
|
+
// 获取扣除手续费后预计得到的usdt
|
|
106
|
+
let outAmount = reduce(data.outAmount,data.feeAmount)
|
|
107
|
+
// 计算当前兑换后的价格
|
|
108
|
+
let amountInWithFee = multiplication(1,9975)
|
|
109
|
+
let numerator = multiplication(amountInWithFee,data.usdt_pool)
|
|
110
|
+
let denominator = plus(multiplication(data.tau_pool,10000),amountInWithFee)
|
|
111
|
+
let price = saveNum(division(numerator,denominator),6)
|
|
112
|
+
|
|
113
|
+
// 判断盈亏
|
|
114
|
+
let totalIn = amounts.inAmount
|
|
115
|
+
let totalOut = plus(plus(amounts.outAmount,outAmount),multiplication(data.tau_balance,price))
|
|
116
|
+
if(parseFloat(totalIn) >= parseFloat(totalOut)) {
|
|
117
|
+
data.win = false
|
|
118
|
+
data.change = reduce(totalIn,totalOut)
|
|
119
|
+
}else {
|
|
120
|
+
data.win = true
|
|
121
|
+
data.change = reduce(totalOut,totalIn)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let limit = await this.limitBuy(data.usdt)
|
|
125
|
+
let tax = await this.SC.methods.taxConfig(data.tau,data.usdt).call()
|
|
126
|
+
tax.tax = division(tax.tax,this.pointMax)
|
|
127
|
+
tax.backBuy = division(tax.backBuy,this.pointMax)
|
|
128
|
+
console.log(tax)
|
|
129
|
+
console.log(limit)
|
|
130
|
+
if(data.win) {
|
|
131
|
+
if(parseFloat(limit.inMin) <= parseFloat(data.change) && parseFloat(data.change) > 0) {
|
|
132
|
+
if(parseFloat(data.change) >= parseFloat(outAmount)){
|
|
133
|
+
data.buyAmount = multiplication(outAmount,tax.backBuy)
|
|
134
|
+
data.taxAmount = multiplication(outAmount,tax.tax)
|
|
135
|
+
}else {
|
|
136
|
+
data.buyAmount = multiplication(data.change,tax.backBuy)
|
|
137
|
+
data.taxAmount = multiplication(data.change,tax.tax)
|
|
138
|
+
}
|
|
139
|
+
data.buyType = 0
|
|
140
|
+
data.realOutAmount = reduce(reduce(outAmount,data.buyAmount),data.taxAmount)
|
|
141
|
+
}else {
|
|
142
|
+
// data.realOutAmount = outAmount
|
|
143
|
+
data.buyAmount = multiplication(outAmount,tax.backBuy)
|
|
144
|
+
data.realOutAmount = reduce(outAmount,data.buyAmount)
|
|
145
|
+
}
|
|
146
|
+
}else {
|
|
147
|
+
data.buyAmount = multiplication(outAmount,tax.backBuy)
|
|
148
|
+
data.realOutAmount = reduce(outAmount,data.buyAmount)
|
|
149
|
+
if(parseFloat(limit.outMin) <= parseFloat(data.change) && parseFloat(data.change) > 0) {
|
|
150
|
+
data.backAmount = data.change
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
console.log(`totalIn:${totalIn}`)
|
|
155
|
+
console.log(`totalOut:${totalOut}`)
|
|
156
|
+
console.log(`
|
|
157
|
+
<=======swap complete amount =======>
|
|
158
|
+
${JSON.stringify(data,null,2)}`)
|
|
159
|
+
return data
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
pointOffset({ point,amount,isplus = true }) {
|
|
164
|
+
let result
|
|
165
|
+
if(isplus) {
|
|
166
|
+
result = division(multiplication(amount,plus(this.pointMax,point)),this.pointMax)
|
|
167
|
+
}else {
|
|
168
|
+
result = division(multiplication(amount,reduce(this.pointMax,point)),this.pointMax)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return result
|
|
19
172
|
}
|
|
20
173
|
|
|
21
174
|
pointHandle(amount, isplus = true) {
|
|
@@ -351,7 +504,7 @@ class AgentSwap extends HI {
|
|
|
351
504
|
|
|
352
505
|
|
|
353
506
|
|
|
354
|
-
async tradeConfig({ amount,path,side = 0,point = 1000 }) {
|
|
507
|
+
async tradeConfig({ amount,path,side = 0,point = 1000, target = "" }) {
|
|
355
508
|
let inToken = path[0]
|
|
356
509
|
let outToken = path[path.length - 1]
|
|
357
510
|
let IToken = new HERC20({ ...this.network, contract: inToken })
|
|
@@ -368,25 +521,45 @@ class AgentSwap extends HI {
|
|
|
368
521
|
outAmount = await OToken.toAmount(amount)
|
|
369
522
|
inputAmount = await IToken.toAmount(amount)
|
|
370
523
|
}
|
|
371
|
-
let user = this.web3.eth.defaultAccount
|
|
524
|
+
let user = target ? target : this.web3.eth.defaultAccount
|
|
372
525
|
console.log([inToken,outToken,path,inputAmount,outAmount,user])
|
|
373
|
-
|
|
526
|
+
|
|
527
|
+
let result;
|
|
528
|
+
let decimals = await OToken.decimals()
|
|
529
|
+
try{
|
|
530
|
+
|
|
531
|
+
result = await this.SC.methods.fundRead(inToken,outToken,path,inputAmount,outAmount,user).call()
|
|
532
|
+
console.log(result)
|
|
533
|
+
|
|
534
|
+
result.feeAmount = toSmall(result.group.feeAmount,decimals)
|
|
535
|
+
result.outReal = toSmall(result.group.outAmount,decimals)
|
|
536
|
+
result.taxAmount = toSmall(result.group.taxAmount,decimals)
|
|
537
|
+
result.backAmount = toSmall(result.group.backAmount,decimals)
|
|
538
|
+
result.buyAmount = toSmall(result.group.buyAmount,decimals)
|
|
539
|
+
result.change = toSmall(result.group.change,decimals)
|
|
540
|
+
result.win = result.group.win
|
|
541
|
+
|
|
542
|
+
result.feeRate = division(result.config.feeRate,this.pointMax)
|
|
543
|
+
result.reward = division(result.config.reward,this.pointMax)
|
|
544
|
+
result.rewardAmount = multiplication(result.reward,toSmall(outAmount,decimals))
|
|
545
|
+
result.outAmount = toSmall(outAmount,decimals)
|
|
546
|
+
result.inAmount = inAmount
|
|
547
|
+
}catch(err){
|
|
548
|
+
console.log(err)
|
|
549
|
+
result = {}
|
|
550
|
+
result.outAmount = toSmall(outAmount,decimals)
|
|
551
|
+
result.inAmount = inAmount
|
|
552
|
+
result.feeAmount = 0
|
|
553
|
+
result.outReal = 0
|
|
554
|
+
result.taxAmount = 0
|
|
555
|
+
result.buyAmount = 0
|
|
556
|
+
result.change = 0
|
|
557
|
+
result.win = false
|
|
558
|
+
}
|
|
559
|
+
|
|
374
560
|
console.log(result)
|
|
375
561
|
|
|
376
|
-
|
|
377
|
-
result.feeAmount = toSmall(result.group.feeAmount,decimals)
|
|
378
|
-
result.outReal = toSmall(result.group.outAmount,decimals)
|
|
379
|
-
result.taxAmount = toSmall(result.group.taxAmount,decimals)
|
|
380
|
-
result.backAmount = toSmall(result.group.backAmount,decimals)
|
|
381
|
-
result.buyAmount = toSmall(result.group.buyAmount,decimals)
|
|
382
|
-
result.change = toSmall(result.group.change,decimals)
|
|
383
|
-
result.win = result.group.win
|
|
384
|
-
|
|
385
|
-
result.feeRate = division(result.config.feeRate,this.pointMax)
|
|
386
|
-
result.reward = division(result.config.reward,this.pointMax)
|
|
387
|
-
result.rewardAmount = multiplication(result.reward,toSmall(outAmount,decimals))
|
|
388
|
-
result.outAmount = toSmall(outAmount,decimals)
|
|
389
|
-
result.inAmount = inAmount
|
|
562
|
+
|
|
390
563
|
return result
|
|
391
564
|
}
|
|
392
565
|
|
package/src/index.js
CHANGED
|
@@ -2,15 +2,17 @@
|
|
|
2
2
|
let AgentSwap = require("./agent-swap")
|
|
3
3
|
let SwapFactory = require("./swap-factory")
|
|
4
4
|
let SwapRouter = require("./swap-router")
|
|
5
|
-
|
|
5
|
+
let SwapLP = require("./swap-pair")
|
|
6
6
|
if (window) {
|
|
7
7
|
window.AgentSwap = AgentSwap
|
|
8
8
|
window.SwapFactory = SwapFactory
|
|
9
9
|
window.SwapRouter = SwapRouter
|
|
10
|
+
window.SwapLP = SwapLP
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
module.exports = {
|
|
13
14
|
AgentSwap,
|
|
14
15
|
SwapFactory,
|
|
15
|
-
SwapRouter
|
|
16
|
+
SwapRouter,
|
|
17
|
+
SwapLP
|
|
16
18
|
}
|
package/src/swap-pair.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
let { HI, HERC20, HERC721 } = require("h-token-staking")
|
|
2
|
+
let { abi } = require("./abi/PancakePair.json")
|
|
3
|
+
|
|
4
|
+
let { plus, reduce, multiplication, division, saveNum, charCompare,longHandle,toSmall } = require("h-token-staking/src/utils")
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SwapLP extends HI {
|
|
8
|
+
constructor({ provider, account, rpcUrl, privateKey, contract }) {
|
|
9
|
+
super({ provider, account, rpcUrl, privateKey, contract, abi })
|
|
10
|
+
this.mainToken = "0x0000000000000000000000000000000000000000"
|
|
11
|
+
this.maxVal = "999000000000000000000000000000000000000000000000000"
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async getReserves() {
|
|
16
|
+
let reserves = await this.SC.methods.getReserves().call()
|
|
17
|
+
let token0 = await this.SC.methods.token0().call()
|
|
18
|
+
let token1 = await this.SC.methods.token1().call()
|
|
19
|
+
return {
|
|
20
|
+
...reserves,
|
|
21
|
+
token0,token1
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
module.exports = SwapLP
|