Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7c57a51
chore(tsconfig): specify included files during dev
alexandre-abrioux Oct 11, 2022
c3f980c
WIP
alexandre-abrioux Oct 11, 2022
9e7a533
WIP
alexandre-abrioux Oct 11, 2022
0396371
WIP
alexandre-abrioux Oct 11, 2022
40aa6ba
WIP
alexandre-abrioux Oct 11, 2022
a71afe7
fix any-to-near tests
alexandre-abrioux Oct 12, 2022
b627be7
move near to subdir
alexandre-abrioux Oct 12, 2022
37c3813
fix tests
alexandre-abrioux Oct 12, 2022
3f1a377
fix tests
alexandre-abrioux Oct 12, 2022
ac8ea1b
better types
alexandre-abrioux Oct 12, 2022
30827dd
WIP
alexandre-abrioux Oct 12, 2022
74251c9
merge master
alexandre-abrioux Oct 13, 2022
b472611
fix tests
alexandre-abrioux Oct 13, 2022
d7cbe70
fix tests
alexandre-abrioux Oct 13, 2022
981d21b
fix tests
alexandre-abrioux Oct 13, 2022
5bf88cb
add NETWORK const
alexandre-abrioux Oct 14, 2022
d436294
review update
alexandre-abrioux Oct 14, 2022
9d018a1
Merge remote-tracking branch 'origin/master' into pn-check-contract-d…
alexandre-abrioux Oct 14, 2022
203ef8f
fix after merge
alexandre-abrioux Oct 14, 2022
08b65f9
fix after merge
alexandre-abrioux Oct 14, 2022
aef7c7f
fix aurora test
alexandre-abrioux Oct 14, 2022
58c1457
fix type
alexandre-abrioux Oct 14, 2022
f947d6b
fix type
alexandre-abrioux Oct 14, 2022
68e59df
Merge remote-tracking branch 'origin/master' into pn-check-contract-d…
alexandre-abrioux Oct 17, 2022
b3916ca
abstract protected constructor
alexandre-abrioux Oct 19, 2022
e57b267
fixes https://github.com/RequestNetwork/requestNetwork/pull/950#discu…
alexandre-abrioux Oct 19, 2022
8675519
add warn for ERC20InfoRetriever
alexandre-abrioux Oct 19, 2022
8b49ce1
Merge branch 'master' into pn-check-contract-deployed
alexandre-abrioux Oct 19, 2022
e57154b
fixes https://github.com/RequestNetwork/requestNetwork/pull/950#discu…
alexandre-abrioux Oct 20, 2022
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
50 changes: 30 additions & 20 deletions packages/advanced-logic/src/advanced-logic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
IdentityTypes,
RequestLogicTypes,
} from '@requestnetwork/types';
import { ICurrencyManager, CurrencyManager } from '@requestnetwork/currency';
import { CurrencyManager, ICurrencyManager } from '@requestnetwork/currency';

import ContentData from './extensions/content-data';
import AddressBasedBtc from './extensions/payment-network/bitcoin/mainnet-address-based';
Expand All @@ -16,12 +16,14 @@ import ProxyContractErc20 from './extensions/payment-network/erc20/proxy-contrac
import Erc777Stream from './extensions/payment-network/erc777/stream';
import FeeProxyContractEth from './extensions/payment-network/ethereum/fee-proxy-contract';
import EthereumInputData from './extensions/payment-network/ethereum/input-data';
import NearNative from './extensions/payment-network/near-native';
import NearNative from './extensions/payment-network/near/near-native';
import NearTestnetNative from './extensions/payment-network/near/near-testnet-native';
import AnyToErc20Proxy from './extensions/payment-network/any-to-erc20-proxy';
import AnyToEthProxy from './extensions/payment-network/any-to-eth-proxy';
import NativeTokenPaymentNetwork from './extensions/payment-network/native-token';
import AnyToNear from './extensions/payment-network/any-to-near';
import AnyToNativeTokenPaymentNetwork from './extensions/payment-network/any-to-native';
import AnyToNear from './extensions/payment-network/near/any-to-near';
import AnyToNearTestnet from './extensions/payment-network/near/any-to-near-testnet';
import NativeToken from './extensions/payment-network/native-token';
import AnyToNative from './extensions/payment-network/any-to-native';

