Add eth_signTypedData support to our wallet subproviders
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { BlockchainLifecycle } from '@0xproject/dev-utils';
|
||||
import { assetDataUtils, eip712Utils, orderHashUtils } from '@0xproject/order-utils';
|
||||
import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
|
||||
import { SignedOrder } from '@0xproject/types';
|
||||
import { BigNumber } from '@0xproject/utils';
|
||||
import * as chai from 'chai';
|
||||
@@ -126,22 +126,6 @@ describe('Exchange libs', () => {
|
||||
});
|
||||
|
||||
describe('LibOrder', () => {
|
||||
describe('getOrderSchema', () => {
|
||||
it('should output the correct order schema hash', async () => {
|
||||
const orderSchema = await libs.getOrderSchemaHash.callAsync();
|
||||
const schemaHashBuffer = orderHashUtils._getOrderSchemaBuffer();
|
||||
const schemaHashHex = `0x${schemaHashBuffer.toString('hex')}`;
|
||||
expect(schemaHashHex).to.be.equal(orderSchema);
|
||||
});
|
||||
});
|
||||
describe('getDomainSeparatorSchema', () => {
|
||||
it('should output the correct domain separator schema hash', async () => {
|
||||
const domainSeparatorSchema = await libs.getDomainSeparatorSchemaHash.callAsync();
|
||||
const domainSchemaBuffer = eip712Utils._getDomainSeparatorSchemaBuffer();
|
||||
const schemaHashHex = `0x${domainSchemaBuffer.toString('hex')}`;
|
||||
expect(schemaHashHex).to.be.equal(domainSeparatorSchema);
|
||||
});
|
||||
});
|
||||
describe('getOrderHash', () => {
|
||||
it('should output the correct orderHash', async () => {
|
||||
signedOrder = await orderFactory.newSignedOrderAsync();
|
||||
|
@@ -1,16 +1,22 @@
|
||||
import { EIP712Schema, EIP712Types, eip712Utils, generatePseudoRandomSalt } from '@0xproject/order-utils';
|
||||
import {
|
||||
EIP712_DOMAIN_NAME,
|
||||
EIP712_DOMAIN_SCHEMA,
|
||||
EIP712_DOMAIN_VERSION,
|
||||
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';
|
||||
|
||||
const EIP712_ZEROEX_TRANSACTION_SCHEMA: EIP712Schema = {
|
||||
const EIP712_ZEROEX_TRANSACTION_SCHEMA = {
|
||||
name: 'ZeroExTransaction',
|
||||
parameters: [
|
||||
{ name: 'salt', type: EIP712Types.Uint256 },
|
||||
{ name: 'signerAddress', type: EIP712Types.Address },
|
||||
{ name: 'data', type: EIP712Types.Bytes },
|
||||
{ name: 'salt', type: 'uint256' },
|
||||
{ name: 'signerAddress', type: 'address' },
|
||||
{ name: 'data', type: 'bytes' },
|
||||
],
|
||||
};
|
||||
|
||||
@@ -27,20 +33,30 @@ export class TransactionFactory {
|
||||
const salt = generatePseudoRandomSalt();
|
||||
const signerAddress = `0x${this._signerBuff.toString('hex')}`;
|
||||
const executeTransactionData = {
|
||||
salt,
|
||||
salt: salt.toString(),
|
||||
signerAddress,
|
||||
data,
|
||||
};
|
||||
const executeTransactionHashBuff = eip712Utils.structHash(
|
||||
EIP712_ZEROEX_TRANSACTION_SCHEMA,
|
||||
executeTransactionData,
|
||||
);
|
||||
const txHash = eip712Utils.createEIP712Message(executeTransactionHashBuff, this._exchangeAddress);
|
||||
const signature = signingUtils.signMessage(txHash, this._privateKey, signatureType);
|
||||
const typedData = {
|
||||
types: {
|
||||
EIP712Domain: EIP712_DOMAIN_SCHEMA.parameters,
|
||||
ZeroExTransaction: EIP712_ZEROEX_TRANSACTION_SCHEMA.parameters,
|
||||
},
|
||||
domain: {
|
||||
name: EIP712_DOMAIN_NAME,
|
||||
version: EIP712_DOMAIN_VERSION,
|
||||
verifyingContract: this._exchangeAddress,
|
||||
},
|
||||
message: executeTransactionData,
|
||||
primaryType: EIP712_ZEROEX_TRANSACTION_SCHEMA.name,
|
||||
};
|
||||
const eip712MessageBuffer = signTypedDataUtils.signTypedDataHash(typedData);
|
||||
const signature = signingUtils.signMessage(eip712MessageBuffer, this._privateKey, signatureType);
|
||||
const signedTx = {
|
||||
exchangeAddress: this._exchangeAddress,
|
||||
signature: `0x${signature.toString('hex')}`,
|
||||
...executeTransactionData,
|
||||
salt,
|
||||
};
|
||||
return signedTx;
|
||||
}
|
||||
|
Reference in New Issue
Block a user