Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import Erc20FeeProxyPaymentNetwork from './erc20/fee-proxy-contract';

const CURRENT_VERSION = '0.1.0';

export default class AnyToErc20ProxyPaymentNetwork extends Erc20FeeProxyPaymentNetwork {
export default class AnyToErc20ProxyPaymentNetwork extends Erc20FeeProxyPaymentNetwork<ExtensionTypes.PnAnyToErc20.ICreationParameters> {
public constructor(
currencyManager: ICurrencyManager,
extensionId: ExtensionTypes.PAYMENT_NETWORK_ID = ExtensionTypes.PAYMENT_NETWORK_ID
Expand All @@ -28,9 +28,12 @@ export default class AnyToErc20ProxyPaymentNetwork extends Erc20FeeProxyPaymentN
public createCreationAction(
creationParameters: ExtensionTypes.PnAnyToErc20.ICreationParameters,
): ExtensionTypes.IAction {
if (!creationParameters.acceptedTokens || creationParameters.acceptedTokens.length === 0) {
if (!creationParameters.acceptedTokens) {
throw Error('acceptedTokens is required');
}
if (creationParameters.acceptedTokens.length === 0) {
throw Error('acceptedTokens cannot be empty');
}
Comment on lines +31 to +36
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a change in error message to make it clearer

if (creationParameters.acceptedTokens.some((address) => !this.isValidAddress(address))) {
throw Error('acceptedTokens must contains only valid ethereum addresses');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import EthereumFeeProxyPaymentNetwork from './ethereum/fee-proxy-contract';

const CURRENT_VERSION = '0.2.0';

export default class AnyToEthProxyPaymentNetwork extends EthereumFeeProxyPaymentNetwork {
export default class AnyToEthProxyPaymentNetwork extends EthereumFeeProxyPaymentNetwork<ExtensionTypes.PnAnyToAnyConversion.ICreationParameters> {
public constructor(currencyManager: ICurrencyManager) {
super(currencyManager, ExtensionTypes.PAYMENT_NETWORK_ID.ANY_TO_ETH_PROXY, CURRENT_VERSION);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { CurrencyTypes, ExtensionTypes, RequestLogicTypes } from '@requestnetwor
import { InvalidPaymentAddressError, UnsupportedNetworkError } from './address-based';
import { ICurrencyManager } from '@requestnetwork/currency';

export default abstract class AnyToNativeTokenPaymentNetwork extends FeeReferenceBasedPaymentNetwork {
export default abstract class AnyToNativeTokenPaymentNetwork extends FeeReferenceBasedPaymentNetwork<ExtensionTypes.PnAnyToAnyConversion.ICreationParameters> {
protected constructor(
currencyManager: ICurrencyManager,
extensionId: ExtensionTypes.PAYMENT_NETWORK_ID,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ describe('extensions/payment-network/erc20/any-to-erc20-fee-proxy-contract', ()
paymentAddress: '0x0000000000000000000000000000000000000001',
network: 'rinkeby',
salt: 'ea3bc7caf64110ca',
});
} as any);
}).toThrowError('acceptedTokens is required');
});

Expand Down
3 changes: 1 addition & 2 deletions packages/integration-test/test/scheduled/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,7 @@ export const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = {
createAddPaymentInstructionAction,
createAddRefundInstructionAction,
} as any as Extension.PnFeeReferenceBased.IFeeReferenceBased<Extension.PnFeeReferenceBased.ICreationParameters>,
anyToEthProxy:
{} as Extension.PnFeeReferenceBased.IFeeReferenceBased<Extension.PnFeeReferenceBased.ICreationParameters>,
anyToEthProxy: {} as Extension.PnAnyToEth.IAnyToEth,
anyToNativeToken:
{} as Extension.PnFeeReferenceBased.IFeeReferenceBased<Extension.PnFeeReferenceBased.ICreationParameters>[],
erc20TransferableReceivable: {
Expand Down
2 changes: 1 addition & 1 deletion packages/payment-detection/src/any-to-any-detector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { generate8randomBytes } from '@requestnetwork/utils';
* Abstract class to extend to get the payment balance of conversion requests
*/
export abstract class AnyToAnyDetector<
TExtension extends ExtensionTypes.PnFeeReferenceBased.IFeeReferenceBased,
TExtension extends ExtensionTypes.PnFeeReferenceBased.IFeeReferenceBased<any>,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are a few any introduced in the type constraints. I think they are fine, as they are only on abstract classes, and concrete implementations enforce a type.

TPaymentEventParameters extends Partial<ExtensionTypes.PnFeeReferenceBased.IAddFeeParameters>,
> extends FeeReferenceBasedDetector<TExtension, TPaymentEventParameters> {
/**
Expand Down
2 changes: 1 addition & 1 deletion packages/payment-detection/src/any/any-to-erc20-proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export class AnyToERC20PaymentDetector extends ERC20FeeProxyPaymentDetectorBase<
* @returns The extensionData object
*/
public async createExtensionsDataForCreation(
paymentNetworkCreationParameters: PaymentTypes.IAnyToErc20CreationParameters,
paymentNetworkCreationParameters: ExtensionTypes.PnAnyToErc20.ICreationParameters,
): Promise<ExtensionTypes.IAction> {
// If no salt is given, generate one
const salt = paymentNetworkCreationParameters.salt || (await generate8randomBytes());
Expand Down
2 changes: 1 addition & 1 deletion packages/payment-detection/src/declarative.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { notNull } from '@requestnetwork/utils';
* Handles payment detection for a declarative request, or derived.
*/
export abstract class DeclarativePaymentDetectorBase<
TExtension extends ExtensionTypes.PnAnyDeclarative.IAnyDeclarative,
TExtension extends ExtensionTypes.PnAnyDeclarative.IAnyDeclarative<any>,
TPaymentEventParameters extends PaymentTypes.IDeclarativePaymentEventParameters<unknown>,
> extends PaymentDetectorBase<TExtension, TPaymentEventParameters> {
protected constructor(
Expand Down
2 changes: 1 addition & 1 deletion packages/payment-detection/src/erc20/fee-proxy-contract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const PROXY_CONTRACT_ADDRESS_MAP = {
*/

export abstract class ERC20FeeProxyPaymentDetectorBase<
TExtension extends ExtensionTypes.PnFeeReferenceBased.IFeeReferenceBased,
TExtension extends ExtensionTypes.PnFeeReferenceBased.IFeeReferenceBased<any>,
TPaymentEventParameters extends PaymentTypes.IERC20FeePaymentEventParameters,
> extends FeeReferenceBasedDetector<TExtension, TPaymentEventParameters> {
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { generate8randomBytes } from '@requestnetwork/utils';
* Abstract class to extend to get the payment balance of reference based requests
*/
export abstract class FeeReferenceBasedDetector<
TExtension extends ExtensionTypes.PnFeeReferenceBased.IFeeReferenceBased,
TExtension extends ExtensionTypes.PnFeeReferenceBased.IFeeReferenceBased<any>,
TPaymentEventParameters extends PaymentTypes.IDeclarativePaymentEventParameters<string> & {
feeAddress?: string;
feeAmount?: string;
Expand Down
6 changes: 5 additions & 1 deletion packages/payment-detection/src/payment-detector-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ import {
export abstract class PaymentDetectorBase<
TExtension extends ExtensionTypes.IExtension,
TPaymentEventParameters extends PaymentTypes.GenericEventParameters,
> implements PaymentTypes.IPaymentNetwork<TPaymentEventParameters>
> implements
PaymentTypes.IPaymentNetwork<
TPaymentEventParameters,
TExtension extends ExtensionTypes.IExtension<infer U> ? U : never
>
{
protected constructor(
public readonly paymentNetworkId: ExtensionTypes.PAYMENT_NETWORK_ID,
Expand Down
18 changes: 8 additions & 10 deletions packages/payment-detection/src/payment-network-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,15 @@ export class PaymentNetworkFactory {
* @param paymentChain Different from request.currency.network for on-chain conversion payment networks (any-to-something)
* @returns the module to handle the payment network
*/
public createPaymentNetwork(
paymentNetworkId: ExtensionTypes.PAYMENT_NETWORK_ID,
public createPaymentNetwork<PN_ID extends ExtensionTypes.PAYMENT_NETWORK_ID>(
paymentNetworkId: PN_ID,
currencyType: RequestLogicTypes.CURRENCY,
paymentChain?: CurrencyTypes.ChainName,
paymentNetworkVersion?: string,
): PaymentTypes.IPaymentNetwork {
): PaymentTypes.IPaymentNetwork<
PaymentTypes.GenericEventParameters,
Extract<PaymentTypes.PaymentNetworkCreateParameters, { id: PN_ID }>['parameters']
> {
const network = paymentChain ?? 'mainnet';
const currencyPaymentMap =
supportedPaymentNetwork[currencyType]?.[network] ||
Expand Down Expand Up @@ -171,7 +174,7 @@ export class PaymentNetworkFactory {
*/
public getPaymentNetworkFromRequest(
request: RequestLogicTypes.IRequest,
): PaymentTypes.IPaymentNetwork | null {
): PaymentTypes.IPaymentNetwork<PaymentTypes.GenericEventParameters, any> | null {
const pn = getPaymentNetworkExtension(request);
if (!pn) {
return null;
Expand All @@ -180,11 +183,6 @@ export class PaymentNetworkFactory {
const detectionChain = pn.values?.network ?? request.currency.network;

const { id, version } = pn;
return this.createPaymentNetwork(
id as unknown as ExtensionTypes.PAYMENT_NETWORK_ID,
request.currency.type,
detectionChain,
version,
);
return this.createPaymentNetwork(id, request.currency.type, detectionChain, version);
}
}
2 changes: 1 addition & 1 deletion packages/payment-detection/src/reference-based-detector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { generate8randomBytes } from '@requestnetwork/utils';
* Abstract class to extend to get the payment balance of reference based requests
*/
export abstract class ReferenceBasedDetector<
TExtension extends ExtensionTypes.PnReferenceBased.IReferenceBased,
TExtension extends ExtensionTypes.PnReferenceBased.IReferenceBased<any>,
TPaymentEventParameters extends PaymentTypes.IDeclarativePaymentEventParameters<string>,
> extends DeclarativePaymentDetectorBase<
TExtension,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ describe('api/any/conversion-fee-proxy-contract', () => {
it('can createExtensionsDataForCreation without salt', async () => {
await anyToErc20Proxy.createExtensionsDataForCreation({
paymentAddress: 'ethereum address',
acceptedTokens: [],
network: 'mainnet',
});

// Can't check parameters since salt is generated in createExtensionsDataForCreation
Expand Down
4 changes: 3 additions & 1 deletion packages/request-client.js/src/api/request-network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,9 @@ export default class RequestNetwork {
if (paymentNetwork) {
// create the extensions data for the payment network
copiedRequestParameters.extensionsData.push(
await paymentNetwork.createExtensionsDataForCreation(parameters.paymentNetwork?.parameters),
await paymentNetwork.createExtensionsDataForCreation(
parameters.paymentNetwork?.parameters || {},
),
);
}

Expand Down
2 changes: 1 addition & 1 deletion packages/types/src/advanced-logic-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export interface IAdvancedLogicExtensions {
// FIXME: should be Extension.PnReferenceBased.IReferenceBased<Extension.PnStreamReferenceBased.ICreationParameters>
erc777Stream: any;
feeProxyContractEth: Extension.PnFeeReferenceBased.IFeeReferenceBased<Extension.PnFeeReferenceBased.ICreationParameters>;
anyToEthProxy: Extension.PnFeeReferenceBased.IFeeReferenceBased<Extension.PnFeeReferenceBased.ICreationParameters>;
anyToEthProxy: Extension.PnFeeReferenceBased.IFeeReferenceBased<Extension.PnAnyToEth.ICreationParameters>;
anyToNativeToken: Extension.PnFeeReferenceBased.IFeeReferenceBased<Extension.PnFeeReferenceBased.ICreationParameters>[];
erc20TransferableReceivable: Extension.PnFeeReferenceBased.IFeeReferenceBased<Extension.PnFeeReferenceBased.ICreationParameters>;
}
Expand Down
5 changes: 2 additions & 3 deletions packages/types/src/extensions/pn-any-to-erc20-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ export type IAnyToERC20 = PnAnyToAnyConversion.IConversionReferenceBased<ICreati

/** Parameters for the creation action */
export interface ICreationParameters extends PnAnyToAnyConversion.ICreationParameters {
network?: EvmChainName;
// FIXME: should be mandatory according to AnyToErc20ProxyPaymentNetwork createCreationAction() logic
acceptedTokens?: string[];
network: EvmChainName;
acceptedTokens: string[];
Comment on lines +9 to +10
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

match what's expected by the PN! 🎉

}
7 changes: 5 additions & 2 deletions packages/types/src/extensions/pn-any-to-eth-types.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { ChainName } from '../currency-types';
import * as PnAnyToAnyConversion from './pn-any-to-any-conversion-types';

/** Any to ETH reference-based payment network extension interface */
export type IAnyToEth = PnAnyToAnyConversion.IConversionReferenceBased;
export type IAnyToEth = PnAnyToAnyConversion.IConversionReferenceBased<ICreationParameters>;

/** Parameters for the creation action */
export type ICreationParameters = PnAnyToAnyConversion.ICreationParameters;
export type ICreationParameters = Omit<PnAnyToAnyConversion.ICreationParameters, 'network'> & {
network: ChainName;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

network is mandatory for AnyToEth

};
52 changes: 31 additions & 21 deletions packages/types/src/payment-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@ import { IIdentity } from './identity-types';
import * as RequestLogic from './request-logic-types';
import * as ExtensionTypes from './extension-types';
import { ICreationParameters } from './extensions/pn-any-declarative-types';
import { ICreationParameters as ICreationParametersAnyToAny } from './extensions/pn-any-to-any-conversion-types';
import { EvmChainName } from './currency-types';

/** Interface for payment network extensions state and interpretation */
export interface IPaymentNetwork<
TEventParameters extends GenericEventParameters = GenericEventParameters,
TCreationParameters = any,
> {
paymentNetworkId: ExtensionTypes.PAYMENT_NETWORK_ID;
extension: ExtensionTypes.IExtension;
createExtensionsDataForCreation: (paymentNetworkCreationParameters: any) => Promise<any>;
createExtensionsDataForCreation: (
paymentNetworkCreationParameters: TCreationParameters,
) => Promise<ExtensionTypes.IAction<any>>;
Comment on lines +14 to +15
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

slightly more precise...

createExtensionsDataForAddRefundInformation: (parameters: any) => any;
createExtensionsDataForAddPaymentInformation: (parameters: any) => any;
getBalance(request: RequestLogic.IRequest): Promise<IBalanceWithEvents<TEventParameters>>;
Expand All @@ -34,12 +35,6 @@ export interface IFeeReferenceBasedCreationParameters extends IReferenceBasedCre
feeAmount?: string;
}

/** Parameters to create a request with "any to erc20" payment network */
export interface IAnyToErc20CreationParameters extends ICreationParametersAnyToAny {
acceptedTokens?: string[];
network?: EvmChainName;
}

/**
* Interface to create a payment network
* @deprecated Use `PaymentNetworkCreateParameters` type instead
Expand All @@ -51,17 +46,27 @@ export interface IPaymentNetworkCreateParameters<T = any> {

export type PaymentNetworkCreateParameters =
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the "complexity" of the type prevented usage of Extract

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Arg, I remembered struggling with this.

| {
id:
| ExtensionTypes.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT
| ExtensionTypes.PAYMENT_NETWORK_ID.ETH_INPUT_DATA
| ExtensionTypes.PAYMENT_NETWORK_ID.NATIVE_TOKEN;
id: ExtensionTypes.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT;
parameters: ExtensionTypes.PnReferenceBased.ICreationParameters;
}
| {
id: ExtensionTypes.PAYMENT_NETWORK_ID.ETH_INPUT_DATA;
parameters: ExtensionTypes.PnReferenceBased.ICreationParameters;
}
| {
id:
| ExtensionTypes.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT
| ExtensionTypes.PAYMENT_NETWORK_ID.ETH_FEE_PROXY_CONTRACT
| ExtensionTypes.PAYMENT_NETWORK_ID.ERC20_TRANSFERABLE_RECEIVABLE;
id: ExtensionTypes.PAYMENT_NETWORK_ID.NATIVE_TOKEN;
parameters: ExtensionTypes.PnReferenceBased.ICreationParameters;
}
| {
id: ExtensionTypes.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT;
parameters: ExtensionTypes.PnFeeReferenceBased.ICreationParameters;
}
| {
id: ExtensionTypes.PAYMENT_NETWORK_ID.ETH_FEE_PROXY_CONTRACT;
parameters: ExtensionTypes.PnFeeReferenceBased.ICreationParameters;
}
| {
id: ExtensionTypes.PAYMENT_NETWORK_ID.ERC20_TRANSFERABLE_RECEIVABLE;
parameters: ExtensionTypes.PnFeeReferenceBased.ICreationParameters;
}
| {
Expand All @@ -85,10 +90,15 @@ export type PaymentNetworkCreateParameters =
parameters: ExtensionTypes.PnStreamReferenceBased.ICreationParameters;
}
| {
id:
| ExtensionTypes.PAYMENT_NETWORK_ID.BITCOIN_ADDRESS_BASED
| ExtensionTypes.PAYMENT_NETWORK_ID.TESTNET_BITCOIN_ADDRESS_BASED
| ExtensionTypes.PAYMENT_NETWORK_ID.ERC20_ADDRESS_BASED;
id: ExtensionTypes.PAYMENT_NETWORK_ID.BITCOIN_ADDRESS_BASED;
parameters: ExtensionTypes.PnAddressBased.ICreationParameters;
}
| {
id: ExtensionTypes.PAYMENT_NETWORK_ID.TESTNET_BITCOIN_ADDRESS_BASED;
parameters: ExtensionTypes.PnAddressBased.ICreationParameters;
}
| {
id: ExtensionTypes.PAYMENT_NETWORK_ID.ERC20_ADDRESS_BASED;
parameters: ExtensionTypes.PnAddressBased.ICreationParameters;
};

Expand Down