/**
* Module to manage Advanced logic extensions
Expand All @@ -37,13 +39,13 @@ export default class AdvancedLogic implements AdvancedLogicTypes.IAdvancedLogic
anyToErc20Proxy: AnyToErc20Proxy;
declarative: Declarative;
ethereumInputData: EthereumInputData;
nativeToken: NativeTokenPaymentNetwork[];
nativeToken: NativeToken[];
feeProxyContractErc20: FeeProxyContractErc20;
proxyContractErc20: ProxyContractErc20;
erc777Stream: Erc777Stream;
feeProxyContractEth: FeeProxyContractEth;
anyToEthProxy: AnyToEthProxy;
anyToNativeToken: AnyToNativeTokenPaymentNetwork[];
anyToNativeToken: AnyToNative[];
};

constructor(currencyManager?: ICurrencyManager) {
Expand All @@ -63,10 +65,11 @@ export default class AdvancedLogic implements AdvancedLogicTypes.IAdvancedLogic
erc777Stream: new Erc777Stream(),
feeProxyContractEth: new FeeProxyContractEth(),
anyToEthProxy: new AnyToEthProxy(currencyManager),
nativeToken: [new NearNative()],
anyToNativeToken: [new AnyToNear(currencyManager)],
nativeToken: [new NearNative(), new NearTestnetNative()],
anyToNativeToken: [new AnyToNear(currencyManager), new AnyToNearTestnet(currencyManager)],
Comment on lines +68 to +69
Copy link
Contributor

Choose a reason for hiding this comment

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

If we go down that line, can we add anyToEthProxy and feeProxyContractEth to these 2 generic PNs? And deprecate the "separate" use of these extensions? It does not add anything while we just have Near.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I agree! We should deprecate any-to-eth-proxy and instead use any-to-native-token. Not sure however that eth-fee-proxy-contract and native-token are compatible as the latest doesn't support fees as far as I know. I'll keep this PR a refactor without changing payment networks, but let's keep this in mind for the next steps.

};
}

/**
* Applies the extension action to the request extensions state
*
Expand Down Expand Up @@ -138,6 +141,14 @@ export default class AdvancedLogic implements AdvancedLogicTypes.IAdvancedLogic
return extension;
}

public getNativeTokenExtensionForNetwork(
network: string,
): ExtensionTypes.IExtension<ExtensionTypes.PnReferenceBased.ICreationParameters> | undefined {
return this.extensions.nativeToken.find((nativeTokenExtension) =>
nativeTokenExtension.supportedNetworks.includes(network),
);
}

protected getNativeTokenExtensionForActionAndState(
extensionAction: ExtensionTypes.IAction,
requestState: RequestLogicTypes.IRequest,
Expand All @@ -152,24 +163,23 @@ export default class AdvancedLogic implements AdvancedLogicTypes.IAdvancedLogic
);
}
const network = requestState.currency.network ?? extensionAction.parameters.paymentNetworkName;
return network
? this.extensions.nativeToken.find((nativeTokenExtension) =>
nativeTokenExtension.supportedNetworks.includes(network),
)
: undefined;
return network ? this.getNativeTokenExtensionForNetwork(network) : undefined;
}

public getAnyToNativeTokenExtensionForNetwork(
network: string,
): ExtensionTypes.IExtension<ExtensionTypes.PnAnyToEth.ICreationParameters> | undefined {
return this.extensions.anyToNativeToken.find((anyToNativeTokenExtension) =>
anyToNativeTokenExtension.supportedNetworks.includes(network),
);
}

protected getAnyToNativeTokenExtensionForActionAndState(
extensionAction: ExtensionTypes.IAction,
requestState: RequestLogicTypes.IRequest,
): ExtensionTypes.IExtension<ExtensionTypes.PnAnyToEth.ICreationParameters> | undefined {
const network = this.getNetwork(extensionAction, requestState);

return network
? this.extensions.anyToNativeToken.find((anyToNativeTokenExtension) =>
anyToNativeTokenExtension.supportedNetworks.includes(network),
)
: undefined;
return network ? this.getAnyToNativeTokenExtensionForNetwork(network) : undefined;
}

protected getNetwork(
Expand Down
11 changes: 5 additions & 6 deletions packages/advanced-logic/src/extensions/abstract-extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import Utils from '@requestnetwork/utils';
/**
* Abstract class to create extension
*/
export abstract class AbstractExtension<TCreationParameters> {
export abstract class AbstractExtension<TCreationParameters> implements ExtensionTypes.IExtension {
protected actions: ExtensionTypes.SupportedActions;

public constructor(
public extensionType: ExtensionTypes.TYPE,
public extensionId: ExtensionTypes.ID,
public currentVersion: string,
protected constructor(
public readonly extensionType: ExtensionTypes.TYPE,
public readonly extensionId: ExtensionTypes.ID,
public readonly currentVersion: string,
) {
this.actions = {};
}
Expand Down Expand Up @@ -119,7 +119,6 @@ export abstract class AbstractExtension<TCreationParameters> {
* It is called at the beginning of every applyActionToExtension()
* It must throw in case of error
*
* @param request
* @param extensionAction action to apply
*/
protected validate(
Expand Down
8 changes: 2 additions & 6 deletions packages/advanced-logic/src/extensions/content-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,8 @@ const CURRENT_VERSION = '0.1.0';
export default class ContentDataExtension<
TCreationParameters extends ExtensionTypes.ContentData.ICreationParameters = ExtensionTypes.ContentData.ICreationParameters,
> extends AbstractExtension<TCreationParameters> {
public constructor(
public extensionId: ExtensionTypes.ID = ExtensionTypes.ID.CONTENT_DATA,
public currentVersion: string = CURRENT_VERSION,
) {
super(ExtensionTypes.TYPE.CONTENT_DATA, extensionId, currentVersion);
public constructor() {
super(ExtensionTypes.TYPE.CONTENT_DATA, ExtensionTypes.ID.CONTENT_DATA, CURRENT_VERSION);
Comment on lines -12 to +13
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Type of change made for classes that never get extended

}

/**
Expand All @@ -40,7 +37,6 @@ export default class ContentDataExtension<
* Applies a creation
*
* @param extensionAction action to apply
* @param timestamp
*
* @returns state of the extension created
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,10 @@ import DeclarativePaymentNetwork from './declarative';
export default abstract class AddressBasedPaymentNetwork<
TCreationParameters extends ExtensionTypes.PnAddressBased.ICreationParameters = ExtensionTypes.PnAddressBased.ICreationParameters,
> extends DeclarativePaymentNetwork<TCreationParameters> {
public constructor(
public extensionId: ExtensionTypes.ID,
public currentVersion: string,
public supportedNetworks: string[],
public supportedCurrencyType: RequestLogicTypes.CURRENCY,
protected constructor(
extensionId: ExtensionTypes.ID,
currentVersion: string,
public readonly supportedCurrencyType: RequestLogicTypes.CURRENCY,
) {
super(extensionId, currentVersion);
this.actions = {
Expand All @@ -29,7 +28,7 @@ export default abstract class AddressBasedPaymentNetwork<
/**
* Creates the extensionsData for address based payment networks
*
* @param extensions extensions parameters to create
* @param creationParameters extensions parameters to create
*
* @returns IExtensionCreationAction the extensionsData to be stored in the request
*/
Expand Down Expand Up @@ -58,7 +57,7 @@ export default abstract class AddressBasedPaymentNetwork<
/**
* Creates the extensionsData to add a payment address
*
* @param extensions extensions parameters to create
* @param addPaymentAddressParameters extensions parameters to create
*
* @returns IAction the extensionsData to be stored in the request
*/
Expand All @@ -82,7 +81,7 @@ export default abstract class AddressBasedPaymentNetwork<
/**
* Creates the extensionsData to add a refund address
*
* @param extensions extensions parameters to create
* @param addRefundAddressParameters extensions parameters to create
*
* @returns IAction the extensionsData to be stored in the request
*/
Expand Down Expand Up @@ -140,23 +139,8 @@ export default abstract class AddressBasedPaymentNetwork<
};
}

protected isValidAddress(address: string, networkName?: string): boolean {
if (networkName) {
return this.isValidAddressForNetwork(address, networkName);
}
return this.supportedNetworks.some((network) =>
this.isValidAddressForNetwork(address, network),
);
}

protected isValidAddressForNetwork(address: string, network: string): boolean {
protected isValidAddress(address: string): boolean {
switch (this.supportedCurrencyType) {
case RequestLogicTypes.CURRENCY.BTC:
return this.isValidAddressForSymbolAndNetwork(
address,
network === 'testnet' ? 'BTC-testnet' : 'BTC',
network,
);
case RequestLogicTypes.CURRENCY.ETH:
case RequestLogicTypes.CURRENCY.ERC20:
case RequestLogicTypes.CURRENCY.ERC777:
Expand All @@ -182,7 +166,7 @@ export default abstract class AddressBasedPaymentNetwork<
}

/**
* Applies add payment address
* Applies the add payment address action
*
* @param extensionState previous state of the extension
* @param extensionAction action to apply
Expand All @@ -200,7 +184,7 @@ export default abstract class AddressBasedPaymentNetwork<
): ExtensionTypes.IState {
if (
extensionAction.parameters.paymentAddress &&
!this.isValidAddress(extensionAction.parameters.paymentAddress, requestState.currency.network)
!this.isValidAddress(extensionAction.parameters.paymentAddress)
) {
throw new InvalidPaymentAddressError(extensionAction.parameters.paymentAddress);
}
Expand Down Expand Up @@ -247,7 +231,7 @@ export default abstract class AddressBasedPaymentNetwork<
): ExtensionTypes.IState {
if (
extensionAction.parameters.refundAddress &&
!this.isValidAddress(extensionAction.parameters.refundAddress, requestState.currency.network)
!this.isValidAddress(extensionAction.parameters.refundAddress)
) {
throw Error('refundAddress is not a valid address');
}
Expand Down Expand Up @@ -290,9 +274,6 @@ export default abstract class AddressBasedPaymentNetwork<
if (!network) {
throw Error('network is required');
}
if (network && this.supportedNetworks && !this.supportedNetworks.includes(network)) {
throw new UnsupportedNetworkError(network, this.supportedNetworks);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,7 @@ export default class AnyToErc20ProxyPaymentNetwork extends Erc20FeeProxyPaymentN
extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_ANY_TO_ERC20_PROXY,
currentVersion: string = CURRENT_VERSION,
) {
super(
extensionId,
currentVersion,
conversionSupportedNetworks,
RequestLogicTypes.CURRENCY.ERC20,
);
super(extensionId, currentVersion);
}

/**
Expand Down Expand Up @@ -121,8 +116,6 @@ export default class AnyToErc20ProxyPaymentNetwork extends Erc20FeeProxyPaymentN
/**
* Validate the extension action regarding the currency and network
* It must throw in case of error
*
* @param request
*/
protected validate(
request: RequestLogicTypes.IRequest,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,12 @@
import {
conversionSupportedNetworks,
ICurrencyManager,
UnsupportedCurrencyError,
} from '@requestnetwork/currency';
import { ICurrencyManager, UnsupportedCurrencyError } from '@requestnetwork/currency';
import { ExtensionTypes, RequestLogicTypes } from '@requestnetwork/types';
import EthereumFeeProxyPaymentNetwork from './ethereum/fee-proxy-contract';

const CURRENT_VERSION = '0.2.0';

export default class AnyToEthProxyPaymentNetwork extends EthereumFeeProxyPaymentNetwork {
public constructor(
private currencyManager: ICurrencyManager,
extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_ANY_TO_ETH_PROXY,
currentVersion: string = CURRENT_VERSION,
) {
super(extensionId, currentVersion, conversionSupportedNetworks);
public constructor(private currencyManager: ICurrencyManager) {
super(ExtensionTypes.ID.PAYMENT_NETWORK_ANY_TO_ETH_PROXY, CURRENT_VERSION);
}

/**
Expand Down Expand Up @@ -77,8 +69,6 @@ export default class AnyToEthProxyPaymentNetwork extends EthereumFeeProxyPayment
/**
* Validate the extension action regarding the currency and network
* It must throw in case of error
*
* @param request
*/
protected validate(
request: RequestLogicTypes.IRequest,
Expand All @@ -95,10 +85,6 @@ export default class AnyToEthProxyPaymentNetwork extends EthereumFeeProxyPayment
);
}

if (!conversionSupportedNetworks.includes(network)) {
throw new Error(`The network (${network}) is not supported for this payment network.`);
}

const currency = this.currencyManager.fromStorageCurrency(request.currency);
if (!currency) {
throw new UnsupportedCurrencyError(request.currency);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,34 @@
import { FeeReferenceBasedPaymentNetwork } from './fee-reference-based';
import { ExtensionTypes, RequestLogicTypes } from '@requestnetwork/types';
import { InvalidPaymentAddressError } from './address-based';
import { InvalidPaymentAddressError, UnsupportedNetworkError } from './address-based';

export default abstract class AnyToNativeTokenPaymentNetwork extends FeeReferenceBasedPaymentNetwork {
public constructor(
protected constructor(
Copy link
Contributor Author

Choose a reason for hiding this comment

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

abstract class constructors should be protected

extensionId: ExtensionTypes.ID,
currentVersion: string,
supportedNetworks: string[],
public readonly supportedNetworks: string[],
) {
super(extensionId, currentVersion, supportedNetworks, RequestLogicTypes.CURRENCY.ETH);
super(extensionId, currentVersion, RequestLogicTypes.CURRENCY.ETH);
}

public createCreationAction(
creationParameters: ExtensionTypes.PnAnyToAnyConversion.ICreationParameters,
): ExtensionTypes.IAction<ExtensionTypes.PnAnyToAnyConversion.ICreationParameters> {
const network = creationParameters.network;
this.throwIfInvalidNetwork(network);

if (
creationParameters.paymentAddress &&
!this.isValidAddress(creationParameters.paymentAddress, network)
!this.isValidAddress(creationParameters.paymentAddress)
) {
throw new InvalidPaymentAddressError(creationParameters.paymentAddress);
}
if (
creationParameters.refundAddress &&
!this.isValidAddress(creationParameters.refundAddress, network)
!this.isValidAddress(creationParameters.refundAddress)
) {
throw new InvalidPaymentAddressError(creationParameters.refundAddress, 'refundAddress');
}
if (
creationParameters.feeAddress &&
!this.isValidAddress(creationParameters.feeAddress, network)
) {
if (creationParameters.feeAddress && !this.isValidAddress(creationParameters.feeAddress)) {
throw new InvalidPaymentAddressError(creationParameters.feeAddress, 'feeAddress');
}
if (creationParameters.maxRateTimespan && creationParameters.maxRateTimespan < 0) {
Expand All @@ -42,7 +38,18 @@ export default abstract class AnyToNativeTokenPaymentNetwork extends FeeReferenc
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
protected abstract isValidAddress(_address: string, _networkName?: string): boolean;
protected isValidAddress(_address: string): boolean {
throw new Error(
`Default implementation of isValidAddress() does not support native tokens. Please override this method.`,
);
}

protected throwIfInvalidNetwork(network?: string): asserts network is string {
super.throwIfInvalidNetwork(network);
if (this.supportedNetworks && !this.supportedNetworks.includes(network)) {
throw new UnsupportedNetworkError(network, this.supportedNetworks);
}
}
}

export class InvalidMaxRateTimespanError extends Error {
Expand Down
Loading