39 lines
1.6 KiB
TypeScript
39 lines
1.6 KiB
TypeScript
import { generatePseudoRandomSalt, orderHashUtils } from '@0xproject/order-utils';
|
|
import { Order, SignatureType, SignedOrder } from '@0xproject/types';
|
|
import { BigNumber } from '@0xproject/utils';
|
|
|
|
import { getLatestBlockTimestampAsync } from './block_timestamp';
|
|
import { constants } from './constants';
|
|
import { signingUtils } from './signing_utils';
|
|
|
|
export class OrderFactory {
|
|
private readonly _defaultOrderParams: Partial<Order>;
|
|
private readonly _privateKey: Buffer;
|
|
constructor(privateKey: Buffer, defaultOrderParams: Partial<Order>) {
|
|
this._defaultOrderParams = defaultOrderParams;
|
|
this._privateKey = privateKey;
|
|
}
|
|
public async newSignedOrderAsync(
|
|
customOrderParams: Partial<Order> = {},
|
|
signatureType: SignatureType = SignatureType.EthSign,
|
|
): Promise<SignedOrder> {
|
|
const tenMinutesInSeconds = 10 * 60;
|
|
const currentBlockTimestamp = await getLatestBlockTimestampAsync();
|
|
const order = ({
|
|
senderAddress: constants.NULL_ADDRESS,
|
|
expirationTimeSeconds: new BigNumber(currentBlockTimestamp).add(tenMinutesInSeconds),
|
|
salt: generatePseudoRandomSalt(),
|
|
takerAddress: constants.NULL_ADDRESS,
|
|
...this._defaultOrderParams,
|
|
...customOrderParams,
|
|
} as any) as Order;
|
|
const orderHashBuff = orderHashUtils.getOrderHashBuffer(order);
|
|
const signature = signingUtils.signMessage(orderHashBuff, this._privateKey, signatureType);
|
|
const signedOrder = {
|
|
...order,
|
|
signature: `0x${signature.toString('hex')}`,
|
|
};
|
|
return signedOrder;
|
|
}
|
|
}
|