In web3 wrapper when a response contains an error field we throw this rather than return response.result which is often undefined. In Signature Utils we handle the error thrown when a user rejects the signing dialogue to prevent double signing. Exposed the ZeroExTransaction JSON schema. In Website only use the MetamaskSubprovider if we can detect the provider is Metamask
38 lines
1.6 KiB
TypeScript
38 lines
1.6 KiB
TypeScript
import { eip712Utils, generatePseudoRandomSalt } from '@0xproject/order-utils';
|
|
import { SignatureType } from '@0xproject/types';
|
|
import { signTypedDataUtils } from '@0xproject/utils';
|
|
import * as ethUtil from 'ethereumjs-util';
|
|
|
|
import { signingUtils } from './signing_utils';
|
|
import { SignedTransaction } from './types';
|
|
|
|
export class TransactionFactory {
|
|
private readonly _signerBuff: Buffer;
|
|
private readonly _exchangeAddress: string;
|
|
private readonly _privateKey: Buffer;
|
|
constructor(privateKey: Buffer, exchangeAddress: string) {
|
|
this._privateKey = privateKey;
|
|
this._exchangeAddress = exchangeAddress;
|
|
this._signerBuff = ethUtil.privateToAddress(this._privateKey);
|
|
}
|
|
public newSignedTransaction(data: string, signatureType: SignatureType = SignatureType.EthSign): SignedTransaction {
|
|
const salt = generatePseudoRandomSalt();
|
|
const signerAddress = `0x${this._signerBuff.toString('hex')}`;
|
|
const executeTransactionData = {
|
|
salt,
|
|
signerAddress,
|
|
data,
|
|
};
|
|
|
|
const typedData = eip712Utils.createZeroExTransactionTypedData(executeTransactionData, this._exchangeAddress);
|
|
const eip712MessageBuffer = signTypedDataUtils.generateTypedDataHash(typedData);
|
|
const signature = signingUtils.signMessage(eip712MessageBuffer, this._privateKey, signatureType);
|
|
const signedTx = {
|
|
exchangeAddress: this._exchangeAddress,
|
|
signature: `0x${signature.toString('hex')}`,
|
|
...executeTransactionData,
|
|
};
|
|
return signedTx;
|
|
}
|
|
}
|