diff options
Diffstat (limited to 'packages/order-utils/src')
-rw-r--r-- | packages/order-utils/src/asset_proxy_utils.ts | 20 | ||||
-rw-r--r-- | packages/order-utils/src/signature_utils.ts | 41 |
2 files changed, 31 insertions, 30 deletions
diff --git a/packages/order-utils/src/asset_proxy_utils.ts b/packages/order-utils/src/asset_proxy_utils.ts index 11f81c656..5a084deba 100644 --- a/packages/order-utils/src/asset_proxy_utils.ts +++ b/packages/order-utils/src/asset_proxy_utils.ts @@ -3,8 +3,8 @@ import { BigNumber } from '@0xproject/utils'; import BN = require('bn.js'); import ethUtil = require('ethereumjs-util'); -const ERC20_PROXY_METADATA_BYTE_LENGTH = 21; -const ERC721_PROXY_METADATA_BYTE_LENGTH = 53; +const ERC20_PROXY_METADATA_BYTE_LENGTH = 20; +const ERC721_PROXY_METADATA_BYTE_LENGTH = 52; export const assetProxyUtils = { encodeAssetProxyId(assetProxyId: AssetProxyId): Buffer { @@ -43,7 +43,7 @@ export const assetProxyUtils = { encodeERC20ProxyData(tokenAddress: string): string { const encodedAssetProxyId = assetProxyUtils.encodeAssetProxyId(AssetProxyId.ERC20); const encodedAddress = assetProxyUtils.encodeAddress(tokenAddress); - const encodedMetadata = Buffer.concat([encodedAssetProxyId, encodedAddress]); + const encodedMetadata = Buffer.concat([encodedAddress, encodedAssetProxyId]); const encodedMetadataHex = ethUtil.bufferToHex(encodedMetadata); return encodedMetadataHex; }, @@ -56,7 +56,7 @@ export const assetProxyUtils = { }`, ); } - const encodedAssetProxyId = encodedProxyMetadata.slice(0, 1); + const encodedAssetProxyId = encodedProxyMetadata.slice(-1); const assetProxyId = assetProxyUtils.decodeAssetProxyId(encodedAssetProxyId); if (assetProxyId !== AssetProxyId.ERC20) { throw new Error( @@ -65,7 +65,7 @@ export const assetProxyUtils = { }), but got ${assetProxyId}`, ); } - const encodedTokenAddress = encodedProxyMetadata.slice(1, ERC20_PROXY_METADATA_BYTE_LENGTH); + const encodedTokenAddress = encodedProxyMetadata.slice(0, ERC20_PROXY_METADATA_BYTE_LENGTH); const tokenAddress = assetProxyUtils.decodeAddress(encodedTokenAddress); const erc20ProxyData = { assetProxyId, @@ -77,7 +77,7 @@ export const assetProxyUtils = { const encodedAssetProxyId = assetProxyUtils.encodeAssetProxyId(AssetProxyId.ERC721); const encodedAddress = assetProxyUtils.encodeAddress(tokenAddress); const encodedTokenId = assetProxyUtils.encodeUint256(tokenId); - const encodedMetadata = Buffer.concat([encodedAssetProxyId, encodedAddress, encodedTokenId]); + const encodedMetadata = Buffer.concat([encodedAddress, encodedTokenId, encodedAssetProxyId]); const encodedMetadataHex = ethUtil.bufferToHex(encodedMetadata); return encodedMetadataHex; }, @@ -90,7 +90,7 @@ export const assetProxyUtils = { }`, ); } - const encodedAssetProxyId = encodedProxyMetadata.slice(0, 1); + const encodedAssetProxyId = encodedProxyMetadata.slice(-1); const assetProxyId = assetProxyUtils.decodeAssetProxyId(encodedAssetProxyId); if (assetProxyId !== AssetProxyId.ERC721) { throw new Error( @@ -99,8 +99,8 @@ export const assetProxyUtils = { }), but got ${assetProxyId}`, ); } - const addressOffset = 21; - const encodedTokenAddress = encodedProxyMetadata.slice(1, addressOffset); + const addressOffset = 20; + const encodedTokenAddress = encodedProxyMetadata.slice(0, addressOffset); const tokenAddress = assetProxyUtils.decodeAddress(encodedTokenAddress); const encodedTokenId = encodedProxyMetadata.slice(addressOffset, ERC721_PROXY_METADATA_BYTE_LENGTH); const tokenId = assetProxyUtils.decodeUint256(encodedTokenId); @@ -120,7 +120,7 @@ export const assetProxyUtils = { }`, ); } - const encodedAssetProxyId = encodedProxyMetadata.slice(0, 1); + const encodedAssetProxyId = encodedProxyMetadata.slice(-1); const assetProxyId = assetProxyUtils.decodeAssetProxyId(encodedAssetProxyId); return assetProxyId; }, diff --git a/packages/order-utils/src/signature_utils.ts b/packages/order-utils/src/signature_utils.ts index f1466973c..8e387a6ae 100644 --- a/packages/order-utils/src/signature_utils.ts +++ b/packages/order-utils/src/signature_utils.ts @@ -34,41 +34,40 @@ export async function isValidSignatureAsync( case SignatureType.Invalid: return false; - case SignatureType.Caller: - // HACK: We currently do not "validate" the caller signature type. - // It can only be validated during Exchange contract execution. - throw new Error('Caller signature type cannot be validated off-chain'); - - // TODO: Rename this type to `EthSign` b/c multiple of the signature - // types use ECRecover... - case SignatureType.Ecrecover: { - const ecSignature = parseECSignature(signature); - const prefixedMessageHex = addSignedMessagePrefix(data, MessagePrefixType.EthSign); - return isValidECSignature(prefixedMessageHex, ecSignature, signerAddress); - } - case SignatureType.EIP712: { const ecSignature = parseECSignature(signature); return isValidECSignature(data, ecSignature, signerAddress); } - case SignatureType.Trezor: { - const prefixedMessageHex = addSignedMessagePrefix(data, MessagePrefixType.Trezor); + case SignatureType.EthSign: { const ecSignature = parseECSignature(signature); + const prefixedMessageHex = addSignedMessagePrefix(data, MessagePrefixType.EthSign); return isValidECSignature(prefixedMessageHex, ecSignature, signerAddress); } - // TODO: Rename Contract -> Wallet - case SignatureType.Contract: { + case SignatureType.Caller: + // HACK: We currently do not "validate" the caller signature type. + // It can only be validated during Exchange contract execution. + throw new Error('Caller signature type cannot be validated off-chain'); + + case SignatureType.Wallet: { const signerContract = new ISignerContract(artifacts.ISigner.abi, signerAddress, provider); const isValid = await signerContract.isValidSignature.callAsync(data, signature); return isValid; } + // TODO: Add SignatureType.Validator + case SignatureType.PreSigned: { return isValidPresignedSignatureAsync(provider, data, signature, signerAddress); } + case SignatureType.Trezor: { + const prefixedMessageHex = addSignedMessagePrefix(data, MessagePrefixType.Trezor); + const ecSignature = parseECSignature(signature); + return isValidECSignature(prefixedMessageHex, ecSignature, signerAddress); + } + default: throw new Error(`Unhandled SignatureType: ${signatureTypeIndexIfExists}`); } @@ -205,15 +204,16 @@ function hashTrezorPersonalMessage(message: Buffer): Buffer { } function parseECSignature(signature: string): ECSignature { + assert.isHexString('signature', signature); const signatureTypeIndexIfExists = getSignatureTypeIndexIfExists(signature); - const ecSignatureTypes = [SignatureType.Ecrecover, SignatureType.EIP712, SignatureType.Trezor]; + const ecSignatureTypes = [SignatureType.EthSign, SignatureType.EIP712, SignatureType.Trezor]; const isECSignatureType = _.includes(ecSignatureTypes, signatureTypeIndexIfExists); if (!isECSignatureType) { throw new Error(`Cannot parse non-ECSignature type: ${signatureTypeIndexIfExists}`); } // tslint:disable-next-line:custom-no-magic-numbers - const vrsHex = `0x${signature.substr(4)}`; + const vrsHex = signature.slice(0, -2); const ecSignature = parseSignatureHexAsVRS(vrsHex); return ecSignature; @@ -221,7 +221,8 @@ function parseECSignature(signature: string): ECSignature { function getSignatureTypeIndexIfExists(signature: string): number { const unprefixedSignature = ethUtil.stripHexPrefix(signature); - const signatureTypeHex = unprefixedSignature.substr(0, 2); + // tslint:disable-next-line:custom-no-magic-numbers + const signatureTypeHex = unprefixedSignature.slice(-2); const base = 16; const signatureTypeInt = parseInt(signatureTypeHex, base); return signatureTypeInt; |