1
1
import Contract from './Contract' ;
2
+ import validator from '../validator'
3
+ import { getRingHash } from '../../relay/rpc/ring'
4
+ import { addHexPrefix , toBig , toBuffer , toFixed , toHex , toNumber } from '../../common/formatter'
5
+ import { ecsign } from 'ethereumjs-util'
2
6
3
7
const erc20Abi = require ( '../../config/abis/erc20.json' ) ;
4
8
const wethAbi = require ( '../../config/abis/weth.json' ) ;
@@ -12,7 +16,7 @@ const LoopringProtocol = new Contract(loopringProtocolAbi);
12
16
13
17
const encodeCancelOrder = ( signedOrder , amount ) => {
14
18
const {
15
- owner, tokenS, tokenB, walletAddress, authAddr,
19
+ owner, tokenS, tokenB, walletAddress, authAddr,
16
20
amountS, amountB, validSince, validUntil, lrcFee,
17
21
buyNoMoreThanAmountB,
18
22
marginSplitPercentage,
@@ -26,8 +30,41 @@ const encodeCancelOrder = (signedOrder, amount) => {
26
30
return LoopringProtocol . encodeInputs ( 'cancelOrder' , { addresses, orderValues, buyNoMoreThanAmountB, marginSplitPercentage, v, r, s} ) ;
27
31
} ;
28
32
33
+ const encodeSubmitRing = ( orders , feeRecipient , feeSelections ) => {
29
34
30
- Object . assign ( LoopringProtocol , { encodeCancelOrder} ) ;
35
+ validator . validate ( { type : 'ETH_ADDRESS' , value : feeRecipient } )
36
+ if ( feeSelections === null || feeSelections === undefined ) {
37
+ feeSelections = 0 ;
38
+ }
39
+ const rate = Math . pow ( orders . reduce ( order => ( total , order ) => {
40
+ total . times ( toBig ( order . amountS ) . div ( toBig ( order . amountB ) ) )
41
+ } ) , orders . length ) ;
42
+
43
+ const ringHash = getRingHash ( orders , feeRecipient , feeSelections ) ;
44
+ const addressList = orders . map ( order => [ order . owner , order . tokenS , order . walletAddress , order . authAddr ] )
45
+ const uintArgsList = orders . map ( order => [ order . amountS , order . amountB , order . validSince , order . validUntil , order . lrcFee , toHex ( toBig ( toFixed ( toBig ( order . amountS ) . times ( toBig ( rate ) ) ) ) ) ] )
46
+ const uint8ArgsList = orders . map ( order => [ order . marginSplitPercentage ] )
47
+ const buyNoMoreThanAmountBList = orders . map ( order => order . buyNoMoreThanAmountB )
48
+ const sigs = orders . map ( order => {
49
+ const sig = ecsign ( ringHash , toBuffer ( addHexPrefix ( order . authPrivateKey ) ) )
50
+ return {
51
+ v : toNumber ( sig . v ) ,
52
+ r : toHex ( sig . r ) ,
53
+ s : toHex ( sig . s )
54
+ }
55
+ } )
56
+ const vList = orders . map ( order => order . v ) ;
57
+ vList . push ( ...sigs . map ( sig => sig . v ) ) ;
58
+ const rList = orders . map ( order => order . r ) ;
59
+ rList . push ( ...sigs . map ( sig => sig . r ) ) ;
60
+ const sList = orders . map ( order => order . s ) ;
61
+ sList . push ( ...sigs . map ( sig => sig . s ) ) ;
62
+
63
+ return LoopringProtocol . encodeInputs ( 'submitRing' , { addressList, uintArgsList, uint8ArgsList, buyNoMoreThanAmountBList, vList, rList, sList, feeRecipient, feeSelections} )
64
+ }
65
+
66
+
67
+ Object . assign ( LoopringProtocol , { encodeCancelOrder, encodeSubmitRing} ) ;
31
68
32
69
export default {
33
70
ERC20Token,
0 commit comments