63 lines
2.4 KiB
TypeScript
63 lines
2.4 KiB
TypeScript
import { BaseContract } from '@0x/base-contract';
|
|
import { ApprovalFactory, SignedCoordinatorApproval } from '@0x/contracts-coordinator';
|
|
import { SignatureType, SignedZeroExTransaction } from '@0x/types';
|
|
|
|
import { Actor, ActorConfig, Constructor } from './base';
|
|
|
|
interface FeeRecipientConfig extends ActorConfig {
|
|
verifyingContract?: BaseContract;
|
|
}
|
|
|
|
export interface FeeRecipientInterface {
|
|
approvalFactory?: ApprovalFactory;
|
|
signCoordinatorApprovalAsync: (
|
|
transaction: SignedZeroExTransaction,
|
|
txOrigin: string,
|
|
signatureType?: SignatureType,
|
|
) => Promise<SignedCoordinatorApproval>;
|
|
}
|
|
|
|
/**
|
|
* This mixin encapsulates functionality associated with fee recipients within the 0x ecosystem.
|
|
* As of writing, the only extra functionality provided is signing Coordinator approvals.
|
|
*/
|
|
export function FeeRecipientMixin<TBase extends Constructor>(Base: TBase): TBase & Constructor<FeeRecipientInterface> {
|
|
return class extends Base {
|
|
public readonly actor: Actor;
|
|
public readonly approvalFactory?: ApprovalFactory;
|
|
|
|
/**
|
|
* The mixin pattern requires that this constructor uses `...args: any[]`, but this class
|
|
* really expects a single `FeeRecipientConfig` parameter (assuming `Actor` is used as the
|
|
* base class).
|
|
*/
|
|
constructor(...args: any[]) {
|
|
// tslint:disable-next-line:no-inferred-empty-object-type
|
|
super(...args);
|
|
this.actor = (this as any) as Actor;
|
|
this.actor.mixins.push('FeeRecipient');
|
|
|
|
const { verifyingContract } = args[0] as FeeRecipientConfig;
|
|
if (verifyingContract !== undefined) {
|
|
this.approvalFactory = new ApprovalFactory(this.actor.privateKey, verifyingContract.address);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Signs an coordinator transaction.
|
|
*/
|
|
public async signCoordinatorApprovalAsync(
|
|
transaction: SignedZeroExTransaction,
|
|
txOrigin: string,
|
|
signatureType: SignatureType = SignatureType.EthSign,
|
|
): Promise<SignedCoordinatorApproval> {
|
|
if (this.approvalFactory === undefined) {
|
|
throw new Error('No verifying contract provided in FeeRecipient constructor');
|
|
}
|
|
return this.approvalFactory.newSignedApproval(transaction, txOrigin, signatureType);
|
|
}
|
|
};
|
|
}
|
|
|
|
export class FeeRecipient extends FeeRecipientMixin(Actor) {}
|