diff --git a/packages/advanced-logic/src/advanced-logic.ts b/packages/advanced-logic/src/advanced-logic.ts index c6923e7928..c994e41401 100644 --- a/packages/advanced-logic/src/advanced-logic.ts +++ b/packages/advanced-logic/src/advanced-logic.ts @@ -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'; @@ -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 @@ -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) { @@ -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)], }; } + /** * Applies the extension action to the request extensions state * @@ -138,6 +141,14 @@ export default class AdvancedLogic implements AdvancedLogicTypes.IAdvancedLogic return extension; } + public getNativeTokenExtensionForNetwork( + network: string, + ): ExtensionTypes.IExtension | undefined { + return this.extensions.nativeToken.find((nativeTokenExtension) => + nativeTokenExtension.supportedNetworks.includes(network), + ); + } + protected getNativeTokenExtensionForActionAndState( extensionAction: ExtensionTypes.IAction, requestState: RequestLogicTypes.IRequest, @@ -152,11 +163,15 @@ 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 | undefined { + return this.extensions.anyToNativeToken.find((anyToNativeTokenExtension) => + anyToNativeTokenExtension.supportedNetworks.includes(network), + ); } protected getAnyToNativeTokenExtensionForActionAndState( @@ -164,12 +179,7 @@ export default class AdvancedLogic implements AdvancedLogicTypes.IAdvancedLogic requestState: RequestLogicTypes.IRequest, ): ExtensionTypes.IExtension | 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( diff --git a/packages/advanced-logic/src/extensions/abstract-extension.ts b/packages/advanced-logic/src/extensions/abstract-extension.ts index 23dadbf5d8..b0c0f847b1 100644 --- a/packages/advanced-logic/src/extensions/abstract-extension.ts +++ b/packages/advanced-logic/src/extensions/abstract-extension.ts @@ -4,13 +4,13 @@ import Utils from '@requestnetwork/utils'; /** * Abstract class to create extension */ -export abstract class AbstractExtension { +export abstract class AbstractExtension 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 = {}; } @@ -119,7 +119,6 @@ export abstract class AbstractExtension { * 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( diff --git a/packages/advanced-logic/src/extensions/content-data.ts b/packages/advanced-logic/src/extensions/content-data.ts index 02186a19e2..5c9bab5d96 100644 --- a/packages/advanced-logic/src/extensions/content-data.ts +++ b/packages/advanced-logic/src/extensions/content-data.ts @@ -9,11 +9,8 @@ const CURRENT_VERSION = '0.1.0'; export default class ContentDataExtension< TCreationParameters extends ExtensionTypes.ContentData.ICreationParameters = ExtensionTypes.ContentData.ICreationParameters, > extends AbstractExtension { - 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); } /** @@ -40,7 +37,6 @@ export default class ContentDataExtension< * Applies a creation * * @param extensionAction action to apply - * @param timestamp * * @returns state of the extension created */ diff --git a/packages/advanced-logic/src/extensions/payment-network/address-based.ts b/packages/advanced-logic/src/extensions/payment-network/address-based.ts index 6f546a621b..a97da66344 100644 --- a/packages/advanced-logic/src/extensions/payment-network/address-based.ts +++ b/packages/advanced-logic/src/extensions/payment-network/address-based.ts @@ -10,11 +10,10 @@ import DeclarativePaymentNetwork from './declarative'; export default abstract class AddressBasedPaymentNetwork< TCreationParameters extends ExtensionTypes.PnAddressBased.ICreationParameters = ExtensionTypes.PnAddressBased.ICreationParameters, > extends DeclarativePaymentNetwork { - 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 = { @@ -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 */ @@ -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 */ @@ -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 */ @@ -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: @@ -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 @@ -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); } @@ -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'); } @@ -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); - } } } diff --git a/packages/advanced-logic/src/extensions/payment-network/any-to-erc20-proxy.ts b/packages/advanced-logic/src/extensions/payment-network/any-to-erc20-proxy.ts index 02038f59ec..992ed2e25f 100644 --- a/packages/advanced-logic/src/extensions/payment-network/any-to-erc20-proxy.ts +++ b/packages/advanced-logic/src/extensions/payment-network/any-to-erc20-proxy.ts @@ -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); } /** @@ -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, diff --git a/packages/advanced-logic/src/extensions/payment-network/any-to-eth-proxy.ts b/packages/advanced-logic/src/extensions/payment-network/any-to-eth-proxy.ts index 94c4dd0d20..bcb798f79a 100644 --- a/packages/advanced-logic/src/extensions/payment-network/any-to-eth-proxy.ts +++ b/packages/advanced-logic/src/extensions/payment-network/any-to-eth-proxy.ts @@ -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); } /** @@ -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, @@ -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); diff --git a/packages/advanced-logic/src/extensions/payment-network/any-to-native.ts b/packages/advanced-logic/src/extensions/payment-network/any-to-native.ts index a06e0cdb5b..958e8ca183 100644 --- a/packages/advanced-logic/src/extensions/payment-network/any-to-native.ts +++ b/packages/advanced-logic/src/extensions/payment-network/any-to-native.ts @@ -1,14 +1,14 @@ 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( 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( @@ -16,23 +16,19 @@ export default abstract class AnyToNativeTokenPaymentNetwork extends FeeReferenc ): ExtensionTypes.IAction { 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) { @@ -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 { diff --git a/packages/advanced-logic/src/extensions/payment-network/bitcoin/mainnet-address-based.ts b/packages/advanced-logic/src/extensions/payment-network/bitcoin/mainnet-address-based.ts index 5c1aa7ea93..89f08245fe 100644 --- a/packages/advanced-logic/src/extensions/payment-network/bitcoin/mainnet-address-based.ts +++ b/packages/advanced-logic/src/extensions/payment-network/bitcoin/mainnet-address-based.ts @@ -12,10 +12,12 @@ const BITCOIN_NETWORK = 'mainnet'; */ export default class BitcoinAddressBasedPaymentNetwork extends AddressBasedPaymentNetwork { public constructor( - public extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_BITCOIN_ADDRESS_BASED, - public currentVersion: string = CURRENT_VERSION, - public supportedNetworks: string[] = [BITCOIN_NETWORK], + extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_BITCOIN_ADDRESS_BASED, ) { - super(extensionId, currentVersion, supportedNetworks, RequestLogicTypes.CURRENCY.BTC); + super(extensionId, CURRENT_VERSION, RequestLogicTypes.CURRENCY.BTC); + } + + protected isValidAddress(address: string): boolean { + return this.isValidAddressForSymbolAndNetwork(address, 'BTC', BITCOIN_NETWORK); } } diff --git a/packages/advanced-logic/src/extensions/payment-network/bitcoin/testnet-address-based.ts b/packages/advanced-logic/src/extensions/payment-network/bitcoin/testnet-address-based.ts index 1031289034..b38e7a6036 100644 --- a/packages/advanced-logic/src/extensions/payment-network/bitcoin/testnet-address-based.ts +++ b/packages/advanced-logic/src/extensions/payment-network/bitcoin/testnet-address-based.ts @@ -1,7 +1,6 @@ -import { ExtensionTypes } from '@requestnetwork/types'; import BitcoinAddressBasedPaymentNetwork from './mainnet-address-based'; +import { ExtensionTypes } from '@requestnetwork/types'; -const CURRENT_VERSION = '0.1.0'; const BITCOIN_NETWORK = 'testnet'; /** @@ -13,8 +12,10 @@ const BITCOIN_NETWORK = 'testnet'; */ export default class BitcoinTestnetAddressBasedPaymentNetwork extends BitcoinAddressBasedPaymentNetwork { public constructor() { - super(ExtensionTypes.ID.PAYMENT_NETWORK_TESTNET_BITCOIN_ADDRESS_BASED, CURRENT_VERSION, [ - BITCOIN_NETWORK, - ]); + super(ExtensionTypes.ID.PAYMENT_NETWORK_TESTNET_BITCOIN_ADDRESS_BASED); + } + + protected isValidAddress(address: string): boolean { + return this.isValidAddressForSymbolAndNetwork(address, 'BTC-testnet', BITCOIN_NETWORK); } } diff --git a/packages/advanced-logic/src/extensions/payment-network/declarative.ts b/packages/advanced-logic/src/extensions/payment-network/declarative.ts index 4dd16051f8..6c0738ef1a 100644 --- a/packages/advanced-logic/src/extensions/payment-network/declarative.ts +++ b/packages/advanced-logic/src/extensions/payment-network/declarative.ts @@ -11,8 +11,9 @@ export default class DeclarativePaymentNetwork< TCreationParameters extends ExtensionTypes.PnAnyDeclarative.ICreationParameters = ExtensionTypes.PnAnyDeclarative.ICreationParameters, > extends AbstractExtension { public constructor( - public extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_ANY_DECLARATIVE, - public currentVersion: string = CURRENT_VERSION, + public readonly extensionId: ExtensionTypes.ID = ExtensionTypes.ID + .PAYMENT_NETWORK_ANY_DECLARATIVE, + public readonly currentVersion: string = CURRENT_VERSION, ) { super(ExtensionTypes.TYPE.PAYMENT_NETWORK, extensionId, currentVersion); this.actions = { diff --git a/packages/advanced-logic/src/extensions/payment-network/erc20/address-based.ts b/packages/advanced-logic/src/extensions/payment-network/erc20/address-based.ts index e987247e0b..5742651bff 100644 --- a/packages/advanced-logic/src/extensions/payment-network/erc20/address-based.ts +++ b/packages/advanced-logic/src/extensions/payment-network/erc20/address-based.ts @@ -3,8 +3,6 @@ import AddressBasedPaymentNetwork from '../address-based'; const CURRENT_VERSION = '0.1.0'; -const supportedNetworks = ['mainnet', 'rinkeby', 'private', 'goerli']; - /** * Implementation of the payment network to pay in ERC20 tokens based on an Ethereum address * With this extension one request can have two dedicated Ethereum addresses (one for payment and one for refund) @@ -16,7 +14,6 @@ export default class Erc20AddressBasedPaymentNetwork extends AddressBasedPayment super( ExtensionTypes.ID.PAYMENT_NETWORK_ERC20_ADDRESS_BASED, CURRENT_VERSION, - supportedNetworks, RequestLogicTypes.CURRENCY.ERC20, ); } diff --git a/packages/advanced-logic/src/extensions/payment-network/erc20/fee-proxy-contract.ts b/packages/advanced-logic/src/extensions/payment-network/erc20/fee-proxy-contract.ts index 8dae61feba..e0b4766dfd 100644 --- a/packages/advanced-logic/src/extensions/payment-network/erc20/fee-proxy-contract.ts +++ b/packages/advanced-logic/src/extensions/payment-network/erc20/fee-proxy-contract.ts @@ -12,26 +12,7 @@ export default class Erc20FeeProxyPaymentNetwork< public constructor( extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_ERC20_FEE_PROXY_CONTRACT, currentVersion: string = CURRENT_VERSION, - public supportedNetworks: string[] = [ - 'mainnet', - 'rinkeby', - 'goerli', - 'private', - 'matic', - 'mumbai', - 'celo', - 'alfajores', - 'fuse', - 'bsctest', - 'bsc', - 'xdai', - 'fantom', - 'arbitrum-rinkeby', - 'arbitrum-one', - 'avalanche', - ], - public supportedCurrencyType: RequestLogicTypes.CURRENCY = RequestLogicTypes.CURRENCY.ERC20, ) { - super(extensionId, currentVersion, supportedNetworks, supportedCurrencyType); + super(extensionId, currentVersion, RequestLogicTypes.CURRENCY.ERC20); } } diff --git a/packages/advanced-logic/src/extensions/payment-network/erc20/proxy-contract.ts b/packages/advanced-logic/src/extensions/payment-network/erc20/proxy-contract.ts index 6841a39fea..7b94d55b0f 100644 --- a/packages/advanced-logic/src/extensions/payment-network/erc20/proxy-contract.ts +++ b/packages/advanced-logic/src/extensions/payment-network/erc20/proxy-contract.ts @@ -9,12 +9,11 @@ const CURRENT_VERSION = '0.1.0'; export default class Erc20ProxyPaymentNetwork< TCreationParameters extends ExtensionTypes.PnReferenceBased.ICreationParameters = ExtensionTypes.PnReferenceBased.ICreationParameters, > extends ReferenceBasedPaymentNetwork { - public constructor( - public extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_ERC20_PROXY_CONTRACT, - public currentVersion: string = CURRENT_VERSION, - public supportedNetworks: string[] = ['mainnet', 'rinkeby', 'goerli', 'private'], - public supportedCurrencyType: RequestLogicTypes.CURRENCY = RequestLogicTypes.CURRENCY.ERC20, - ) { - super(extensionId, currentVersion, supportedNetworks, supportedCurrencyType); + public constructor() { + super( + ExtensionTypes.ID.PAYMENT_NETWORK_ERC20_PROXY_CONTRACT, + CURRENT_VERSION, + RequestLogicTypes.CURRENCY.ERC20, + ); } } diff --git a/packages/advanced-logic/src/extensions/payment-network/erc777/stream.ts b/packages/advanced-logic/src/extensions/payment-network/erc777/stream.ts index 6edde7451f..7656554a69 100644 --- a/packages/advanced-logic/src/extensions/payment-network/erc777/stream.ts +++ b/packages/advanced-logic/src/extensions/payment-network/erc777/stream.ts @@ -9,20 +9,12 @@ const CURRENT_VERSION = '0.1.0'; export default class Erc777StreamPaymentNetwork< TCreationParameters extends ExtensionTypes.PnStreamReferenceBased.ICreationParameters = ExtensionTypes.PnStreamReferenceBased.ICreationParameters, > extends ReferenceBasedPaymentNetwork { - public constructor( - extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_ERC777_STREAM, - currentVersion: string = CURRENT_VERSION, - public supportedNetworks: string[] = [ - 'matic', - 'xdai', - 'mumbai', - 'rinkeby', - 'goerli', - 'arbitrum-rinkeby', - ], - public supportedCurrencyType: RequestLogicTypes.CURRENCY = RequestLogicTypes.CURRENCY.ERC777, - ) { - super(extensionId, currentVersion, supportedNetworks, supportedCurrencyType); + public constructor() { + super( + ExtensionTypes.ID.PAYMENT_NETWORK_ERC777_STREAM, + CURRENT_VERSION, + RequestLogicTypes.CURRENCY.ERC777, + ); } /** diff --git a/packages/advanced-logic/src/extensions/payment-network/ethereum/fee-proxy-contract.ts b/packages/advanced-logic/src/extensions/payment-network/ethereum/fee-proxy-contract.ts index fa5cab7754..5e5e0a6c18 100644 --- a/packages/advanced-logic/src/extensions/payment-network/ethereum/fee-proxy-contract.ts +++ b/packages/advanced-logic/src/extensions/payment-network/ethereum/fee-proxy-contract.ts @@ -12,8 +12,7 @@ export default class EthereumFeeProxyPaymentNetwork< public constructor( extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_ETH_FEE_PROXY_CONTRACT, currentVersion: string = CURRENT_VERSION, - public supportedNetworks: string[] = ['mainnet', 'rinkeby', 'goerli', 'private'], ) { - super(extensionId, currentVersion, supportedNetworks, RequestLogicTypes.CURRENCY.ETH); + super(extensionId, currentVersion, RequestLogicTypes.CURRENCY.ETH); } } diff --git a/packages/advanced-logic/src/extensions/payment-network/ethereum/input-data.ts b/packages/advanced-logic/src/extensions/payment-network/ethereum/input-data.ts index 3921a73853..927169fa3a 100644 --- a/packages/advanced-logic/src/extensions/payment-network/ethereum/input-data.ts +++ b/packages/advanced-logic/src/extensions/payment-network/ethereum/input-data.ts @@ -2,22 +2,6 @@ import { ExtensionTypes, RequestLogicTypes } from '@requestnetwork/types'; import ReferenceBasedPaymentNetwork from '../reference-based'; const CURRENT_VERSION = '0.3.0'; -const supportedNetworks = [ - 'mainnet', - 'rinkeby', - 'goerli', - 'xdai', - 'sokol', - 'fuse', - 'matic', - 'celo', - 'fantom', - 'bsctest', - 'bsc', - 'arbitrum-rinkeby', - 'arbitrum-one', - 'avalanche', -]; /** * Implementation of the payment network to pay in native token @@ -28,6 +12,6 @@ export default class EthInputPaymentNetwork extends ReferenceBasedPaymentNetwork extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_ETH_INPUT_DATA, currentVersion: string = CURRENT_VERSION, ) { - super(extensionId, currentVersion, supportedNetworks, RequestLogicTypes.CURRENCY.ETH); + super(extensionId, currentVersion, RequestLogicTypes.CURRENCY.ETH); } } diff --git a/packages/advanced-logic/src/extensions/payment-network/fee-reference-based.ts b/packages/advanced-logic/src/extensions/payment-network/fee-reference-based.ts index e117464f1f..5b8b973567 100644 --- a/packages/advanced-logic/src/extensions/payment-network/fee-reference-based.ts +++ b/packages/advanced-logic/src/extensions/payment-network/fee-reference-based.ts @@ -9,13 +9,12 @@ import Utils from '@requestnetwork/utils'; export abstract class FeeReferenceBasedPaymentNetwork< TCreationParameters extends ExtensionTypes.PnFeeReferenceBased.ICreationParameters = ExtensionTypes.PnFeeReferenceBased.ICreationParameters, > extends ReferenceBasedPaymentNetwork { - public constructor( - public extensionId: ExtensionTypes.ID, - public currentVersion: string, - public supportedNetworks: string[], - public supportedCurrencyType: RequestLogicTypes.CURRENCY, + protected constructor( + extensionId: ExtensionTypes.ID, + currentVersion: string, + supportedCurrencyType: RequestLogicTypes.CURRENCY, ) { - super(extensionId, currentVersion, supportedNetworks, supportedCurrencyType); + super(extensionId, currentVersion, supportedCurrencyType); this.actions = { ...this.actions, [ExtensionTypes.PnFeeReferenceBased.ACTION.ADD_FEE]: this.applyAddFee.bind(this), diff --git a/packages/advanced-logic/src/extensions/payment-network/native-token.ts b/packages/advanced-logic/src/extensions/payment-network/native-token.ts index ca77421436..3d997f8daf 100644 --- a/packages/advanced-logic/src/extensions/payment-network/native-token.ts +++ b/packages/advanced-logic/src/extensions/payment-network/native-token.ts @@ -1,5 +1,5 @@ import { ExtensionTypes, RequestLogicTypes } from '@requestnetwork/types'; -import { InvalidPaymentAddressError } from './address-based'; +import { InvalidPaymentAddressError, UnsupportedNetworkError } from './address-based'; import ReferenceBasedPaymentNetwork from './reference-based'; @@ -10,29 +10,33 @@ export default abstract class NativeTokenPaymentNetwork extends ReferenceBasedPa public constructor( 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.PnReferenceBased.ICreationParameters, ): ExtensionTypes.IAction { const networkName = creationParameters.paymentNetworkName; - if (!networkName && (creationParameters.paymentAddress || creationParameters.refundAddress)) { - throw new Error( - `The network name is mandatory for the creation of the extension ${this.extensionId}.`, - ); + if (creationParameters.paymentAddress || creationParameters.refundAddress) { + if (networkName) { + this.throwIfInvalidNetwork(networkName); + } else { + throw new Error( + `The network name is mandatory for the creation of the extension ${this.extensionId}.`, + ); + } } if ( creationParameters.paymentAddress && - !this.isValidAddress(creationParameters.paymentAddress, networkName) + !this.isValidAddress(creationParameters.paymentAddress) ) { throw new InvalidPaymentAddressError(creationParameters.paymentAddress); } if ( creationParameters.refundAddress && - !this.isValidAddress(creationParameters.refundAddress, networkName) + !this.isValidAddress(creationParameters.refundAddress) ) { throw new InvalidPaymentAddressError(creationParameters.refundAddress, 'refundAddress'); } @@ -40,9 +44,16 @@ export default abstract class NativeTokenPaymentNetwork extends ReferenceBasedPa } // eslint-disable-next-line @typescript-eslint/no-unused-vars - protected 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); + } + } } diff --git a/packages/advanced-logic/src/extensions/payment-network/near-native.ts b/packages/advanced-logic/src/extensions/payment-network/near-native.ts index c600244ed2..e69de29bb2 100644 --- a/packages/advanced-logic/src/extensions/payment-network/near-native.ts +++ b/packages/advanced-logic/src/extensions/payment-network/near-native.ts @@ -1,46 +0,0 @@ -import { ExtensionTypes } from '@requestnetwork/types'; -import { UnsupportedNetworkError } from './address-based'; -import NativeTokenPaymentNetwork from './native-token'; - -const CURRENT_VERSION = '0.2.0'; -const supportedNetworks = ['aurora', 'aurora-testnet', 'near-testnet']; - -/** - * Implementation of the payment network to pay in Near based on input data. - */ -export default class NearNativePaymentNetwork extends NativeTokenPaymentNetwork { - public constructor( - extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_NATIVE_TOKEN, - currentVersion: string = CURRENT_VERSION, - ) { - super(extensionId, currentVersion, supportedNetworks); - } - - /** - * Check if a near address is valid - * - * @param {string} address address to check - * @returns {boolean} true if address is valid - */ - protected isValidAddress(address: string, networkName?: string): boolean { - switch (networkName) { - case 'aurora': - return this.isValidMainnetAddress(address); - case 'aurora-testnet': - case 'near-testnet': - return this.isValidTestnetAddress(address); - case undefined: - return this.isValidMainnetAddress(address) || this.isValidTestnetAddress(address); - default: - throw new UnsupportedNetworkError(networkName, this.supportedNetworks); - } - } - - private isValidMainnetAddress(address: string): boolean { - return this.isValidAddressForSymbolAndNetwork(address, 'NEAR', 'aurora'); - } - - private isValidTestnetAddress(address: string): boolean { - return this.isValidAddressForSymbolAndNetwork(address, 'NEAR-testnet', 'aurora-testnet'); - } -} diff --git a/packages/advanced-logic/src/extensions/payment-network/near/any-to-near-testnet.ts b/packages/advanced-logic/src/extensions/payment-network/near/any-to-near-testnet.ts new file mode 100644 index 0000000000..0c848ea398 --- /dev/null +++ b/packages/advanced-logic/src/extensions/payment-network/near/any-to-near-testnet.ts @@ -0,0 +1,19 @@ +import { ICurrencyManager } from '@requestnetwork/currency'; +import AnyToNearPaymentNetwork from './any-to-near'; + +export default class AnyToNearTestnetPaymentNetwork extends AnyToNearPaymentNetwork { + public constructor(currencyManager: ICurrencyManager) { + // testnet PN version is the same as mainnet, can be overridden here if needed + super(currencyManager, ['aurora-testnet', 'near-testnet']); + } + + /** + * Check if a near testnet address is valid + * + * @param {string} address address to check + * @returns {boolean} true if address is valid + */ + protected isValidAddress(address: string): boolean { + return this.isValidAddressForSymbolAndNetwork(address, 'NEAR-testnet', 'aurora-testnet'); + } +} diff --git a/packages/advanced-logic/src/extensions/payment-network/any-to-near.ts b/packages/advanced-logic/src/extensions/payment-network/near/any-to-near.ts similarity index 74% rename from packages/advanced-logic/src/extensions/payment-network/any-to-near.ts rename to packages/advanced-logic/src/extensions/payment-network/near/any-to-near.ts index 2f24316d11..66f48c98ab 100644 --- a/packages/advanced-logic/src/extensions/payment-network/any-to-near.ts +++ b/packages/advanced-logic/src/extensions/payment-network/near/any-to-near.ts @@ -1,18 +1,20 @@ import { ICurrencyManager, UnsupportedCurrencyError } from '@requestnetwork/currency'; import { ExtensionTypes, IdentityTypes, RequestLogicTypes } from '@requestnetwork/types'; -import { UnsupportedNetworkError } from './address-based'; -import AnyToNativeTokenPaymentNetwork from './any-to-native'; +import AnyToNativeTokenPaymentNetwork from '../any-to-native'; const CURRENT_VERSION = '0.1.0'; -const supportedNetworks = ['aurora', 'aurora-testnet', 'near-testnet']; export default class AnyToNearPaymentNetwork extends AnyToNativeTokenPaymentNetwork { public constructor( private currencyManager: ICurrencyManager, - extensionId: ExtensionTypes.ID = ExtensionTypes.ID.PAYMENT_NETWORK_ANY_TO_NATIVE_TOKEN, + supportedNetworks: string[] = [ + 'aurora', + // FIXME: enable near network support + // 'near' + ], currentVersion: string = CURRENT_VERSION, ) { - super(extensionId, currentVersion, supportedNetworks); + super(ExtensionTypes.ID.PAYMENT_NETWORK_ANY_TO_NATIVE_TOKEN, currentVersion, supportedNetworks); } /** @@ -21,28 +23,10 @@ export default class AnyToNearPaymentNetwork extends AnyToNativeTokenPaymentNetw * @param {string} address address to check * @returns {boolean} true if address is valid */ - protected isValidAddress(address: string, networkName?: string): boolean { - switch (networkName) { - case 'aurora': - return this.isValidMainnetAddress(address); - case 'aurora-testnet': - case 'near-testnet': - return this.isValidTestnetAddress(address); - case undefined: - return this.isValidMainnetAddress(address) || this.isValidTestnetAddress(address); - default: - throw new UnsupportedNetworkError(networkName, this.supportedNetworks); - } - } - - private isValidMainnetAddress(address: string): boolean { + protected isValidAddress(address: string): boolean { return this.isValidAddressForSymbolAndNetwork(address, 'NEAR', 'aurora'); } - private isValidTestnetAddress(address: string): boolean { - return this.isValidAddressForSymbolAndNetwork(address, 'NEAR-testnet', 'aurora-testnet'); - } - /** * Applies a creation extension action * @@ -61,10 +45,7 @@ export default class AnyToNearPaymentNetwork extends AnyToNativeTokenPaymentNetw if ( extensionAction.parameters.paymentAddress && - !this.isValidAddress( - extensionAction.parameters.paymentAddress, - extensionAction.parameters.network, - ) + !this.isValidAddress(extensionAction.parameters.paymentAddress) ) { throw Error( `paymentAddress ${extensionAction.parameters.paymentAddress} is not a valid address`, @@ -73,20 +54,14 @@ export default class AnyToNearPaymentNetwork extends AnyToNativeTokenPaymentNetw if ( extensionAction.parameters.feeAddress && - !this.isValidAddress( - extensionAction.parameters.feeAddress, - extensionAction.parameters.network, - ) + !this.isValidAddress(extensionAction.parameters.feeAddress) ) { throw Error(`feeAddress ${extensionAction.parameters.feeAddress} is not a valid address`); } if ( extensionAction.parameters.refundAddress && - !this.isValidAddress( - extensionAction.parameters.refundAddress, - extensionAction.parameters.network, - ) + !this.isValidAddress(extensionAction.parameters.refundAddress) ) { throw Error( `refundAddress ${extensionAction.parameters.refundAddress} is not a valid address`, @@ -128,7 +103,7 @@ export default class AnyToNearPaymentNetwork extends AnyToNativeTokenPaymentNetw * @param requestState request state read-only * @param actionSigner identity of the signer * - * @returns state of the extension updated + * @returns state of the extension updated */ protected applyAddPaymentAddress( extensionState: ExtensionTypes.IState, @@ -138,7 +113,7 @@ export default class AnyToNearPaymentNetwork extends AnyToNativeTokenPaymentNetw timestamp: number, ): ExtensionTypes.IState { const paymentAddress = extensionAction.parameters.paymentAddress; - if (!this.isValidAddress(paymentAddress, extensionState.values.network)) { + if (!this.isValidAddress(paymentAddress)) { throw new Error(`paymentAddress '${paymentAddress}' is not a valid address`); } return super.applyAddPaymentAddress( @@ -157,11 +132,9 @@ export default class AnyToNearPaymentNetwork extends AnyToNativeTokenPaymentNetw actionSigner: IdentityTypes.IIdentity, timestamp: number, ): ExtensionTypes.IState { - const network = - requestState.extensions[ExtensionTypes.ID.PAYMENT_NETWORK_ANY_TO_NATIVE_TOKEN].values.network; if ( extensionAction.parameters.feeAddress && - !this.isValidAddress(extensionAction.parameters.feeAddress, network) + !this.isValidAddress(extensionAction.parameters.feeAddress) ) { throw Error('feeAddress is not a valid address'); } @@ -193,7 +166,7 @@ export default class AnyToNearPaymentNetwork extends AnyToNativeTokenPaymentNetw ); } - if (!supportedNetworks.includes(network)) { + if (!this.supportedNetworks.includes(network)) { throw new Error(`The network (${network}) is not supported for this payment network.`); } diff --git a/packages/advanced-logic/src/extensions/payment-network/near/near-native.ts b/packages/advanced-logic/src/extensions/payment-network/near/near-native.ts new file mode 100644 index 0000000000..80d861aa0e --- /dev/null +++ b/packages/advanced-logic/src/extensions/payment-network/near/near-native.ts @@ -0,0 +1,30 @@ +import { ExtensionTypes } from '@requestnetwork/types'; +import NativeTokenPaymentNetwork from '../native-token'; + +const CURRENT_VERSION = '0.2.0'; + +/** + * Implementation of the payment network to pay in Near based on input data. + */ +export default class NearNativePaymentNetwork extends NativeTokenPaymentNetwork { + public constructor( + supportedNetworks: string[] = [ + 'aurora', + // FIXME: enable near network support + // 'near' + ], + currentVersion: string = CURRENT_VERSION, + ) { + super(ExtensionTypes.ID.PAYMENT_NETWORK_NATIVE_TOKEN, currentVersion, supportedNetworks); + } + + /** + * Check if a near address is valid + * + * @param {string} address address to check + * @returns {boolean} true if address is valid + */ + protected isValidAddress(address: string): boolean { + return this.isValidAddressForSymbolAndNetwork(address, 'NEAR', 'aurora'); + } +} diff --git a/packages/advanced-logic/src/extensions/payment-network/near/near-testnet-native.ts b/packages/advanced-logic/src/extensions/payment-network/near/near-testnet-native.ts new file mode 100644 index 0000000000..79d8220c58 --- /dev/null +++ b/packages/advanced-logic/src/extensions/payment-network/near/near-testnet-native.ts @@ -0,0 +1,21 @@ +import NearNativePaymentNetwork from './near-native'; + +/** + * Implementation of the payment network to pay in Near on testnet based on input data. + */ +export default class NearTestnetNativeNativePaymentNetwork extends NearNativePaymentNetwork { + public constructor() { + // testnet PN version is the same as mainnet, can be overridden here if needed + super(['aurora-testnet', 'near-testnet']); + } + + /** + * Check if a near testnet address is valid + * + * @param {string} address address to check + * @returns {boolean} true if address is valid + */ + protected isValidAddress(address: string): boolean { + return this.isValidAddressForSymbolAndNetwork(address, 'NEAR-testnet', 'aurora-testnet'); + } +} diff --git a/packages/advanced-logic/src/extensions/payment-network/reference-based.ts b/packages/advanced-logic/src/extensions/payment-network/reference-based.ts index 05fee1f982..6158f0d5a2 100644 --- a/packages/advanced-logic/src/extensions/payment-network/reference-based.ts +++ b/packages/advanced-logic/src/extensions/payment-network/reference-based.ts @@ -1,4 +1,4 @@ -import { ExtensionTypes, RequestLogicTypes } from '@requestnetwork/types'; +import { ExtensionTypes } from '@requestnetwork/types'; import AddressBasedPaymentNetwork from './address-based'; // Regex for "at least 16 hexadecimal numbers". Used to validate the salt @@ -11,15 +11,6 @@ const eightHexRegex = /[0-9a-f]{16,}/; export default abstract class ReferenceBasedPaymentNetwork< TCreationParameters extends ExtensionTypes.PnReferenceBased.ICreationParameters = ExtensionTypes.PnReferenceBased.ICreationParameters, > extends AddressBasedPaymentNetwork { - public constructor( - public extensionId: ExtensionTypes.ID, - public currentVersion: string, - public supportedNetworks: string[], - public supportedCurrencyType: RequestLogicTypes.CURRENCY, - ) { - super(extensionId, currentVersion, supportedNetworks, supportedCurrencyType); - } - /** * Creates the extensionsData to create the payment detection extension * diff --git a/packages/advanced-logic/test/extensions/payment-network/address-based.test.ts b/packages/advanced-logic/test/extensions/payment-network/address-based.test.ts index a4893f5e5a..0aa0b6e993 100644 --- a/packages/advanced-logic/test/extensions/payment-network/address-based.test.ts +++ b/packages/advanced-logic/test/extensions/payment-network/address-based.test.ts @@ -5,15 +5,21 @@ import AddressBasedPaymentNetwork from '../../../src/extensions/payment-network/ describe('extensions/payment-network/address-based', () => { it('address validation should throw when using unsupported currency type', () => { class TestAddressBasedPaymentNetwork extends AddressBasedPaymentNetwork { + public constructor( + extensionId: ExtensionTypes.ID, + currentVersion: string, + supportedCurrencyType: RequestLogicTypes.CURRENCY, + ) { + super(extensionId, currentVersion, supportedCurrencyType); + } public testIsValidAddress() { - this.isValidAddress('test', 'test'); + this.isValidAddress('test'); } } expect(() => { const testAddressBasedPaymentNetwork = new TestAddressBasedPaymentNetwork( ExtensionTypes.ID.PAYMENT_NETWORK_ERC20_ADDRESS_BASED, 'test', - [], RequestLogicTypes.CURRENCY.ISO4217, ); testAddressBasedPaymentNetwork.testIsValidAddress(); @@ -23,6 +29,13 @@ describe('extensions/payment-network/address-based', () => { }); it('address validation should throw when using unsupported currency', () => { class TestAddressBasedPaymentNetwork extends AddressBasedPaymentNetwork { + public constructor( + extensionId: ExtensionTypes.ID, + currentVersion: string, + supportedCurrencyType: RequestLogicTypes.CURRENCY, + ) { + super(extensionId, currentVersion, supportedCurrencyType); + } public testIsValidAddress() { this.isValidAddressForSymbolAndNetwork('test', 'test', 'test'); } @@ -31,7 +44,6 @@ describe('extensions/payment-network/address-based', () => { const testAddressBasedPaymentNetwork = new TestAddressBasedPaymentNetwork( ExtensionTypes.ID.PAYMENT_NETWORK_ERC20_ADDRESS_BASED, 'test', - [], RequestLogicTypes.CURRENCY.ERC20, ); testAddressBasedPaymentNetwork.testIsValidAddress(); diff --git a/packages/advanced-logic/test/extensions/payment-network/any-to-erc20-proxy.test.ts b/packages/advanced-logic/test/extensions/payment-network/any-to-erc20-proxy.test.ts index 804cceb224..57642ff853 100644 --- a/packages/advanced-logic/test/extensions/payment-network/any-to-erc20-proxy.test.ts +++ b/packages/advanced-logic/test/extensions/payment-network/any-to-erc20-proxy.test.ts @@ -1,10 +1,6 @@ import { ExtensionTypes, RequestLogicTypes } from '@requestnetwork/types'; import Utils from '@requestnetwork/utils'; -import { - conversionSupportedNetworks, - CurrencyManager, - UnsupportedCurrencyError, -} from '@requestnetwork/currency'; +import { CurrencyManager, UnsupportedCurrencyError } from '@requestnetwork/currency'; import AnyToErc20Proxy from '../../../src/extensions/payment-network/any-to-erc20-proxy'; import * as DataConversionERC20FeeAddData from '../../utils/payment-network/erc20/any-to-erc20-proxy-add-data-generator'; @@ -143,7 +139,7 @@ describe('extensions/payment-network/erc20/any-to-erc20-fee-proxy-contract', () }).toThrowError('acceptedTokens must contains only valid ethereum addresses'); }); - it('cannot createCreationAction with network not supported', () => { + it('cannot createCreationAction with currency not supported', () => { // 'must throw' expect(() => { anyToErc20Proxy.createCreationAction({ @@ -153,9 +149,7 @@ describe('extensions/payment-network/erc20/any-to-erc20-fee-proxy-contract', () acceptedTokens: ['0x0000000000000000000000000000000000000003'], }); }).toThrowError( - `Payment network 'kovan' is not supported by this extension (only ${conversionSupportedNetworks.join( - ', ', - )})`, + "The currency '0x0000000000000000000000000000000000000003' on kovan is unknown or not supported.", ); }); diff --git a/packages/advanced-logic/test/extensions/payment-network/any-to-eth-proxy.test.ts b/packages/advanced-logic/test/extensions/payment-network/any-to-eth-proxy.test.ts index 7dcc958214..d68cc4726b 100644 --- a/packages/advanced-logic/test/extensions/payment-network/any-to-eth-proxy.test.ts +++ b/packages/advanced-logic/test/extensions/payment-network/any-to-eth-proxy.test.ts @@ -1,10 +1,6 @@ import { ExtensionTypes, RequestLogicTypes } from '@requestnetwork/types'; import Utils from '@requestnetwork/utils'; -import { - conversionSupportedNetworks, - CurrencyManager, - UnsupportedCurrencyError, -} from '@requestnetwork/currency'; +import { CurrencyManager, UnsupportedCurrencyError } from '@requestnetwork/currency'; import AnyToEthProxy from '../../../src/extensions/payment-network/any-to-eth-proxy'; import * as DataConversionETHFeeAddData from '../../utils/payment-network/ethereum/any-to-eth-proxy-add-data-generator'; @@ -115,22 +111,7 @@ describe('extensions/payment-network/ethereum/any-to-eth-fee-proxy-contract', () }).toThrowError('feeAmount is not a valid amount'); }); - it('cannot createCreationAction with network not supported', () => { - // 'must throw' - expect(() => { - anyToEthProxy.createCreationAction({ - paymentAddress: '0x0000000000000000000000000000000000000001', - salt: 'ea3bc7caf64110ca', - network: 'kovan', - }); - }).toThrowError( - `Payment network 'kovan' is not supported by this extension (only ${conversionSupportedNetworks.join( - ', ', - )})`, - ); - }); - - it('cannot applyActionToExtensions of creation with an invalid network', () => { + it('cannot applyActionToExtensions of creation with an invalid network/currency pair', () => { const requestCreatedNoExtension: RequestLogicTypes.IRequest = Utils.deepCopy( TestData.requestCreatedNoExtension, ); @@ -153,7 +134,9 @@ describe('extensions/payment-network/ethereum/any-to-eth-fee-proxy-contract', () TestData.otherIdRaw.identity, TestData.arbitraryTimestamp, ); - }).toThrowError(`The network (invalid network) is not supported for this payment network.`); + }).toThrowError( + `The currency (ETH) of the request is not supported for this payment network.`, + ); }); it('cannot applyActionToExtensions of creation on a non supported currency', () => { diff --git a/packages/advanced-logic/test/extensions/payment-network/any-to-near.test.ts b/packages/advanced-logic/test/extensions/payment-network/any-to-near.test.ts index 42cd3f7518..65bcfa8053 100644 --- a/packages/advanced-logic/test/extensions/payment-network/any-to-near.test.ts +++ b/packages/advanced-logic/test/extensions/payment-network/any-to-near.test.ts @@ -9,10 +9,11 @@ import { import { AdvancedLogic } from '../../../src'; import { arbitraryTimestamp, payeeRaw, payerRaw } from '../../utils/test-data-generator'; import { ExtensionTypes, RequestLogicTypes } from '@requestnetwork/types'; -import AnyToNearPaymentNetwork from '../../../src/extensions/payment-network/any-to-near'; +import AnyToNearPaymentNetwork from '../../../src/extensions/payment-network/near/any-to-near'; import AnyToNativeTokenPaymentNetwork from '../../../src/extensions/payment-network/any-to-native'; import { CurrencyManager } from '@requestnetwork/currency'; import utils from '@requestnetwork/utils'; +import AnyToNearTestnetPaymentNetwork from '../../../src/extensions/payment-network/near/any-to-near-testnet'; const salt = arbitrarySalt; const currencyManager = CurrencyManager.getDefault(); @@ -41,7 +42,7 @@ describe('extensions/payment-network/any-to-native-token', () => { }, { name: 'Near testnet', - paymentNetwork: new AnyToNearPaymentNetwork( + paymentNetwork: new AnyToNearTestnetPaymentNetwork( currencyManager, ) as AnyToNativeTokenPaymentNetwork, suffix: 'testnet', @@ -186,7 +187,7 @@ describe('extensions/payment-network/any-to-native-token', () => { network: 'another-chain', }); }).toThrowError( - `Payment network 'another-chain' is not supported by this extension (only aurora, aurora-testnet, near-testnet)`, + `Payment network 'another-chain' is not supported by this extension (only aurora)`, ); }); it('throws when payment network is missing', () => { @@ -453,18 +454,10 @@ describe('extensions/payment-network/any-to-native-token', () => { validRequestState.extensions = intermediateExtensionState; - const addPaymentAddressAction = anyToNearPn.createAddPaymentAddressAction({ - paymentAddress: invalidAddress, - }); - expect(() => { - advancedLogic.applyActionToExtensions( - intermediateExtensionState, - addPaymentAddressAction, - validRequestState, - payeeRaw.identity, - arbitraryTimestamp, - ); + anyToNearPn.createAddPaymentAddressAction({ + paymentAddress: invalidAddress, + }); }).toThrowError(`paymentAddress '${invalidAddress}' is not a valid address`); }); }); diff --git a/packages/advanced-logic/test/extensions/payment-network/native-token.test.ts b/packages/advanced-logic/test/extensions/payment-network/native-token.test.ts index ddc6b4cbfc..3148a6b84a 100644 --- a/packages/advanced-logic/test/extensions/payment-network/native-token.test.ts +++ b/packages/advanced-logic/test/extensions/payment-network/native-token.test.ts @@ -1,8 +1,8 @@ import NativeTokenPaymentNetwork from '../../../src/extensions/payment-network/native-token'; -import NearNativePaymentNetwork from '../../../src/extensions/payment-network/near-native'; +import NearNativePaymentNetwork from '../../../src/extensions/payment-network/near/near-native'; import { - requestStateNoExtensions, arbitrarySalt, + requestStateNoExtensions, } from '../../utils/payment-network/any/generator-data-create'; import { actionCreationWithNativeTokenPayment, @@ -12,6 +12,7 @@ import { import { AdvancedLogic } from '../../../src'; import { arbitraryTimestamp, payeeRaw } from '../../utils/test-data-generator'; import { ExtensionTypes, RequestLogicTypes } from '@requestnetwork/types'; +import NearTestnetNativeNativePaymentNetwork from '../../../src/extensions/payment-network/near/near-testnet-native'; const salt = arbitrarySalt; @@ -43,7 +44,7 @@ describe('extensions/payment-network/native-token', () => { }, { name: 'Aurora testnet', - paymentNetwork: new NearNativePaymentNetwork() as NativeTokenPaymentNetwork, + paymentNetwork: new NearTestnetNativeNativePaymentNetwork() as NativeTokenPaymentNetwork, networkName: 'aurora-testnet', suffix: 'testnet', wrongSuffix: 'near', @@ -52,7 +53,7 @@ describe('extensions/payment-network/native-token', () => { }, { name: 'Near testnet', - paymentNetwork: new NearNativePaymentNetwork() as NativeTokenPaymentNetwork, + paymentNetwork: new NearTestnetNativeNativePaymentNetwork() as NativeTokenPaymentNetwork, networkName: 'near-testnet', suffix: 'testnet', wrongSuffix: 'near', @@ -150,7 +151,7 @@ describe('extensions/payment-network/native-token', () => { paymentNetworkName: 'another-chain', }); }).toThrowError( - `Payment network 'another-chain' is not supported by this extension (only aurora, aurora-testnet, near-testnet)`, + `Payment network 'another-chain' is not supported by this extension (only aurora)`, ); }); it('createCreationAction() throws without payment network', () => { @@ -251,7 +252,7 @@ describe('extensions/payment-network/native-token', () => { }); it('throws when creating the extension on a different network from the request network', () => { const advancedLogic = new AdvancedLogic(); - const nearPn = new NearNativePaymentNetwork(); + const nearPn = new NearTestnetNativeNativePaymentNetwork(); const requestState: typeof requestStateNoExtensions = { ...requestStateNoExtensions, @@ -279,7 +280,7 @@ describe('extensions/payment-network/native-token', () => { currency: mainnetTestCase.currency, }; - const intermediateExtensionState = advancedLogic.applyActionToExtensions( + requestState.extensions = advancedLogic.applyActionToExtensions( requestState.extensions, nearPn.createCreationAction({ salt, paymentNetworkName: 'aurora' }), requestState, @@ -287,20 +288,10 @@ describe('extensions/payment-network/native-token', () => { arbitraryTimestamp, ); - requestState.extensions = intermediateExtensionState; - - const addPaymentAddressAction = nearPn.createAddPaymentAddressAction({ - paymentAddress: 'pay.testnet', - }); - expect(() => { - advancedLogic.applyActionToExtensions( - intermediateExtensionState, - addPaymentAddressAction, - requestState, - payeeRaw.identity, - arbitraryTimestamp, - ); + nearPn.createAddPaymentAddressAction({ + paymentAddress: 'pay.testnet', + }); }).toThrowError("paymentAddress 'pay.testnet' is not a valid address"); }); it('throws with no state or action payment network', () => { @@ -428,7 +419,7 @@ describe('extensions/payment-network/native-token', () => { it('should throw when isValidAddress is not overridden', () => { class TestNativePaymentNetwork extends NativeTokenPaymentNetwork { public testIsValidAddress() { - this.isValidAddress('test', 'test'); + this.isValidAddress('test'); } } expect(() => { diff --git a/packages/data-access/src/data-access.ts b/packages/data-access/src/data-access.ts index 9df02bb3d4..df9ddf8728 100644 --- a/packages/data-access/src/data-access.ts +++ b/packages/data-access/src/data-access.ts @@ -92,7 +92,6 @@ export default class DataAccess implements DataAccessTypes.IDataAccess { * Constructor DataAccess interface * * @param IStorage storage storage object - * @param options */ public constructor(storage: StorageTypes.IStorage, options?: Partial) { const defaultOptions: IDataAccessOptions = { diff --git a/packages/ethereum-storage/src/ipfs-manager.ts b/packages/ethereum-storage/src/ipfs-manager.ts index 0ad13866a3..65fc0938ab 100644 --- a/packages/ethereum-storage/src/ipfs-manager.ts +++ b/packages/ethereum-storage/src/ipfs-manager.ts @@ -35,8 +35,6 @@ export default class IpfsManager { * @param options.ipfsConnection Object to connect to the ipfs gateway * If no values are provided default values from config are used * Private network is used for default values - * @param options.ipfsErrorHandling - * @param options.logger */ public constructor(options?: { ipfsGatewayConnection?: StorageTypes.IIpfsGatewayConnection; diff --git a/packages/integration-test/test/scheduled/mocks.ts b/packages/integration-test/test/scheduled/mocks.ts index 5d68d1028b..086624efdd 100644 --- a/packages/integration-test/test/scheduled/mocks.ts +++ b/packages/integration-test/test/scheduled/mocks.ts @@ -1,4 +1,5 @@ import { AdvancedLogicTypes } from '@requestnetwork/types'; +import * as Extension from '@requestnetwork/types/src/extension-types'; const createAddPaymentAddressAction = jest.fn(); const createAddRefundAddressAction = jest.fn(); @@ -8,58 +9,67 @@ const createAddPaymentInstructionAction = jest.fn(); const createAddRefundInstructionAction = jest.fn(); export const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + applyActionToExtensions: jest.fn(), + getNativeTokenExtensionForNetwork: jest.fn(), + getAnyToNativeTokenExtensionForNetwork: jest.fn(), extensions: { + addressBasedBtc: + {} as Extension.PnAddressBased.IAddressBased, addressBasedErc20: { createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, - }, - feeProxyContractErc20: { - supportedNetworks: ['mainnet', 'rinkeby', 'private', 'matic'], + } as any as Extension.PnAddressBased.IAddressBased, + addressBasedTestnetBtc: + {} as Extension.PnAddressBased.IAddressBased, + contentData: {} as Extension.ContentData.IContentData, + anyToErc20Proxy: {} as Extension.PnAnyToErc20.IAnyToERC20, + declarative: + {} as Extension.PnAnyDeclarative.IAnyDeclarative, + ethereumInputData: { createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, - createAddFeeAction, - // inherited from declarative createAddPaymentInstructionAction, createAddRefundInstructionAction, - }, - proxyContractErc20: { - supportedNetworks: ['rinkeby', 'private'], + } as any as Extension.PnReferenceBased.IReferenceBased, + nativeToken: + {} as Extension.PnReferenceBased.IReferenceBased[], + feeProxyContractErc20: { createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, - // inheritance from declarative + createAddFeeAction, + // inherited from declarative createAddPaymentInstructionAction, createAddRefundInstructionAction, - }, - feeProxyContractEth: { - supportedNetworks: ['rinkeby', 'private'], + } as any as Extension.PnFeeReferenceBased.IFeeReferenceBased, + proxyContractErc20: { createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, + // inheritance from declarative createAddPaymentInstructionAction, createAddRefundInstructionAction, - }, - ethereumInputData: { - supportedNetworks: ['rinkeby', 'private'], + } as any as Extension.PnReferenceBased.IReferenceBased, + erc777Stream: { createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, + // inheritance from declarative createAddPaymentInstructionAction, createAddRefundInstructionAction, }, - erc777Stream: { - supportedNetworks: ['rinkeby'], + feeProxyContractEth: { createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, - // inheritance from declarative createAddPaymentInstructionAction, createAddRefundInstructionAction, - }, + } as any as Extension.PnFeeReferenceBased.IFeeReferenceBased, + anyToEthProxy: + {} as Extension.PnFeeReferenceBased.IFeeReferenceBased, + anyToNativeToken: + {} as Extension.PnFeeReferenceBased.IFeeReferenceBased[], }, }; diff --git a/packages/payment-detection/src/any-to-any-detector.ts b/packages/payment-detection/src/any-to-any-detector.ts index d7d68a22ea..75cc59321a 100644 --- a/packages/payment-detection/src/any-to-any-detector.ts +++ b/packages/payment-detection/src/any-to-any-detector.ts @@ -13,9 +13,8 @@ export abstract class AnyToAnyDetector< > extends FeeReferenceBasedDetector { /** * @param extension The advanced logic payment network extension, with conversion - * @param extensionType Example : PaymentTypes.PAYMENT_NETWORK_ID.ANY_TO_ETH_PROXY */ - public constructor( + protected constructor( paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID, extension: TExtension, currencyManager: ICurrencyManager, @@ -37,14 +36,6 @@ export abstract class AnyToAnyDetector< paymentNetworkCreationParameters.salt = paymentNetworkCreationParameters.salt || (await Utils.crypto.generate8randomBytes()); - return this.extension.createCreationAction({ - feeAddress: paymentNetworkCreationParameters.feeAddress, - feeAmount: paymentNetworkCreationParameters.feeAmount, - paymentAddress: paymentNetworkCreationParameters.paymentAddress, - refundAddress: paymentNetworkCreationParameters.refundAddress, - network: paymentNetworkCreationParameters.network, - maxRateTimespan: paymentNetworkCreationParameters.maxRateTimespan, - ...paymentNetworkCreationParameters, - }); + return this.extension.createCreationAction(paymentNetworkCreationParameters); } } diff --git a/packages/payment-detection/src/any-to-native-detector.ts b/packages/payment-detection/src/any-to-native-detector.ts new file mode 100644 index 0000000000..afeea93400 --- /dev/null +++ b/packages/payment-detection/src/any-to-native-detector.ts @@ -0,0 +1,23 @@ +import { ExtensionTypes, PaymentTypes } from '@requestnetwork/types'; + +import { AnyToAnyDetector } from './any-to-any-detector'; +import { NativeDetectorOptions } from './types'; + +/** + * Handle payment detection for native token payment with conversion + */ +export abstract class AnyToNativeDetector extends AnyToAnyDetector< + ExtensionTypes.PnAnyToEth.IAnyToEth, + PaymentTypes.IETHPaymentEventParameters +> { + protected constructor({ network, advancedLogic, currencyManager }: NativeDetectorOptions) { + const extensionId = PaymentTypes.PAYMENT_NETWORK_ID.ANY_TO_NATIVE; + const extension = advancedLogic.getAnyToNativeTokenExtensionForNetwork( + network, + ) as ExtensionTypes.PnAnyToEth.IAnyToEth; + if (!extension) { + throw new Error(`the ${extensionId} extension is not supported for the network ${network}`); + } + super(extensionId, extension, currencyManager); + } +} diff --git a/packages/payment-detection/src/btc/address-based.ts b/packages/payment-detection/src/btc/address-based.ts index df339c974d..0b0a4cb0ed 100644 --- a/packages/payment-detection/src/btc/address-based.ts +++ b/packages/payment-detection/src/btc/address-based.ts @@ -12,7 +12,7 @@ export abstract class BtcAddressBasedDetector extends PaymentDetectorBase< /** * @param extension The advanced logic payment network extensions */ - public constructor( + protected constructor( private networkId: number, paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID, extension: ExtensionTypes.PnAddressBased.IAddressBased, diff --git a/packages/payment-detection/src/declarative.ts b/packages/payment-detection/src/declarative.ts index a383e10f9a..d8d9af8b2c 100644 --- a/packages/payment-detection/src/declarative.ts +++ b/packages/payment-detection/src/declarative.ts @@ -14,7 +14,7 @@ export abstract class DeclarativePaymentDetectorBase< TExtension extends ExtensionTypes.PnAnyDeclarative.IAnyDeclarative, TPaymentEventParameters extends PaymentTypes.IDeclarativePaymentEventParameters, > extends PaymentDetectorBase { - public constructor(_paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID, extension: TExtension) { + protected constructor(_paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID, extension: TExtension) { super(_paymentNetworkId, extension); } diff --git a/packages/payment-detection/src/erc20/address-based-info-retriever.ts b/packages/payment-detection/src/erc20/address-based-info-retriever.ts index 3d9487ce4a..6f82237cf4 100644 --- a/packages/payment-detection/src/erc20/address-based-info-retriever.ts +++ b/packages/payment-detection/src/erc20/address-based-info-retriever.ts @@ -53,7 +53,7 @@ export default class ERC20InfoRetriever { /** * @param tokenContractAddress The address of the ERC20 contract - * @param address Address of the balance we want to check + * @param toAddress Address of the balance we want to check * @param eventName Indicate if it is an address for payment or refund * @param network The Ethereum network to use */ @@ -71,7 +71,7 @@ export default class ERC20InfoRetriever // Creates a local or default provider const provider = getDefaultProvider(this.network); - // Setup the ERC20 contract interface + // Set up the ERC20 contract interface const contract = new ethers.Contract( this.tokenContractAddress, erc20BalanceOfAbiFragment, @@ -79,6 +79,11 @@ export default class ERC20InfoRetriever ); // Create a filter to find all the Transfer logs for the toAddress + console.warn( + 'It is not recommended to use the ERC20InfoRetriever to retrieve ' + + 'all Transfer events from block "0" to block "latest", ' + + 'as this operation is not supported by most RPC providers', + ); const filter = contract.filters.Transfer(null, this.toAddress) as ethers.providers.Filter; filter.fromBlock = 0; filter.toBlock = 'latest'; diff --git a/packages/payment-detection/src/erc20/address-based.ts b/packages/payment-detection/src/erc20/address-based.ts index 4664b3164f..51869075dc 100644 --- a/packages/payment-detection/src/erc20/address-based.ts +++ b/packages/payment-detection/src/erc20/address-based.ts @@ -4,11 +4,9 @@ import { PaymentTypes, RequestLogicTypes, } from '@requestnetwork/types'; -import { BalanceError } from '../balance-error'; import Erc20InfoRetriever from './address-based-info-retriever'; import { PaymentDetectorBase } from '../payment-detector-base'; -const supportedNetworks = ['mainnet', 'rinkeby', 'goerli', 'private']; /** * Handle payment networks with ERC20 based address extension @@ -83,16 +81,6 @@ export class ERC20AddressBasedPaymentDetector extends PaymentDetectorBase< request.currency.network = 'mainnet'; } - if (!supportedNetworks.includes(request.currency.network)) { - throw new BalanceError( - `Payment network ${ - request.currency.network - } not supported by ERC20 payment detection. Supported networks: ${supportedNetworks.join( - ', ', - )}`, - PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, - ); - } const { paymentAddress, refundAddress } = this.getPaymentExtension(request).values; this.checkRequiredParameter(paymentAddress, 'paymentAddress'); diff --git a/packages/payment-detection/src/erc20/fee-proxy-contract.ts b/packages/payment-detection/src/erc20/fee-proxy-contract.ts index b13297bb7b..ef50f6ecfa 100644 --- a/packages/payment-detection/src/erc20/fee-proxy-contract.ts +++ b/packages/payment-detection/src/erc20/fee-proxy-contract.ts @@ -25,7 +25,7 @@ export abstract class ERC20FeeProxyPaymentDetectorBase< /** * @param extension The advanced logic payment network extensions */ - public constructor( + protected constructor( paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID, extension: TExtension, currencyManager: ICurrencyManager, diff --git a/packages/payment-detection/src/fee-reference-based-detector.ts b/packages/payment-detection/src/fee-reference-based-detector.ts index 35349f5cef..7c27f29ff4 100644 --- a/packages/payment-detection/src/fee-reference-based-detector.ts +++ b/packages/payment-detection/src/fee-reference-based-detector.ts @@ -15,8 +15,7 @@ export abstract class FeeReferenceBasedDetector< * @param paymentNetworkId Example : PaymentTypes.PAYMENT_NETWORK_ID.ETH_INPUT_DATA * @param extension The advanced logic payment network extension, reference based */ - - public constructor( + protected constructor( paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID, extension: TExtension, currencyManager: ICurrencyManager, diff --git a/packages/payment-detection/src/native-token-detector.ts b/packages/payment-detection/src/native-token-detector.ts new file mode 100644 index 0000000000..84d307a252 --- /dev/null +++ b/packages/payment-detection/src/native-token-detector.ts @@ -0,0 +1,23 @@ +import { ExtensionTypes, PaymentTypes } from '@requestnetwork/types'; + +import { ReferenceBasedDetector } from './reference-based-detector'; +import { NativeDetectorOptions } from './types'; + +/** + * Handle payment detection for native token payment + */ +export abstract class NativeTokenPaymentDetector extends ReferenceBasedDetector< + ExtensionTypes.PnReferenceBased.IReferenceBased, + PaymentTypes.IETHPaymentEventParameters +> { + protected constructor({ network, advancedLogic, currencyManager }: NativeDetectorOptions) { + const extensionId = PaymentTypes.PAYMENT_NETWORK_ID.NATIVE_TOKEN; + const extension = advancedLogic.getNativeTokenExtensionForNetwork( + network, + ) as ExtensionTypes.PnReferenceBased.IReferenceBased; + if (!extension) { + throw new Error(`the ${extensionId} extension is not supported for the network ${network}`); + } + super(extensionId, extension, currencyManager); + } +} diff --git a/packages/payment-detection/src/near/near-conversion-detector.ts b/packages/payment-detection/src/near/near-conversion-detector.ts index bd1956c42e..15c8085a1f 100644 --- a/packages/payment-detection/src/near/near-conversion-detector.ts +++ b/packages/payment-detection/src/near/near-conversion-detector.ts @@ -1,13 +1,9 @@ -import { - AdvancedLogicTypes, - ExtensionTypes, - PaymentTypes, - RequestLogicTypes, -} from '@requestnetwork/types'; - -import { AnyToAnyDetector } from '../any-to-any-detector'; -import { ICurrencyManager, UnsupportedCurrencyError } from '@requestnetwork/currency'; +import { ExtensionTypes, PaymentTypes, RequestLogicTypes } from '@requestnetwork/types'; +import { UnsupportedCurrencyError } from '@requestnetwork/currency'; import { NearConversionInfoRetriever } from './retrievers/near-conversion-info-retriever'; +import { AnyToNativeDetector } from '../any-to-native-detector'; +import { NetworkNotSupported } from '../balance-error'; +import { NativeDetectorOptions } from '../types'; // interface of the object indexing the proxy contract version interface IProxyContractVersion { @@ -22,25 +18,9 @@ const CONTRACT_ADDRESS_MAP: IProxyContractVersion = { /** * Handle payment detection for NEAR native token payment with conversion */ -export class NearConversionNativeTokenPaymentDetector extends AnyToAnyDetector< - ExtensionTypes.PnAnyToEth.IAnyToEth, - PaymentTypes.IETHPaymentEventParameters -> { - /** - * @param extension The advanced logic payment network extension - */ - public constructor({ - advancedLogic, - currencyManager, - }: { - advancedLogic: AdvancedLogicTypes.IAdvancedLogic; - currencyManager: ICurrencyManager; - }) { - super( - PaymentTypes.PAYMENT_NETWORK_ID.ANY_TO_NATIVE, - advancedLogic.extensions.anyToNativeToken[0], - currencyManager, - ); +export class NearConversionNativeTokenPaymentDetector extends AnyToNativeDetector { + constructor(args: NativeDetectorOptions) { + super(args); } public static getContractName = (chainName: string, paymentNetworkVersion = '0.1.0'): string => { @@ -58,7 +38,9 @@ export class NearConversionNativeTokenPaymentDetector extends AnyToAnyDetector< if (versionMap[chainName]?.[version]) { return versionMap[chainName][version]; } - throw Error(`Unconfigured chain '${chainName}' and version '${version}'.`); + throw new NetworkNotSupported( + `Unconfigured near-conversion-detector chain '${chainName}' and version '${version}'`, + ); }; /** diff --git a/packages/payment-detection/src/near/near-detector.ts b/packages/payment-detection/src/near/near-detector.ts index 357b38223f..861ab74010 100644 --- a/packages/payment-detection/src/near/near-detector.ts +++ b/packages/payment-detection/src/near/near-detector.ts @@ -1,8 +1,8 @@ import { ExtensionTypes, PaymentTypes, RequestLogicTypes } from '@requestnetwork/types'; - -import { ReferenceBasedDetector } from '../reference-based-detector'; -import { ReferenceBasedDetectorOptions } from '../types'; import { NearInfoRetriever } from './retrievers/near-info-retriever'; +import { NativeTokenPaymentDetector } from '../native-token-detector'; +import { NetworkNotSupported } from '../balance-error'; +import { NativeDetectorOptions } from '../types'; // interface of the object indexing the proxy contract version interface IProxyContractVersion { @@ -18,19 +18,9 @@ const CONTRACT_ADDRESS_MAP: IProxyContractVersion = { /** * Handle payment detection for NEAR native token payment */ -export class NearNativeTokenPaymentDetector extends ReferenceBasedDetector< - ExtensionTypes.PnReferenceBased.IReferenceBased, - PaymentTypes.IETHPaymentEventParameters -> { - /** - * @param extension The advanced logic payment network extension - */ - public constructor({ advancedLogic, currencyManager }: ReferenceBasedDetectorOptions) { - super( - PaymentTypes.PAYMENT_NETWORK_ID.NATIVE_TOKEN, - advancedLogic.extensions.nativeToken[0], - currencyManager, - ); +export class NearNativeTokenPaymentDetector extends NativeTokenPaymentDetector { + constructor(args: NativeDetectorOptions) { + super(args); } public static getContractName = (chainName: string, paymentNetworkVersion = '0.2.0'): string => { @@ -49,7 +39,9 @@ export class NearNativeTokenPaymentDetector extends ReferenceBasedDetector< if (versionMap[chainName]?.[version]) { return versionMap[chainName][version]; } - throw Error(`Unconfigured chain '${chainName}' and version '${version}'.`); + throw new NetworkNotSupported( + `Unconfigured near-detector chain '${chainName}' and version '${version}'`, + ); }; /** @@ -57,7 +49,6 @@ export class NearNativeTokenPaymentDetector extends ReferenceBasedDetector< * * @param address Address to check * @param eventName Indicate if it is an address for payment or refund - * @param requestCurrency The request currency * @param paymentReference The reference to identify the payment * @param paymentNetwork the payment network state * @returns The balance with events diff --git a/packages/payment-detection/src/payment-detector-base.ts b/packages/payment-detection/src/payment-detector-base.ts index 7e004b303f..15428f396e 100644 --- a/packages/payment-detection/src/payment-detector-base.ts +++ b/packages/payment-detection/src/payment-detector-base.ts @@ -11,10 +11,11 @@ export abstract class PaymentDetectorBase< TPaymentEventParameters, > implements PaymentTypes.IPaymentNetwork { - public constructor( - readonly paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID, - protected readonly extension: TExtension, + protected constructor( + public readonly paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID, + public readonly extension: TExtension, ) {} + abstract createExtensionsDataForCreation(paymentNetworkCreationParameters: any): Promise; abstract createExtensionsDataForAddRefundInformation(parameters: any): any; abstract createExtensionsDataForAddPaymentInformation(parameters: any): any; @@ -46,7 +47,7 @@ export abstract class PaymentDetectorBase< } /** - * Gets all paymnent events for a given Request + * Gets all payment events for a given Request */ protected abstract getEvents( request: RequestLogicTypes.IRequest, diff --git a/packages/payment-detection/src/payment-network-factory.ts b/packages/payment-detection/src/payment-network-factory.ts index bf46eb4a53..5426ffdc9a 100644 --- a/packages/payment-detection/src/payment-network-factory.ts +++ b/packages/payment-detection/src/payment-network-factory.ts @@ -1,22 +1,22 @@ import { AdvancedLogicTypes, PaymentTypes, RequestLogicTypes } from '@requestnetwork/types'; import { ICurrencyManager } from '@requestnetwork/currency'; import { + ContractBasedDetector, IPaymentNetworkModuleByType, ISupportedPaymentNetworkByCurrency, PaymentNetworkOptions, } from './types'; -import { BtcMainnetAddressBasedDetector } from './btc/mainnet-address-based'; -import { BtcTestnetAddressBasedDetector } from './btc/testnet-address-based'; +import { BtcMainnetAddressBasedDetector, BtcTestnetAddressBasedDetector } from './btc'; import { DeclarativePaymentDetector } from './declarative'; -import { ERC20AddressBasedPaymentDetector } from './erc20/address-based'; -import { ERC20FeeProxyPaymentDetector } from './erc20/fee-proxy-contract'; -import { ERC20ProxyPaymentDetector } from './erc20/proxy-contract'; +import { + ERC20AddressBasedPaymentDetector, + ERC20FeeProxyPaymentDetector, + ERC20ProxyPaymentDetector, +} from './erc20'; import { SuperFluidPaymentDetector } from './erc777/superfluid-detector'; -import { EthInputDataPaymentDetector } from './eth/input-data'; -import { EthFeeProxyPaymentDetector } from './eth/fee-proxy-detector'; -import { AnyToERC20PaymentDetector } from './any/any-to-erc20-proxy'; +import { EthFeeProxyPaymentDetector, EthInputDataPaymentDetector } from './eth'; +import { AnyToERC20PaymentDetector, AnyToEthFeeProxyPaymentDetector } from './any'; import { NearConversionNativeTokenPaymentDetector, NearNativeTokenPaymentDetector } from './near'; -import { AnyToEthFeeProxyPaymentDetector } from './any/any-to-eth-proxy'; import { getPaymentNetworkExtension } from './utils'; import { getTheGraphClient } from './thegraph'; import { getDefaultProvider } from './provider'; @@ -103,17 +103,20 @@ export class PaymentNetworkFactory { * Creates a payment network according to payment network creation parameters * It throws if the payment network given is not supported by this library * - * @param currency the currency of the request - * @param paymentNetworkCreationParameters creation parameters of payment network + * @param paymentNetworkId the ID of the payment network to instantiate + * @param currencyType the currency type of the request + * @param currencyNetwork the network of the currency of the payment to detect * @returns the module to handle the payment network */ public createPaymentNetwork( paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID, currencyType: RequestLogicTypes.CURRENCY, currencyNetwork?: string, + paymentNetworkVersion?: string, ): PaymentTypes.IPaymentNetwork { + const network = currencyNetwork || 'mainnet'; const currencyPaymentMap = - supportedPaymentNetwork[currencyType]?.[currencyNetwork || 'mainnet'] || + supportedPaymentNetwork[currencyType]?.[network] || supportedPaymentNetwork[currencyType]?.['*'] || {}; const paymentNetworkMap = { @@ -121,18 +124,30 @@ export class PaymentNetworkFactory { ...anyCurrencyPaymentNetwork, }; - if (!paymentNetworkMap[paymentNetworkId]) { + const detectorClass = paymentNetworkMap[paymentNetworkId]; + + if (!detectorClass) { throw new Error( - `the payment network id: ${paymentNetworkId} is not supported for the currency: ${currencyType} on network ${ - currencyNetwork || 'mainnet' - }`, + `the payment network id: ${paymentNetworkId} is not supported for the currency: ${currencyType} on network ${network}`, ); } - return new paymentNetworkMap[paymentNetworkId]({ + + const detector = new detectorClass({ + network, advancedLogic: this.advancedLogic, currencyManager: this.currencyManager, ...this.options, }); + + if (detector.extension && 'getDeploymentInformation' in detectorClass) { + // this throws when the contract isn't deployed and was mandatory for payment detection + (detectorClass as ContractBasedDetector).getDeploymentInformation( + network, + paymentNetworkVersion || detector.extension.currentVersion, + ); + } + + return detector; } /** @@ -146,16 +161,16 @@ export class PaymentNetworkFactory { request: RequestLogicTypes.IRequest, ): PaymentTypes.IPaymentNetwork | null { const pn = getPaymentNetworkExtension(request); - if (!pn) { return null; } - const paymentNetworkId = pn.id as unknown as PaymentTypes.PAYMENT_NETWORK_ID; + const { id, version } = pn; return this.createPaymentNetwork( - paymentNetworkId, + id as unknown as PaymentTypes.PAYMENT_NETWORK_ID, request.currency.type, request.currency.network, + version, ); } } diff --git a/packages/payment-detection/src/provider.ts b/packages/payment-detection/src/provider.ts index b06067da67..2d3e74d9a4 100644 --- a/packages/payment-detection/src/provider.ts +++ b/packages/payment-detection/src/provider.ts @@ -46,7 +46,6 @@ const networkRpcs: Record = { /** * @see getDefaultProvider - * @param network */ const defaultProviderFactory: ProviderFactory = (network: string | undefined) => { if (!network) { @@ -100,7 +99,7 @@ const defaultProviderFactory: ProviderFactory = (network: string | undefined) => /** * Defines the behaviour to obtain a Provider for a given Network. - * May be overriden using setProviderFactory + * May be overridden using setProviderFactory */ let currentProviderFactory: CurrentProviderFactory = defaultProviderFactory; diff --git a/packages/payment-detection/src/reference-based-detector.ts b/packages/payment-detection/src/reference-based-detector.ts index fe3084ab86..69c5f427b4 100644 --- a/packages/payment-detection/src/reference-based-detector.ts +++ b/packages/payment-detection/src/reference-based-detector.ts @@ -1,7 +1,6 @@ import { ExtensionTypes, PaymentTypes, RequestLogicTypes, TypesUtils } from '@requestnetwork/types'; import { ICurrencyManager } from '@requestnetwork/currency'; import Utils from '@requestnetwork/utils'; -import { BalanceError } from './balance-error'; import PaymentReferenceCalculator from './payment-reference-calculator'; import { DeclarativePaymentDetectorBase } from './declarative'; @@ -16,16 +15,15 @@ export abstract class ReferenceBasedDetector< TExtension, TPaymentEventParameters | PaymentTypes.IDeclarativePaymentEventParameters > { - protected readonly currencyManager: ICurrencyManager; /** * @param paymentNetworkId Example : PaymentTypes.PAYMENT_NETWORK_ID.ETH_INPUT_DATA * @param extension The advanced logic payment network extension, reference based * @param currencyManager The currency manager */ - public constructor( + protected constructor( paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID, extension: TExtension, - currencyManager: ICurrencyManager, + protected readonly currencyManager: ICurrencyManager, ) { super(paymentNetworkId, extension); if (!TypesUtils.isPaymentNetworkId(paymentNetworkId)) { @@ -33,7 +31,6 @@ export abstract class ReferenceBasedDetector< `Cannot detect payment for extension type '${paymentNetworkId}', it is not a payment network ID.`, ); } - this.currencyManager = currencyManager; } /** @@ -95,15 +92,6 @@ export abstract class ReferenceBasedDetector< const paymentExtension = this.getPaymentExtension(request); const paymentChain = this.getPaymentChain(request); - const supportedNetworks = this.extension.supportedNetworks; - if (!supportedNetworks.includes(paymentChain)) { - throw new BalanceError( - `Payment network ${paymentChain} not supported by ${ - this.paymentNetworkId - } payment detection. Supported networks: ${supportedNetworks.join(', ')}`, - PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, - ); - } this.checkRequiredParameter(paymentExtension.values.salt, 'salt'); this.checkRequiredParameter(paymentExtension.values.paymentAddress, 'paymentAddress'); diff --git a/packages/payment-detection/src/types.ts b/packages/payment-detection/src/types.ts index b94c9e997f..fe9490a679 100644 --- a/packages/payment-detection/src/types.ts +++ b/packages/payment-detection/src/types.ts @@ -1,8 +1,14 @@ -import type { AdvancedLogicTypes, PaymentTypes } from '@requestnetwork/types'; +import { AdvancedLogicTypes, ExtensionTypes, PaymentTypes } from '@requestnetwork/types'; +import { PaymentDetectorBase } from './payment-detector-base'; +import { GetDeploymentInformation } from './utils'; import type { ICurrencyManager } from '@requestnetwork/currency'; import type { providers } from 'ethers'; import type { TheGraphClient } from './thegraph'; +export interface ContractBasedDetector { + getDeploymentInformation: GetDeploymentInformation; +} + /** Generic info retriever interface */ export interface IPaymentRetriever< TPaymentNetworkEvent extends PaymentTypes.IPaymentNetworkEvent, @@ -27,9 +33,12 @@ export interface IEventRetriever< } /** Object interface to list the payment network module by id */ -export interface IPaymentNetworkModuleByType { - [type: string]: any; -} +export type IPaymentNetworkModuleByType = Partial< + Record< + PaymentTypes.PAYMENT_NETWORK_ID, + new (...pnParams: any) => PaymentDetectorBase + > +>; /** Object interface to list the payment network module by network */ export interface ISupportedPaymentNetworkByNetwork { @@ -44,7 +53,7 @@ export interface ISupportedPaymentNetworkByCurrency { export type PaymentNetworkOptions = { /** override default bitcoin detection provider */ bitcoinDetectionProvider?: PaymentTypes.IBitcoinDetectionProvider; - /** the explorer API (eg Etherscan) api keys, for PNs that rely on it. Record by network name */ + /** the explorer API (e.g. Etherscan) api keys, for PNs that rely on it. Record by network name */ explorerApiKeys: Record; /** override the default Subgraph for payment detection (EVM, Near) */ getSubgraphClient: (network: string) => TheGraphClient | undefined; @@ -56,3 +65,7 @@ export type ReferenceBasedDetectorOptions = { advancedLogic: AdvancedLogicTypes.IAdvancedLogic; currencyManager: ICurrencyManager; }; + +export type NativeDetectorOptions = ReferenceBasedDetectorOptions & { + network: string; +}; diff --git a/packages/payment-detection/src/utils.ts b/packages/payment-detection/src/utils.ts index 0053c769bb..ba2cdc3944 100644 --- a/packages/payment-detection/src/utils.ts +++ b/packages/payment-detection/src/utils.ts @@ -1,7 +1,7 @@ import { CurrencyDefinition } from '@requestnetwork/currency'; -import { RequestLogicTypes, PaymentTypes, ExtensionTypes } from '@requestnetwork/types'; +import { ExtensionTypes, PaymentTypes, RequestLogicTypes } from '@requestnetwork/types'; import { BigNumber, BigNumberish, Contract, errors, logger } from 'ethers'; -import { keccak256, LogDescription, getAddress } from 'ethers/lib/utils'; +import { getAddress, keccak256, LogDescription } from 'ethers/lib/utils'; import { ContractArtifact, DeploymentInformation } from '@requestnetwork/smart-contracts'; import { NetworkNotSupported, VersionNotSupported } from './balance-error'; import PaymentReferenceCalculator from './payment-reference-calculator'; @@ -131,12 +131,12 @@ export const calculateEscrowState = ( /** * Return the payment network extension of a Request. */ -export function getPaymentNetworkExtension( +export function getPaymentNetworkExtension( request: Pick, -): ExtensionTypes.IState | undefined { +): ExtensionTypes.IPaymentNetworkState | undefined { return Object.values(request.extensions).find( (x) => x.type === ExtensionTypes.TYPE.PAYMENT_NETWORK, - ); + ) as ExtensionTypes.IPaymentNetworkState; } type PaymentParameters = PaymentTypes.IReferenceBasedCreationParameters & @@ -158,7 +158,7 @@ export function getPaymentReference( request: Pick, event: PaymentTypes.EVENTS_NAMES = PaymentTypes.EVENTS_NAMES.PAYMENT, ): string | undefined { - const extension = getPaymentNetworkExtension(request) as ExtensionTypes.IState; + const extension = getPaymentNetworkExtension(request); if (!extension) { throw new Error('no payment network found'); } diff --git a/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts b/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts index 547ea26493..a58429bb23 100644 --- a/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts +++ b/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts @@ -11,6 +11,7 @@ import { ERC20__factory } from '@requestnetwork/smart-contracts/types'; import { AnyToERC20PaymentDetector } from '../../src/any/any-to-erc20-proxy'; import { getTheGraphClient } from '../../src/thegraph'; import { mocked } from 'ts-jest/utils'; +import { mockAdvancedLogicBase } from '../utils'; jest.mock('../../src/thegraph/client'); const theGraphClientMock = mocked(getTheGraphClient('')); @@ -26,12 +27,9 @@ const createAddPaymentInstructionAction = jest.fn(); const createAddRefundInstructionAction = jest.fn(); const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { anyToErc20Proxy: { - supportedNetworks: ['mainnet', 'rinkeby', 'goerli', 'private'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -40,7 +38,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { createAddPaymentInstructionAction, createAddRefundInstructionAction, }, - }, + } as any as AdvancedLogicTypes.IAdvancedLogicExtensions, }; /* eslint-disable @typescript-eslint/no-unused-expressions */ diff --git a/packages/payment-detection/test/btc/mainnet-address-based.test.ts b/packages/payment-detection/test/btc/mainnet-address-based.test.ts index 8590338277..6bf74c32d2 100644 --- a/packages/payment-detection/test/btc/mainnet-address-based.test.ts +++ b/packages/payment-detection/test/btc/mainnet-address-based.test.ts @@ -1,13 +1,12 @@ import { AdvancedLogicTypes, PaymentTypes, RequestLogicTypes } from '@requestnetwork/types'; import { BtcMainnetAddressBasedDetector } from '../../src/btc/mainnet-address-based'; +import { mockAdvancedLogicBase } from '../utils'; let btcAddressedBased: BtcMainnetAddressBasedDetector; const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { addressBasedBtc: { createAddPaymentAddressAction(): any { @@ -20,7 +19,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { return; }, }, - }, + } as any as AdvancedLogicTypes.IAdvancedLogicExtensions, }; // Most of the tests are done as integration tests in ../index.test.ts diff --git a/packages/payment-detection/test/btc/testnet-address-based.test.ts b/packages/payment-detection/test/btc/testnet-address-based.test.ts index 98cfde1ddd..7df19781ca 100644 --- a/packages/payment-detection/test/btc/testnet-address-based.test.ts +++ b/packages/payment-detection/test/btc/testnet-address-based.test.ts @@ -1,13 +1,12 @@ import { AdvancedLogicTypes, PaymentTypes, RequestLogicTypes } from '@requestnetwork/types'; import { BtcTestnetAddressBasedDetector } from '../../src/btc/testnet-address-based'; +import { mockAdvancedLogicBase } from '../utils'; let btcAddressedBased: BtcTestnetAddressBasedDetector; const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { addressBasedTestnetBtc: { createAddPaymentAddressAction(): any { @@ -20,7 +19,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { return; }, }, - }, + } as any as AdvancedLogicTypes.IAdvancedLogicExtensions, }; // Most of the tests are done as integration tests in ../index.test.ts diff --git a/packages/payment-detection/test/declarative.test.ts b/packages/payment-detection/test/declarative.test.ts index e42ff573f7..ba8ea15c27 100644 --- a/packages/payment-detection/test/declarative.test.ts +++ b/packages/payment-detection/test/declarative.test.ts @@ -7,13 +7,12 @@ import { } from '@requestnetwork/types'; import { DeclarativePaymentDetector } from '../src/declarative'; +import { mockAdvancedLogicBase } from './utils'; let declarative: DeclarativePaymentDetector; const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { declarative: { createAddPaymentInstructionAction(): any { @@ -38,7 +37,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { return; }, }, - }, + } as any as AdvancedLogicTypes.IAdvancedLogicExtensions, }; const requestMock: RequestLogicTypes.IRequest = { diff --git a/packages/payment-detection/test/erc20/address-based.test.ts b/packages/payment-detection/test/erc20/address-based.test.ts index 93fa533021..bc9f90f3d1 100644 --- a/packages/payment-detection/test/erc20/address-based.test.ts +++ b/packages/payment-detection/test/erc20/address-based.test.ts @@ -4,29 +4,24 @@ import { PaymentTypes, RequestLogicTypes, } from '@requestnetwork/types'; -import { ERC20AddressBasedPaymentDetector } from '../../src/erc20/address-based'; +import { ERC20AddressBasedPaymentDetector } from '../../src/erc20'; +import { mockAdvancedLogicBase } from '../utils'; +import { AdvancedLogic } from '@requestnetwork/advanced-logic'; +import { CurrencyManager } from '@requestnetwork/currency'; jest.setTimeout(10000); let erc20AddressedBased: ERC20AddressBasedPaymentDetector; const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { addressBasedErc20: { - createAddPaymentAddressAction(): any { - return; - }, - createAddRefundAddressAction(): any { - return; - }, - createCreationAction(): any { - return; - }, - }, - }, + createAddPaymentAddressAction: jest.fn(), + createAddRefundAddressAction: jest.fn(), + createCreationAction: jest.fn(), + } as any, + } as AdvancedLogicTypes.IAdvancedLogicExtensions, }; // Most of the tests are done as integration tests in ../index.test.ts @@ -117,18 +112,13 @@ describe('api/erc20/address-based', () => { }); it('should not throw when getBalance fail', async () => { - expect( - await erc20AddressedBased.getBalance({ + erc20AddressedBased = new ERC20AddressBasedPaymentDetector({ + advancedLogic: new AdvancedLogic(CurrencyManager.getDefault()), + }); + await expect( + erc20AddressedBased.getBalance({ currency: { network: 'wrong' }, } as RequestLogicTypes.IRequest), - ).toMatchObject({ - balance: null, - error: { - code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, - message: - 'Payment network wrong not supported by ERC20 payment detection. Supported networks: mainnet, rinkeby, goerli, private', - }, - events: [], - }); + ).resolves.not.toThrowError(); }); }); diff --git a/packages/payment-detection/test/erc20/escrow-proxy-contract.test.ts b/packages/payment-detection/test/erc20/escrow-proxy-contract.test.ts index 7c636734ff..83dcd97be5 100644 --- a/packages/payment-detection/test/erc20/escrow-proxy-contract.test.ts +++ b/packages/payment-detection/test/erc20/escrow-proxy-contract.test.ts @@ -7,6 +7,7 @@ import { } from '@requestnetwork/types'; import { CurrencyManager } from '@requestnetwork/currency'; import { Erc20PaymentNetwork } from '../../src'; +import { mockAdvancedLogicBase } from '../utils'; let erc20FeeProxyDetector: Erc20PaymentNetwork.ERC20FeeProxyPaymentDetector; @@ -18,12 +19,9 @@ const createAddPaymentInstructionAction = jest.fn(); const createAddRefundInstructionAction = jest.fn(); const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { feeProxyContractErc20: { - supportedNetworks: ['mainnet', 'private'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -32,7 +30,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { createAddPaymentInstructionAction, createAddRefundInstructionAction, }, - }, + } as any as AdvancedLogicTypes.IAdvancedLogicExtensions, }; const currencyManager = CurrencyManager.getDefault(); diff --git a/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts b/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts index 2c423a5261..d64423658e 100644 --- a/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts +++ b/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts @@ -7,6 +7,8 @@ import { } from '@requestnetwork/types'; import { CurrencyManager } from '@requestnetwork/currency'; import { ERC20FeeProxyPaymentDetector } from '../../src/erc20/fee-proxy-contract'; +import { mockAdvancedLogicBase } from '../utils'; + let erc20FeeProxyContract: ERC20FeeProxyPaymentDetector; const createAddPaymentAddressAction = jest.fn(); @@ -17,12 +19,9 @@ const createAddPaymentInstructionAction = jest.fn(); const createAddRefundInstructionAction = jest.fn(); const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { feeProxyContractErc20: { - supportedNetworks: ['mainnet', 'private', 'rinkeby', 'goerli'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -31,7 +30,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { createAddPaymentInstructionAction, createAddRefundInstructionAction, }, - }, + } as any as AdvancedLogicTypes.IAdvancedLogicExtensions, }; const currencyManager = CurrencyManager.getDefault(); diff --git a/packages/payment-detection/test/erc20/proxy-contract.test.ts b/packages/payment-detection/test/erc20/proxy-contract.test.ts index 9bac502765..20bea65ae6 100644 --- a/packages/payment-detection/test/erc20/proxy-contract.test.ts +++ b/packages/payment-detection/test/erc20/proxy-contract.test.ts @@ -6,8 +6,9 @@ import { RequestLogicTypes, } from '@requestnetwork/types'; import { CurrencyManager } from '@requestnetwork/currency'; -import { ERC20ProxyPaymentDetector } from '../../src/erc20/proxy-contract'; -import { getTheGraphClient } from '../../src/thegraph'; +import { ERC20ProxyPaymentDetector } from '../../src/erc20'; +import { getTheGraphClient } from '../../src'; +import { mockAdvancedLogicBase } from '../utils'; let erc20ProxyContract: ERC20ProxyPaymentDetector; @@ -20,12 +21,9 @@ const createAddRefundInstructionAction = jest.fn(); jest.mock('../../src/thegraph/client'); const theGraphClientMock = mocked(getTheGraphClient('')); const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { proxyContractErc20: { - supportedNetworks: ['mainnet', 'rinkeby', 'goerli'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -33,7 +31,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { createAddPaymentInstructionAction, createAddRefundInstructionAction, }, - }, + } as any as AdvancedLogicTypes.IAdvancedLogicExtensions, }; /* eslint-disable @typescript-eslint/no-unused-expressions */ @@ -163,8 +161,7 @@ describe('api/erc20/proxy-contract', () => { balance: null, error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, - message: - 'Payment network WRONG not supported by pn-erc20-proxy-contract payment detection. Supported networks: mainnet, rinkeby, goerli', + message: 'Network not supported for this payment network: WRONG', }, events: [], }); diff --git a/packages/payment-detection/test/erc777/superfluid-detector.test.ts b/packages/payment-detection/test/erc777/superfluid-detector.test.ts index af8ab7020a..8a1c4bf2ad 100644 --- a/packages/payment-detection/test/erc777/superfluid-detector.test.ts +++ b/packages/payment-detection/test/erc777/superfluid-detector.test.ts @@ -7,6 +7,7 @@ import { import { CurrencyManager } from '@requestnetwork/currency'; import { SuperFluidPaymentDetector } from '../../src/erc777/superfluid-detector'; import { genTransferEventsByMonth } from './mocks'; +import { mockAdvancedLogicBase } from '../utils'; let superfluidPaymentDetector: SuperFluidPaymentDetector; @@ -18,12 +19,9 @@ const createAddPaymentInstructionAction = jest.fn(); const createAddRefundInstructionAction = jest.fn(); const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { feeProxyContractErc20: { - supportedNetworks: ['mainnet', 'private'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -32,7 +30,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { createAddPaymentInstructionAction, createAddRefundInstructionAction, }, - }, + } as any as AdvancedLogicTypes.IAdvancedLogicExtensions, }; const baseRequestData = { creator: { type: IdentityTypes.TYPE.ETHEREUM_ADDRESS, value: '0x2' }, diff --git a/packages/payment-detection/test/eth/fee-proxy-detector.test.ts b/packages/payment-detection/test/eth/fee-proxy-detector.test.ts index 565ee4d626..dcde036c66 100644 --- a/packages/payment-detection/test/eth/fee-proxy-detector.test.ts +++ b/packages/payment-detection/test/eth/fee-proxy-detector.test.ts @@ -1,6 +1,7 @@ import { CurrencyManager } from '@requestnetwork/currency'; import { AdvancedLogicTypes, PaymentTypes, RequestLogicTypes } from '@requestnetwork/types'; import { EthFeeProxyPaymentDetector } from '../../src'; +import { mockAdvancedLogicBase } from '../utils'; let ethFeeProxyDetector: EthFeeProxyPaymentDetector; @@ -12,9 +13,7 @@ const createAddPaymentInstructionAction = jest.fn(); const createAddRefundInstructionAction = jest.fn(); const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { feeProxyContractEth: { createAddPaymentAddressAction, @@ -26,7 +25,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { createAddPaymentInstructionAction, createAddRefundInstructionAction, }, - }, + } as any as AdvancedLogicTypes.IAdvancedLogicExtensions, }; /* eslint-disable @typescript-eslint/no-unused-expressions */ diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index 160b8aa383..8c3fe60dca 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -8,6 +8,7 @@ import { } from '@requestnetwork/types'; import { getTheGraphClient } from '../../src/thegraph'; import { EthInputDataPaymentDetector } from '../../src/eth/input-data'; +import { mockAdvancedLogicBase } from '../utils'; jest.mock('../../src/thegraph/client'); const theGraphClientMock = mocked(getTheGraphClient('')); @@ -21,20 +22,17 @@ const createAddPaymentInstructionAction = jest.fn(); const createAddRefundInstructionAction = jest.fn(); const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + ...mockAdvancedLogicBase, extensions: { ethereumInputData: { createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, - supportedNetworks: ['mainnet', 'rinkeby', 'goerli'], // inherited from declarative createAddPaymentInstructionAction, createAddRefundInstructionAction, }, - }, + } as any as AdvancedLogicTypes.IAdvancedLogicExtensions, }; // Most of the tests are done as integration tests in ../index.test.ts @@ -169,9 +167,8 @@ describe('api/eth/input-data', () => { expect(await ethInputData.getBalance(mockRequest as RequestLogicTypes.IRequest)).toMatchObject({ balance: null, error: { - code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, - message: - /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, + code: PaymentTypes.BALANCE_ERROR_CODE.UNKNOWN, + message: /invalid network/, }, events: [], }); diff --git a/packages/payment-detection/test/near/near-native-conversion.test.ts b/packages/payment-detection/test/near/near-native-conversion.test.ts index 311df3a98d..85d113c83f 100644 --- a/packages/payment-detection/test/near/near-native-conversion.test.ts +++ b/packages/payment-detection/test/near/near-native-conversion.test.ts @@ -1,33 +1,20 @@ -import { - AdvancedLogicTypes, - ExtensionTypes, - PaymentTypes, - RequestLogicTypes, -} from '@requestnetwork/types'; +import { ExtensionTypes, PaymentTypes, RequestLogicTypes } from '@requestnetwork/types'; import { CurrencyDefinition, CurrencyManager } from '@requestnetwork/currency'; import { PaymentNetworkFactory } from '../../src/payment-network-factory'; import PaymentReferenceCalculator from '../../src/payment-reference-calculator'; import { - NearConversionNativeTokenPaymentDetector, NearConversionInfoRetriever, + NearConversionNativeTokenPaymentDetector, } from '../../src/near'; import { deepCopy } from 'ethers/lib/utils'; import { GraphQLClient } from 'graphql-request'; import { mocked } from 'ts-jest/utils'; +import { AdvancedLogic } from '@requestnetwork/advanced-logic'; jest.mock('graphql-request'); const graphql = mocked(GraphQLClient.prototype); -const mockNearPaymentNetwork = { - supportedNetworks: ['aurora', 'aurora-testnet', 'near-testnet'], -}; const currencyManager = CurrencyManager.getDefault(); - -const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, - extensions: { anyToNativeToken: [mockNearPaymentNetwork] }, -}; +const advancedLogic = new AdvancedLogic(currencyManager); const salt = 'a6475e4c3d45feb6'; const paymentAddress = 'issuer.near'; const feeAddress = 'fee.near'; @@ -75,7 +62,7 @@ const graphPaymentEvent = { gasPrice: '2425000017', }; -const paymentNetworkFactory = new PaymentNetworkFactory(mockAdvancedLogic, currencyManager); +const paymentNetworkFactory = new PaymentNetworkFactory(advancedLogic, currencyManager); describe('Near payments detection', () => { beforeAll(() => { graphql.request.mockResolvedValue({ @@ -122,9 +109,12 @@ describe('Near payments detection', () => { }); it('PaymentNetworkFactory can get the detector (testnet)', async () => { - expect(paymentNetworkFactory.getPaymentNetworkFromRequest(request)).toBeInstanceOf( - NearConversionNativeTokenPaymentDetector, - ); + expect( + paymentNetworkFactory.getPaymentNetworkFromRequest({ + ...request, + currency: { ...request.currency, network: 'aurora-testnet' }, + }), + ).toBeInstanceOf(NearConversionNativeTokenPaymentDetector); }); it('PaymentNetworkFactory can get the detector (mainnet)', async () => { @@ -138,7 +128,8 @@ describe('Near payments detection', () => { it('NearConversionNativeTokenPaymentDetector can detect a payment on Near', async () => { const paymentDetector = new NearConversionNativeTokenPaymentDetector({ - advancedLogic: mockAdvancedLogic, + network: 'aurora', + advancedLogic: advancedLogic, currencyManager, }); const balance = await paymentDetector.getBalance(request); @@ -162,7 +153,8 @@ describe('Near payments detection', () => { }, }; const paymentDetector = new NearConversionNativeTokenPaymentDetector({ - advancedLogic: mockAdvancedLogic, + network: 'aurora', + advancedLogic: advancedLogic, currencyManager, }); expect(await paymentDetector.getBalance(requestWithWrongVersion)).toMatchObject({ @@ -191,7 +183,8 @@ describe('Near payments detection', () => { }, }; const paymentDetector = new NearConversionNativeTokenPaymentDetector({ - advancedLogic: mockAdvancedLogic, + network: 'aurora', + advancedLogic: advancedLogic, currencyManager, }); expect(await paymentDetector.getBalance(requestWithWrongNetwork)).toMatchObject({ @@ -199,7 +192,7 @@ describe('Near payments detection', () => { error: { code: 2, message: - 'Payment network unknown-network not supported by pn-any-to-native-token payment detection. Supported networks: aurora, aurora-testnet, near-testnet', + "Unconfigured near-conversion-detector chain 'unknown-network' and version '0.1.0'", }, events: [], }); diff --git a/packages/payment-detection/test/near/near-native.test.ts b/packages/payment-detection/test/near/near-native.test.ts index 3694bc9297..d99b4035f9 100644 --- a/packages/payment-detection/test/near/near-native.test.ts +++ b/packages/payment-detection/test/near/near-native.test.ts @@ -1,26 +1,13 @@ -import { - AdvancedLogicTypes, - ExtensionTypes, - PaymentTypes, - RequestLogicTypes, -} from '@requestnetwork/types'; +import { ExtensionTypes, PaymentTypes, RequestLogicTypes } from '@requestnetwork/types'; import { CurrencyManager } from '@requestnetwork/currency'; -import { PaymentNetworkFactory } from '../../src/payment-network-factory'; +import { PaymentNetworkFactory } from '../../src'; import PaymentReferenceCalculator from '../../src/payment-reference-calculator'; -import { NearNativeTokenPaymentDetector, NearInfoRetriever } from '../../src/near'; +import { NearInfoRetriever, NearNativeTokenPaymentDetector } from '../../src/near'; import { deepCopy } from 'ethers/lib/utils'; +import { AdvancedLogic } from '@requestnetwork/advanced-logic'; -const mockNearPaymentNetwork = { - supportedNetworks: ['aurora', 'aurora-testnet', 'near-testnet'], -}; const currencyManager = CurrencyManager.getDefault(); - -const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, - extensions: { nativeToken: [mockNearPaymentNetwork] }, -}; +const advancedLogic = new AdvancedLogic(currencyManager); const salt = 'a6475e4c3d45feb6'; const paymentAddress = 'gus.near'; const request: any = { @@ -43,7 +30,7 @@ const request: any = { }, }; -const paymentNetworkFactory = new PaymentNetworkFactory(mockAdvancedLogic, currencyManager); +const paymentNetworkFactory = new PaymentNetworkFactory(advancedLogic, currencyManager); describe('Near payments detection', () => { it('NearInfoRetriever can retrieve a NEAR payment', async () => { @@ -87,7 +74,8 @@ describe('Near payments detection', () => { it('NearNativeTokenPaymentDetector can detect a payment on Near', async () => { const paymentDetector = new NearNativeTokenPaymentDetector({ - advancedLogic: mockAdvancedLogic, + network: 'aurora', + advancedLogic: advancedLogic, currencyManager: CurrencyManager.getDefault(), }); const balance = await paymentDetector.getBalance(request); @@ -109,7 +97,8 @@ describe('Near payments detection', () => { }, }; const paymentDetector = new NearNativeTokenPaymentDetector({ - advancedLogic: mockAdvancedLogic, + network: 'aurora', + advancedLogic: advancedLogic, currencyManager: CurrencyManager.getDefault(), }); expect(await paymentDetector.getBalance(requestWithWrongVersion)).toMatchObject({ @@ -126,15 +115,15 @@ describe('Near payments detection', () => { currency: { ...requestWithWrongNetwork.currency, network: 'unknown-network' }, }; const paymentDetector = new NearNativeTokenPaymentDetector({ - advancedLogic: mockAdvancedLogic, + network: 'aurora', + advancedLogic: advancedLogic, currencyManager: CurrencyManager.getDefault(), }); expect(await paymentDetector.getBalance(requestWithWrongNetwork)).toMatchObject({ balance: null, error: { code: 2, - message: - 'Payment network unknown-network not supported by pn-native-token payment detection. Supported networks: aurora, aurora-testnet, near-testnet', + message: "Unconfigured near-detector chain 'unknown-network' and version '0.2.0'", }, events: [], }); diff --git a/packages/payment-detection/test/payment-network-factory.test.ts b/packages/payment-detection/test/payment-network-factory.test.ts index 900c5f9e1f..997d1cfe80 100644 --- a/packages/payment-detection/test/payment-network-factory.test.ts +++ b/packages/payment-detection/test/payment-network-factory.test.ts @@ -5,17 +5,17 @@ import { RequestLogicTypes, } from '@requestnetwork/types'; import { CurrencyManager } from '@requestnetwork/currency'; -import { BtcMainnetAddressBasedDetector } from '../src/btc/mainnet-address-based'; -import { DeclarativePaymentDetector } from '../src/declarative'; -import { EthInputDataPaymentDetector } from '../src/eth/input-data'; - -import { PaymentNetworkFactory } from '../src/payment-network-factory'; +import { BtcMainnetAddressBasedDetector } from '../src/btc'; +import { + DeclarativePaymentDetector, + EthInputDataPaymentDetector, + PaymentNetworkFactory, +} from '../src'; +import { mockAdvancedLogicBase } from './utils'; const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, - extensions: {}, + ...mockAdvancedLogicBase, + extensions: {} as AdvancedLogicTypes.IAdvancedLogicExtensions, }; const currencyManager = CurrencyManager.getDefault(); diff --git a/packages/payment-detection/test/utils.ts b/packages/payment-detection/test/utils.ts new file mode 100644 index 0000000000..f9b18c1c7f --- /dev/null +++ b/packages/payment-detection/test/utils.ts @@ -0,0 +1,8 @@ +import { AdvancedLogicTypes } from '@requestnetwork/types'; + +export const mockAdvancedLogicBase: AdvancedLogicTypes.IAdvancedLogic = { + applyActionToExtensions: jest.fn(), + getNativeTokenExtensionForNetwork: jest.fn(), + getAnyToNativeTokenExtensionForNetwork: jest.fn(), + extensions: {} as AdvancedLogicTypes.IAdvancedLogicExtensions, +}; diff --git a/packages/payment-processor/src/payment/btc-address-based.ts b/packages/payment-processor/src/payment/btc-address-based.ts index 9e7c0b2479..260a7cd0b1 100644 --- a/packages/payment-processor/src/payment/btc-address-based.ts +++ b/packages/payment-processor/src/payment/btc-address-based.ts @@ -7,7 +7,6 @@ import { getAmountToPay } from './utils'; /** * Returns the BIP21 payment URL based on the Request's value - * @param request * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. */ export function getBtcPaymentUrl(request: ClientTypes.IRequestData, amount?: BigNumberish): string { diff --git a/packages/payment-processor/src/payment/erc20-fee-proxy.ts b/packages/payment-processor/src/payment/erc20-fee-proxy.ts index 2df1952a75..8e99c98d05 100644 --- a/packages/payment-processor/src/payment/erc20-fee-proxy.ts +++ b/packages/payment-processor/src/payment/erc20-fee-proxy.ts @@ -18,7 +18,6 @@ import { IPreparedTransaction } from './prepared-transaction'; /** * Processes a transaction to pay an ERC20 Request with fees. - * @param request * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount. @@ -71,7 +70,6 @@ export function encodePayErc20FeeRequest( * Return the EIP-681 format URL with the transaction to pay an ERC20 * Warning: this EIP isn't widely used, be sure to test compatibility yourself. * - * @param request * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. * @param feeAmountOverride optionally, the fee amount to pay. Defaults to the fee amount of the request. */ diff --git a/packages/payment-processor/src/payment/erc20-proxy.ts b/packages/payment-processor/src/payment/erc20-proxy.ts index f46f68ad45..19e062c901 100644 --- a/packages/payment-processor/src/payment/erc20-proxy.ts +++ b/packages/payment-processor/src/payment/erc20-proxy.ts @@ -17,7 +17,6 @@ import { IPreparedTransaction } from './prepared-transaction'; /** * Processes a transaction to pay an ERC20 Request. - * @param request * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. * @param overrides optionally, override default transaction values, like gas. @@ -62,7 +61,6 @@ export function encodePayErc20Request( * Return the EIP-681 format URL with the transaction to pay an ERC20 * Warning: this EIP isn't widely used, be sure to test compatibility yourself. * - * @param request * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. */ export function _getErc20ProxyPaymentUrl( diff --git a/packages/payment-processor/src/payment/erc20.ts b/packages/payment-processor/src/payment/erc20.ts index 87db47b13e..7385cf8500 100644 --- a/packages/payment-processor/src/payment/erc20.ts +++ b/packages/payment-processor/src/payment/erc20.ts @@ -21,7 +21,6 @@ import { IPreparedTransaction } from './prepared-transaction'; /** * Processes a transaction to pay an ERC20 Request. - * @param request * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. * @param feeAmount optionally, the fee amount to pay. Only applicable to ERC20 Fee Payment network. Defaults to the fee amount. @@ -83,7 +82,6 @@ export async function hasErc20Approval( * @param spenderAddress address of the spender * @param provider the web3 provider. Defaults to Etherscan. * @param paymentCurrency ERC20 currency - * @param amount */ export async function checkErc20Allowance( ownerAddress: string, @@ -235,7 +233,6 @@ export async function getAnyErc20Balance( * Return the EIP-681 format URL with the transaction to pay an ERC20 * Warning: this EIP isn't widely used, be sure to test compatibility yourself. * - * @param request * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. */ export function _getErc20PaymentUrl( @@ -254,7 +251,6 @@ export function _getErc20PaymentUrl( /** * Get the request payment network proxy address - * @param request * @returns the payment network proxy address */ function getProxyAddress(request: ClientTypes.IRequestData): string { diff --git a/packages/payment-processor/src/payment/eth-fee-proxy.ts b/packages/payment-processor/src/payment/eth-fee-proxy.ts index 96d2b7f4e4..5e9d9034cc 100644 --- a/packages/payment-processor/src/payment/eth-fee-proxy.ts +++ b/packages/payment-processor/src/payment/eth-fee-proxy.ts @@ -17,7 +17,6 @@ import { IPreparedTransaction } from './prepared-transaction'; /** * Processes a transaction to pay an ETH Request with fees. - * @param request * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount. diff --git a/packages/payment-processor/src/payment/eth-proxy.ts b/packages/payment-processor/src/payment/eth-proxy.ts index e60c7aa8ae..ce6a25716b 100644 --- a/packages/payment-processor/src/payment/eth-proxy.ts +++ b/packages/payment-processor/src/payment/eth-proxy.ts @@ -15,7 +15,6 @@ import { IPreparedTransaction } from './prepared-transaction'; /** * Processes a transaction to pay an ETH Request with the proxy contract. - * @param request * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. * @param overrides optionally, override default transaction values, like gas. diff --git a/packages/payment-processor/src/payment/index.ts b/packages/payment-processor/src/payment/index.ts index 19b2ff0dc8..7957c3809c 100644 --- a/packages/payment-processor/src/payment/index.ts +++ b/packages/payment-processor/src/payment/index.ts @@ -220,8 +220,6 @@ export async function hasSufficientFunds( * Supported chains: EVMs and Near. * * @param fromAddress the address willing to pay - * @param amount - * @param currency * @param providerOptions.provider the Web3 provider. Defaults to getDefaultProvider. * @param providerOptions.nearWalletConnection the Near WalletConnection * @throws UnsupportedNetworkError if network isn't supported diff --git a/packages/payment-processor/src/payment/swap-any-to-erc20.ts b/packages/payment-processor/src/payment/swap-any-to-erc20.ts index aca8f6c4ae..bf4210b12c 100644 --- a/packages/payment-processor/src/payment/swap-any-to-erc20.ts +++ b/packages/payment-processor/src/payment/swap-any-to-erc20.ts @@ -21,7 +21,6 @@ export { ISwapSettings } from './swap-erc20-fee-proxy'; /** * Processes a transaction to swap tokens and pay an ERC20 Request through a proxy with fees. - * @param request * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param options to override amount, feeAmount and transaction parameters */ @@ -38,7 +37,6 @@ export async function swapToPayAnyToErc20Request( /** * Processes a transaction to swap tokens and pay an ERC20 Request through a proxy with fees. - * @param request * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param options to override amount, feeAmount and transaction parameters */ diff --git a/packages/payment-processor/src/payment/swap-erc20-fee-proxy.ts b/packages/payment-processor/src/payment/swap-erc20-fee-proxy.ts index 0c42ef521f..d03697fdc3 100644 --- a/packages/payment-processor/src/payment/swap-erc20-fee-proxy.ts +++ b/packages/payment-processor/src/payment/swap-erc20-fee-proxy.ts @@ -48,7 +48,6 @@ export interface IRequestPaymentOptions { /** * Processes a transaction to swap tokens and pay an ERC20 Request through a proxy with fees. - * @param request * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param swapSettings settings for the swap: swap path, max amount to swap, deadline * @param options to override amount, feeAmount and transaction parameters @@ -72,7 +71,6 @@ export async function swapErc20FeeProxyRequest( /** * Prepare a transaction to swap tokens and pay an ERC20 Request through a proxy with fees. - * @param request * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param swapSettings settings for the swap: swap path, max amount to swap, deadline * @param options to override amount, feeAmount and transaction parameters diff --git a/packages/payment-processor/src/payment/utils.ts b/packages/payment-processor/src/payment/utils.ts index 7e315803d7..e50e8951d6 100644 --- a/packages/payment-processor/src/payment/utils.ts +++ b/packages/payment-processor/src/payment/utils.ts @@ -36,8 +36,6 @@ export function getProvider(): providers.Web3Provider { /** * Utility to get a network provider, depending on the request's currency network. * Will throw an error if the network isn't mainnet, rinkeby, or goerli - * - * @param request */ export function getNetworkProvider(request: ClientTypes.IRequestData): providers.Provider { return getDefaultProvider(request.currencyInfo.network); @@ -71,7 +69,6 @@ export function getSigner( * Utility to access the payment address, reference, * and optional feeAmount, feeAddress, expectedFlowRate, expectedStartDate * of a Request. - * @param request */ export function getRequestPaymentValues(request: ClientTypes.IRequestData): { paymentAddress: string; @@ -191,8 +188,6 @@ const currenciesMap: any = { /** * Utility to validate a request currency and payment details against a paymentNetwork. - * @param request - * @param paymentNetworkId */ export function validateRequest( request: ClientTypes.IRequestData, diff --git a/packages/request-client.js/src/api/request-network.ts b/packages/request-client.js/src/api/request-network.ts index 703fc2f1ee..d1a38020ad 100644 --- a/packages/request-client.js/src/api/request-network.ts +++ b/packages/request-client.js/src/api/request-network.ts @@ -44,7 +44,6 @@ export default class RequestNetwork { * @param signatureProvider module in charge of the signatures * @param decryptionProvider module in charge of the decryption * @param paymentOptions options for payment detection - * @param currencyManager */ public constructor({ dataAccess, @@ -208,7 +207,6 @@ export default class RequestNetwork { /** * Create an array of request instances from an identity * - * @param identity * @param updatedBetween filter the requests with time boundaries * @param options options * @returns the Requests @@ -227,7 +225,6 @@ export default class RequestNetwork { /** * Create an array of request instances from multiple identities * - * @param identities * @param updatedBetween filter the requests with time boundaries * @param disablePaymentDetection if true, skip the payment detection * @returns the requests @@ -251,7 +248,6 @@ export default class RequestNetwork { /** * Create an array of request instances from a topic * - * @param topic * @param updatedBetween filter the requests with time boundaries * @param options options * @returns the Requests @@ -304,7 +300,6 @@ export default class RequestNetwork { /** * Create an array of request instances from a multiple topics * - * @param topics * @param updatedBetween filter the requests with time boundaries * @param options options * @returns the Requests diff --git a/packages/request-client.js/test/api/content-data-manager.test.ts b/packages/request-client.js/test/api/content-data-manager.test.ts index 0e4787d8c1..2fd94bc5bc 100644 --- a/packages/request-client.js/test/api/content-data-manager.test.ts +++ b/packages/request-client.js/test/api/content-data-manager.test.ts @@ -3,18 +3,15 @@ import { AdvancedLogicTypes } from '@requestnetwork/types'; import ContentDataExtension from '../../src/api/content-data-extension'; import * as TestData from './data-for-content-data-extension'; +import { IAdvancedLogicExtensions } from '@requestnetwork/types/src/advanced-logic-types'; const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { - applyActionToExtensions(): any { - return; - }, + applyActionToExtensions: jest.fn(), + getNativeTokenExtensionForNetwork: jest.fn(), + getAnyToNativeTokenExtensionForNetwork: jest.fn(), extensions: { - contentData: { - createCreationAction(): any { - return; - }, - }, - }, + contentData: { createCreationAction: jest.fn() }, + } as any as IAdvancedLogicExtensions, }; let contentDataExtension: ContentDataExtension; diff --git a/packages/request-client.js/test/api/request.test.ts b/packages/request-client.js/test/api/request.test.ts index 6aebec4fac..1e12e6226a 100644 --- a/packages/request-client.js/test/api/request.test.ts +++ b/packages/request-client.js/test/api/request.test.ts @@ -1,5 +1,10 @@ import { CurrencyManager } from '@requestnetwork/currency'; -import { IdentityTypes, PaymentTypes, RequestLogicTypes } from '@requestnetwork/types'; +import { + ExtensionTypes, + IdentityTypes, + PaymentTypes, + RequestLogicTypes, +} from '@requestnetwork/types'; import { EventEmitter } from 'events'; @@ -52,6 +57,8 @@ const mockRequestLogic: RequestLogicTypes.IRequestLogic = { }; const mockPaymentNetwork: PaymentTypes.IPaymentNetwork = { + extension: + {} as ExtensionTypes.PnAnyDeclarative.IAnyDeclarative, paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID.DECLARATIVE, async createExtensionsDataForCreation(): Promise { @@ -69,6 +76,8 @@ const mockPaymentNetwork: PaymentTypes.IPaymentNetwork = { }; const mockDeclarativePaymentNetwork: PaymentTypes.IPaymentNetwork = { + extension: + {} as ExtensionTypes.PnAnyDeclarative.IAnyDeclarative, paymentNetworkId: PaymentTypes.PAYMENT_NETWORK_ID.DECLARATIVE, async createExtensionsDataForCreation(): Promise { return; diff --git a/packages/request-logic/src/request-logic.ts b/packages/request-logic/src/request-logic.ts index ff4d1683ae..6ad87a8312 100644 --- a/packages/request-logic/src/request-logic.ts +++ b/packages/request-logic/src/request-logic.ts @@ -450,7 +450,6 @@ export default class RequestLogic implements RequestLogicTypes.IRequestLogic { /** * Gets the requests indexed by a topic from the transactions of transaction-manager layer * - * @param topic * @returns all the requests indexed by topic */ public async getRequestsByTopic( @@ -470,7 +469,6 @@ export default class RequestLogic implements RequestLogicTypes.IRequestLogic { /** * Gets the requests indexed by multiple topics from the transactions of transaction-manager layer * - * @param topics * @returns all the requests indexed by topics */ public async getRequestsByMultipleTopics( diff --git a/packages/request-logic/test/index.test.ts b/packages/request-logic/test/index.test.ts index 78930adfd0..e8650a8dff 100644 --- a/packages/request-logic/test/index.test.ts +++ b/packages/request-logic/test/index.test.ts @@ -37,6 +37,13 @@ const fakeMetaTransactionManager = { }; let fakeTransactionManager: TransactionTypes.ITransactionManager; +const fakeAdvancedLogicBase: AdvancedLogicTypes.IAdvancedLogic = { + getAnyToNativeTokenExtensionForNetwork: jest.fn(), + getNativeTokenExtensionForNetwork: jest.fn(), + applyActionToExtensions: jest.fn(), + extensions: {} as AdvancedLogicTypes.IAdvancedLogicExtensions, +}; + /* eslint-disable @typescript-eslint/no-unused-expressions */ describe('index', () => { beforeEach(() => { @@ -79,10 +86,12 @@ describe('index', () => { it('cannot createRequest if apply fails in the advanced request logic', async () => { const fakeAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { + getAnyToNativeTokenExtensionForNetwork: jest.fn(), + getNativeTokenExtensionForNetwork: jest.fn(), applyActionToExtensions: (): RequestLogicTypes.IExtensionStates => { throw new Error('Expected throw'); }, - extensions: {}, + extensions: {} as AdvancedLogicTypes.IAdvancedLogicExtensions, }; const requestLogic = new RequestLogic( @@ -226,10 +235,10 @@ describe('index', () => { it('cannot create an encrypted request if apply fails in the advanced request logic', async () => { const fakeAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { + ...fakeAdvancedLogicBase, applyActionToExtensions: (): RequestLogicTypes.IExtensionStates => { throw new Error('Expected throw'); }, - extensions: {}, }; const requestLogic = new RequestLogic( @@ -396,10 +405,10 @@ describe('index', () => { it('cannot compute request id if apply fails in the advanced request logic', async () => { const fakeAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { + ...fakeAdvancedLogicBase, applyActionToExtensions: (): RequestLogicTypes.IExtensionStates => { throw new Error('Expected throw'); }, - extensions: {}, }; const requestLogic = new RequestLogic( @@ -893,10 +902,10 @@ describe('index', () => { }); it('cannot addExtension if apply fail in the advanced request logic', async () => { const fakeAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { + ...fakeAdvancedLogicBase, applyActionToExtensions: (): RequestLogicTypes.IExtensionStates => { throw new Error('Expected throw'); }, - extensions: {}, }; const actionCreate = Utils.signature.sign( diff --git a/packages/request-logic/test/unit/requestLogicCore.test.ts b/packages/request-logic/test/unit/requestLogicCore.test.ts index b5a722c541..4c7b610215 100644 --- a/packages/request-logic/test/unit/requestLogicCore.test.ts +++ b/packages/request-logic/test/unit/requestLogicCore.test.ts @@ -16,10 +16,12 @@ import * as TestData from './utils/test-data-generator'; import RequestLogicCore from '../../src/requestLogicCore'; const fakeAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { + getAnyToNativeTokenExtensionForNetwork: jest.fn(), + getNativeTokenExtensionForNetwork: jest.fn(), applyActionToExtensions: ( extensionStates: RequestLogicTypes.IExtensionStates, ): RequestLogicTypes.IExtensionStates => extensionStates, - extensions: {}, + extensions: {} as AdvancedLogicTypes.IAdvancedLogicExtensions, }; /* eslint-disable @typescript-eslint/no-unused-expressions */ diff --git a/packages/types/src/advanced-logic-types.ts b/packages/types/src/advanced-logic-types.ts index d3985af510..a4ec04160d 100644 --- a/packages/types/src/advanced-logic-types.ts +++ b/packages/types/src/advanced-logic-types.ts @@ -2,6 +2,25 @@ import * as Extension from './extension-types'; import * as Identity from './identity-types'; import * as RequestLogic from './request-logic-types'; +/** Advanced Logic extensions */ +export interface IAdvancedLogicExtensions { + addressBasedBtc: Extension.PnAddressBased.IAddressBased; + addressBasedErc20: Extension.PnAddressBased.IAddressBased; + addressBasedTestnetBtc: Extension.PnAddressBased.IAddressBased; + contentData: Extension.ContentData.IContentData; + anyToErc20Proxy: Extension.PnAnyToErc20.IAnyToERC20; + declarative: Extension.PnAnyDeclarative.IAnyDeclarative; + ethereumInputData: Extension.PnReferenceBased.IReferenceBased; + nativeToken: Extension.PnReferenceBased.IReferenceBased[]; + feeProxyContractErc20: Extension.PnFeeReferenceBased.IFeeReferenceBased; + proxyContractErc20: Extension.PnReferenceBased.IReferenceBased; + // FIXME: should be Extension.PnReferenceBased.IReferenceBased + erc777Stream: any; + feeProxyContractEth: Extension.PnFeeReferenceBased.IFeeReferenceBased; + anyToEthProxy: Extension.PnFeeReferenceBased.IFeeReferenceBased; + anyToNativeToken: Extension.PnFeeReferenceBased.IFeeReferenceBased[]; +} + /** Advanced Logic layer */ export interface IAdvancedLogic { applyActionToExtensions: ( @@ -11,7 +30,13 @@ export interface IAdvancedLogic { actionSigner: Identity.IIdentity, timestamp: number, ) => RequestLogic.IExtensionStates; - extensions: any; + getNativeTokenExtensionForNetwork: ( + network: string, + ) => Extension.IExtension | undefined; + getAnyToNativeTokenExtensionForNetwork: ( + network: string, + ) => Extension.IExtension | undefined; + extensions: IAdvancedLogicExtensions; } /** Creation extension parameters */ diff --git a/packages/types/src/extension-types.ts b/packages/types/src/extension-types.ts index a233e88fd9..187bc38914 100644 --- a/packages/types/src/extension-types.ts +++ b/packages/types/src/extension-types.ts @@ -24,6 +24,9 @@ export { /** Extension interface is extended by the extensions implementation */ export interface IExtension { + extensionType: TYPE; + extensionId: ID; + currentVersion: string; applyActionToExtension: ( extensionsState: RequestLogic.IExtensionStates, extensionAction: IAction, @@ -50,6 +53,11 @@ export interface IState { values: T; } +/** Extensions state in advanced logic */ +export interface IPaymentNetworkState extends IState { + id: Exclude; +} + /** Creation action object */ export interface IAction { action: string; diff --git a/packages/types/src/extensions/pn-any-address-based-types.ts b/packages/types/src/extensions/pn-any-address-based-types.ts index 61c2d44009..3fc70ebd9b 100644 --- a/packages/types/src/extensions/pn-any-address-based-types.ts +++ b/packages/types/src/extensions/pn-any-address-based-types.ts @@ -6,7 +6,6 @@ export interface IAddressBased extends PnAnyDeclarative.IAnyDeclarative { createAddPaymentAddressAction: (creationParameters: IAddPaymentAddressParameters) => IAction; createAddRefundAddressAction: (creationParameters: IAddRefundAddressParameters) => IAction; - supportedNetworks: string[]; } /** Extension values of the extension */ diff --git a/packages/types/src/extensions/pn-any-declarative-types.ts b/packages/types/src/extensions/pn-any-declarative-types.ts index 145207e518..51b08922c8 100644 --- a/packages/types/src/extensions/pn-any-declarative-types.ts +++ b/packages/types/src/extensions/pn-any-declarative-types.ts @@ -15,7 +15,7 @@ export interface IAnyDeclarative createAddRefundInstructionAction: ( parameters: IAddRefundInstructionParameters, ) => Extension.IAction; - createCreationAction: (parameters?: TCreationParameters) => Extension.IAction; + createCreationAction: (parameters: TCreationParameters) => Extension.IAction; createAddDelegateAction: (parameters: IAddDelegateParameters) => Extension.IAction; } diff --git a/packages/types/src/extensions/pn-any-to-erc20-types.ts b/packages/types/src/extensions/pn-any-to-erc20-types.ts index 13f1b62a6c..40eea9a473 100644 --- a/packages/types/src/extensions/pn-any-to-erc20-types.ts +++ b/packages/types/src/extensions/pn-any-to-erc20-types.ts @@ -1,10 +1,7 @@ -import * as Extension from '../extension-types'; import * as PnAnyToAnyConversion from './pn-any-to-any-conversion-types'; /** Any to ERC20 reference-based payment network extension interface */ -export interface IAnyToERC20 extends PnAnyToAnyConversion.IConversionReferenceBased { - createCreationAction: (parameters?: ICreationParameters) => Extension.IAction; -} +export type IAnyToERC20 = PnAnyToAnyConversion.IConversionReferenceBased; /** Parameters for the creation action */ export interface ICreationParameters extends PnAnyToAnyConversion.ICreationParameters { diff --git a/packages/types/src/payment-types.ts b/packages/types/src/payment-types.ts index 9b3e708ab6..86087be8af 100644 --- a/packages/types/src/payment-types.ts +++ b/packages/types/src/payment-types.ts @@ -19,9 +19,11 @@ export enum PAYMENT_NETWORK_ID { ANY_TO_ERC20_PROXY = Extension.ID.PAYMENT_NETWORK_ANY_TO_ERC20_PROXY, ANY_TO_ETH_PROXY = Extension.ID.PAYMENT_NETWORK_ANY_TO_ETH_PROXY, } + /** Interface for payment network extensions state and interpretation */ export interface IPaymentNetwork { paymentNetworkId: PAYMENT_NETWORK_ID; + extension: Extension.IExtension; createExtensionsDataForCreation: (paymentNetworkCreationParameters: any) => Promise; createExtensionsDataForAddRefundInformation: (parameters: any) => any; createExtensionsDataForAddPaymentInformation: (parameters: any) => any; diff --git a/packages/utils/src/providers.ts b/packages/utils/src/providers.ts index 77c5b62601..079e7ba88d 100644 --- a/packages/utils/src/providers.ts +++ b/packages/utils/src/providers.ts @@ -45,7 +45,6 @@ const networkRpcs: Record = { /** * @see getDefaultProvider - * @param network */ const defaultProviderFactory: ProviderFactory = (network: string | undefined) => { if (!network) {