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