1- import { OrderSide , type PositionId , toBaseUnits } from '@polymarket/bindings' ;
1+ import {
2+ type OrderSide ,
3+ type PositionId ,
4+ toBaseUnits ,
5+ } from '@polymarket/bindings' ;
26import type { RfqSignedOrder } from '@polymarket/bindings/combos' ;
37import type { EvmAddress , EvmSignature , HexString } from '@polymarket/types' ;
48import { SigningError } from '../../errors' ;
59import {
10+ calculateExchangeOrderMakerAmount ,
11+ calculateExchangeOrderTakerAmount ,
612 createExchangeOrderSignature ,
713 createExchangeOrderTypedDataPayload ,
8- ExchangeOrderProtocolVersion ,
14+ createExchangeV3OrderDomain ,
15+ encodeExchangeOrderSide ,
16+ generateExchangeOrderSalt ,
917} from '../../exchange' ;
1018import type { Signer } from '../../types' ;
1119import type { AccountIdentity } from '../../wallet' ;
@@ -29,19 +37,31 @@ export async function signRfqQuoteOrder(
2937 params : SignRfqQuoteOrderParams ,
3038) : Promise < RfqSignedOrder > {
3139 const identity = resolveOrderIdentity ( params . account ) ;
40+ const domain = createExchangeV3OrderDomain ( {
41+ chainId : params . chainId ,
42+ exchange : params . exchange ,
43+ } ) ;
3244 const order : Omit < RfqSignedOrder , 'signature' > = {
3345 builder : BYTES32_ZERO ,
3446 maker : identity . maker ,
3547 makerAmount : toBaseUnits (
36- makerAmount ( params . orderSide , params . orderPrice , params . size ) ,
48+ calculateExchangeOrderMakerAmount (
49+ params . orderSide ,
50+ params . orderPrice ,
51+ params . size ,
52+ ) ,
3753 ) ,
3854 metadata : BYTES32_ZERO ,
39- salt : generateOrderSalt ( ) . toString ( ) ,
40- side : encodeOrderSide ( params . orderSide ) ,
55+ salt : generateExchangeOrderSalt ( ) . toString ( ) ,
56+ side : encodeExchangeOrderSide ( params . orderSide ) ,
4157 signatureType : identity . signatureType ,
4258 signer : identity . signer ,
4359 takerAmount : toBaseUnits (
44- takerAmount ( params . orderSide , params . orderPrice , params . size ) ,
60+ calculateExchangeOrderTakerAmount (
61+ params . orderSide ,
62+ params . orderPrice ,
63+ params . size ,
64+ ) ,
4565 ) ,
4666 timestamp : Math . floor ( Date . now ( ) / 1000 ) . toString ( ) ,
4767 tokenId : params . tokenId ,
@@ -50,56 +70,14 @@ export async function signRfqQuoteOrder(
5070 let signature : EvmSignature ;
5171 try {
5272 signature = await params . signer . signTypedData (
53- createExchangeOrderTypedDataPayload ( {
54- domain : createRfqExchangeDomain ( params ) ,
55- order,
56- } ) ,
73+ createExchangeOrderTypedDataPayload ( { domain, order } ) ,
5774 ) ;
5875 } catch ( error ) {
5976 throw SigningError . fromError ( error , 'Could not sign the RFQ quote order.' ) ;
6077 }
6178
6279 return {
6380 ...order ,
64- signature : createExchangeOrderSignature ( {
65- domain : createRfqExchangeDomain ( params ) ,
66- order,
67- signature,
68- } ) ,
81+ signature : createExchangeOrderSignature ( { domain, order, signature } ) ,
6982 } ;
7083}
71-
72- function createRfqExchangeDomain ( params : SignRfqQuoteOrderParams ) {
73- return {
74- chainId : params . chainId ,
75- exchange : params . exchange ,
76- protocolVersion : ExchangeOrderProtocolVersion . V3 ,
77- } ;
78- }
79-
80- function makerAmount ( side : OrderSide , price : bigint , size : bigint ) : string {
81- if ( side === OrderSide . SELL ) return size . toString ( ) ;
82-
83- return ( ( price * size + 999_999n ) / 1_000_000n ) . toString ( ) ;
84- }
85-
86- function takerAmount ( side : OrderSide , price : bigint , size : bigint ) : string {
87- if ( side === OrderSide . SELL ) {
88- return ( ( price * size ) / 1_000_000n ) . toString ( ) ;
89- }
90-
91- return size . toString ( ) ;
92- }
93-
94- function encodeOrderSide ( side : OrderSide ) : 0 | 1 {
95- return side === OrderSide . BUY ? 0 : 1 ;
96- }
97-
98- function generateOrderSalt ( ) : bigint {
99- const bytes = new Uint8Array ( 8 ) ;
100- globalThis . crypto . getRandomValues ( bytes ) ;
101-
102- return BigInt (
103- `0x${ Array . from ( bytes , ( byte ) => byte . toString ( 16 ) . padStart ( 2 , '0' ) ) . join ( '' ) } ` ,
104- ) ;
105- }
0 commit comments