Skip to content

Commit

Permalink
fix: solana address validation
Browse files Browse the repository at this point in the history
  • Loading branch information
leoslr committed Oct 2, 2023
1 parent d6a6b06 commit 8c9c87e
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 9 deletions.
2 changes: 1 addition & 1 deletion packages/currency/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
"@metamask/contract-metadata": "1.31.0",
"@requestnetwork/types": "0.36.0",
"@requestnetwork/utils": "0.36.0",
"multicoin-address-validator": "0.5.2",
"multicoin-address-validator": "0.5.12",
"node-dijkstra": "2.5.0",
"tslib": "2.5.0"
},
Expand Down
1 change: 1 addition & 0 deletions packages/currency/src/chains/declarative/data/solana.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const chainId = 'solana';
2 changes: 2 additions & 0 deletions packages/currency/src/chains/declarative/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import { CurrencyTypes } from '@requestnetwork/types';
import { Chain } from '../../types';

import * as TronDefinition from './data/tron';
import * as SolanaDefinition from './data/solana';

export type DeclarativeChain = Chain;

export const chains: Record<CurrencyTypes.DeclarativeChainName, DeclarativeChain> = {
tron: TronDefinition,
solana: SolanaDefinition,
};
2 changes: 1 addition & 1 deletion packages/currency/src/currencyManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ export class CurrencyManager<TMeta = unknown> implements ICurrencyManager<TMeta>
case RequestLogicTypes.CURRENCY.ERC777:
if (NearChains.isChainSupported(currency.network)) {
return isValidNearAddress(address, currency.network);
} else if (currency.network === 'tron') {
} else if (currency.network === 'tron' || currency.network === 'solana') {
return addressValidator.validate(address, currency.network);
}
return addressValidator.validate(address, 'ETH');
Expand Down
46 changes: 45 additions & 1 deletion packages/request-client.js/test/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1635,7 +1635,7 @@ describe('request-client.js', () => {
});
});

it('Can create ERC20 declarative requests with non-evm currency', async () => {
it('Can create ERC20 declarative requests with non-evm currency - near', async () => {
const testErc20TokenAddress = 'usdc.near';
const requestNetwork = new RequestNetwork({
signatureProvider: TestData.fakeSignatureProvider,
Expand Down Expand Up @@ -1679,6 +1679,50 @@ describe('request-client.js', () => {
expect(data.expectedAmount).toBe(requestParameters.expectedAmount);
});

it('Can create ERC20 declarative requests with non-evm currency - solana', async () => {
const testErc20TokenAddress = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
const requestNetwork = new RequestNetwork({
signatureProvider: TestData.fakeSignatureProvider,
useMockStorage: true,
});

const paymentNetwork: PaymentTypes.PaymentNetworkCreateParameters = {
id: ExtensionTypes.PAYMENT_NETWORK_ID.ANY_DECLARATIVE,
parameters: {},
};

const requestInfo = Object.assign({}, TestData.parametersWithoutExtensionsData, {
currency: {
network: 'solana',
type: RequestLogicTypes.CURRENCY.ERC20,
value: testErc20TokenAddress,
},
});

const request = await requestNetwork.createRequest({
paymentNetwork,
requestInfo,
signer: TestData.payee.identity,
});

await new Promise((resolve): any => setTimeout(resolve, 150));
let data = await request.refresh();

expect(data).toBeDefined();
expect(data.balance?.balance).toBe('0');
expect(data.balance?.events.length).toBe(0);
expect(data.meta).toBeDefined();
expect(data.currency).toBe('unknown');

expect(data.extensions[ExtensionTypes.PAYMENT_NETWORK_ID.ANY_DECLARATIVE].values).toEqual({
receivedPaymentAmount: '0',
receivedRefundAmount: '0',
sentPaymentAmount: '0',
sentRefundAmount: '0',
});
expect(data.expectedAmount).toBe(requestParameters.expectedAmount);
});

it('cannot create ERC20 address based requests with invalid currency', async () => {
const testErc20TokenAddress = 'invalidErc20Address';

Expand Down
2 changes: 1 addition & 1 deletion packages/types/src/currency-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export type BtcChainName = 'mainnet' | 'testnet';
/**
* List of supported Declarative chains
*/
export type DeclarativeChainName = 'tron';
export type DeclarativeChainName = 'tron' | 'solana';

/**
* List of supported NEAR chains
Expand Down
17 changes: 12 additions & 5 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -6904,6 +6904,13 @@ base-x@^3.0.2, base-x@^3.0.8:
dependencies:
safe-buffer "^5.0.1"

base-x@^3.0.9:
version "3.0.9"
resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320"
integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==
dependencies:
safe-buffer "^5.0.1"

base64-js@0.0.8:
version "0.0.8"
resolved "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz"
Expand Down Expand Up @@ -16497,12 +16504,12 @@ multicodec@^1.0.0:
buffer "^5.6.0"
varint "^5.0.0"

multicoin-address-validator@0.5.2:
version "0.5.2"
resolved "https://registry.npmjs.org/multicoin-address-validator/-/multicoin-address-validator-0.5.2.tgz"
integrity sha512-0X0g1dhWKhtpadIe+cwTonTObw7FrHZkJVfd9yjlPFnictOrVZOaMFWLU0iV1Ok9vl4oi8H0t4OWAAMRAuYwJw==
multicoin-address-validator@0.5.12:
version "0.5.12"
resolved "https://registry.yarnpkg.com/multicoin-address-validator/-/multicoin-address-validator-0.5.12.tgz#348d549f8816cb9141c06a5e401879aabe8775d1"
integrity sha512-lL8vr/2ZYB84KkYfwuxGWFXkskTG04Np1Tq3VLnK3p1cocNH2QOC7AL+ND8GUR3Ju+yDDBw+VV20AaT2MhRLIQ==
dependencies:
base-x "^3.0.8"
base-x "^3.0.9"
browserify-bignum "^1.3.0-2"
bundle "^2.1.0"
cbor-js "^0.1.0"
Expand Down

0 comments on commit 8c9c87e

Please sign in to comment.