aboutsummaryrefslogtreecommitdiffstats
path: root/packages/order-utils/src/signature_utils.ts
diff options
context:
space:
mode:
authorFabio Berger <me@fabioberger.com>2018-06-01 12:23:08 +0800
committerFabio Berger <me@fabioberger.com>2018-06-01 12:23:08 +0800
commit719c432ca8be33212b186dc989f25b43674463d8 (patch)
tree23fd8675e1ae66ae30f925bd735a301c016b9d64 /packages/order-utils/src/signature_utils.ts
parente654616b6d759883a287c23c5a10b56dec90963c (diff)
downloaddexon-sol-tools-719c432ca8be33212b186dc989f25b43674463d8.tar
dexon-sol-tools-719c432ca8be33212b186dc989f25b43674463d8.tar.gz
dexon-sol-tools-719c432ca8be33212b186dc989f25b43674463d8.tar.bz2
dexon-sol-tools-719c432ca8be33212b186dc989f25b43674463d8.tar.lz
dexon-sol-tools-719c432ca8be33212b186dc989f25b43674463d8.tar.xz
dexon-sol-tools-719c432ca8be33212b186dc989f25b43674463d8.tar.zst
dexon-sol-tools-719c432ca8be33212b186dc989f25b43674463d8.zip
Rename ISigner to IWallet and implement SignatureType.Validator
Diffstat (limited to 'packages/order-utils/src/signature_utils.ts')
-rw-r--r--packages/order-utils/src/signature_utils.ts42
1 files changed, 39 insertions, 3 deletions
diff --git a/packages/order-utils/src/signature_utils.ts b/packages/order-utils/src/signature_utils.ts
index 8e387a6ae..427448260 100644
--- a/packages/order-utils/src/signature_utils.ts
+++ b/packages/order-utils/src/signature_utils.ts
@@ -7,7 +7,8 @@ import * as _ from 'lodash';
import { artifacts } from './artifacts';
import { assert } from './assert';
import { ExchangeContract } from './generated_contract_wrappers/exchange';
-import { ISignerContract } from './generated_contract_wrappers/i_signer';
+import { IWalletContract } from './generated_contract_wrappers/i_signer';
+import { IValidatorContract } from './generated_contract_wrappers/i_validator';
import { MessagePrefixOpts, MessagePrefixType, OrderError } from './types';
/**
@@ -51,12 +52,27 @@ export async function isValidSignatureAsync(
throw new Error('Caller signature type cannot be validated off-chain');
case SignatureType.Wallet: {
- const signerContract = new ISignerContract(artifacts.ISigner.abi, signerAddress, provider);
+ const signerContract = new IWalletContract(artifacts.IWallet.abi, signerAddress, provider);
const isValid = await signerContract.isValidSignature.callAsync(data, signature);
return isValid;
}
- // TODO: Add SignatureType.Validator
+ case SignatureType.Validator: {
+ const validatorAddress = getValidatorAddressFromSignature(signature);
+ const exchangeContract = new ExchangeContract(artifacts.Exchange.abi, signerAddress, provider);
+ const isValidatorApproved = await exchangeContract.allowedValidators.callAsync(
+ signerAddress,
+ validatorAddress,
+ );
+ if (!isValidatorApproved) {
+ throw new Error(`Validator ${validatorAddress} was not pre-approved by ${signerAddress}.`);
+ }
+
+ const validatorSignature = getValidatorSignatureFromSignature(signature);
+ const validatorContract = new IValidatorContract(artifacts.IValidator.abi, signerAddress, provider);
+ const isValid = await validatorContract.isValidSignature.callAsync(data, signerAddress, validatorSignature);
+ return isValid;
+ }
case SignatureType.PreSigned: {
return isValidPresignedSignatureAsync(provider, data, signature, signerAddress);
@@ -219,6 +235,26 @@ function parseECSignature(signature: string): ECSignature {
return ecSignature;
}
+function getValidatorSignatureFromSignature(signature: string): string {
+ const signatureTypeIndex = getSignatureTypeIndexIfExists(signature);
+ if (signatureTypeIndex !== SignatureType.Validator) {
+ throw new Error('Cannot get validator address from non-validator signature');
+ }
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const validatorSignature = signature.slice(0, -22);
+ return validatorSignature;
+}
+
+function getValidatorAddressFromSignature(signature: string): string {
+ const signatureTypeIndex = getSignatureTypeIndexIfExists(signature);
+ if (signatureTypeIndex !== SignatureType.Validator) {
+ throw new Error('Cannot get validator address from non-validator signature');
+ }
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const validatorAddress = signature.slice(-22, -2);
+ return `0x${validatorAddress}`;
+}
+
function getSignatureTypeIndexIfExists(signature: string): number {
const unprefixedSignature = ethUtil.stripHexPrefix(signature);
// tslint:disable-next-line:custom-no-magic-numbers