diff --git a/packages/currency/package.json b/packages/currency/package.json index 9acca55f0..583952620 100644 --- a/packages/currency/package.json +++ b/packages/currency/package.json @@ -45,8 +45,12 @@ "@metamask/contract-metadata": "1.31.0", "@requestnetwork/types": "0.54.0", "@requestnetwork/utils": "0.54.0", + "@ton/core": "0.61.0", + "@ton/crypto": "3.3.0", + "bech32": "2.0.0", "multicoin-address-validator": "0.5.15", "node-dijkstra": "2.5.0", + "starknet": "7.6.4", "tslib": "2.8.1" }, "devDependencies": { diff --git a/packages/currency/src/chains/declarative/data/aleo.ts b/packages/currency/src/chains/declarative/data/aleo.ts new file mode 100644 index 000000000..c0193f00b --- /dev/null +++ b/packages/currency/src/chains/declarative/data/aleo.ts @@ -0,0 +1 @@ +export const chainId = 'aleo'; diff --git a/packages/currency/src/chains/declarative/data/starknet.ts b/packages/currency/src/chains/declarative/data/starknet.ts new file mode 100644 index 000000000..c613faa38 --- /dev/null +++ b/packages/currency/src/chains/declarative/data/starknet.ts @@ -0,0 +1 @@ +export const chainId = 'starknet'; diff --git a/packages/currency/src/chains/declarative/data/ton.ts b/packages/currency/src/chains/declarative/data/ton.ts new file mode 100644 index 000000000..e58a7b269 --- /dev/null +++ b/packages/currency/src/chains/declarative/data/ton.ts @@ -0,0 +1 @@ +export const chainId = 'ton'; diff --git a/packages/currency/src/chains/declarative/index.ts b/packages/currency/src/chains/declarative/index.ts index a83e9163e..8ae254a05 100644 --- a/packages/currency/src/chains/declarative/index.ts +++ b/packages/currency/src/chains/declarative/index.ts @@ -2,10 +2,16 @@ import { CurrencyTypes } from '@requestnetwork/types'; import * as TronDefinition from './data/tron'; import * as SolanaDefinition from './data/solana'; +import * as StarknetDefinition from './data/starknet'; +import * as TonDefinition from './data/ton'; +import * as AleoDefinition from './data/aleo'; export type DeclarativeChain = CurrencyTypes.Chain; export const chains: Record = { tron: TronDefinition, solana: SolanaDefinition, + starknet: StarknetDefinition, + ton: TonDefinition, + aleo: AleoDefinition, }; diff --git a/packages/currency/src/currencyManager.ts b/packages/currency/src/currencyManager.ts index e69722867..d820612d9 100644 --- a/packages/currency/src/currencyManager.ts +++ b/packages/currency/src/currencyManager.ts @@ -1,6 +1,9 @@ import { CurrencyTypes, RequestLogicTypes } from '@requestnetwork/types'; import { utils } from 'ethers'; +import { Address } from '@ton/core'; +import { validateAndParseAddress } from 'starknet'; import addressValidator from 'multicoin-address-validator'; +import { bech32 } from 'bech32'; import { getSupportedERC20Tokens } from './erc20'; import { getSupportedERC777Tokens } from './erc777'; import { getHash } from './getHash'; @@ -264,6 +267,12 @@ export class CurrencyManager implements CurrencyTypes.ICurrency return isValidNearAddress(address, currency.network); } else if (currency.network === 'tron' || currency.network === 'solana') { return addressValidator.validate(address, currency.network); + } else if (currency.network === 'ton') { + return this.validateTonAddress(address); + } else if (currency.network === 'starknet') { + return this.validateStarknetAddress(address); + } else if (currency.network === 'aleo') { + return this.validateAleoAddress(address); } return addressValidator.validate(address, 'ETH'); case RequestLogicTypes.CURRENCY.BTC: @@ -290,6 +299,54 @@ export class CurrencyManager implements CurrencyTypes.ICurrency return this.validateAddress(currency.value, currency); } + /** + * Validate a TON address. See https://ton-org.github.io/ton-core/classes/Address.html#parse for more details. + * @param address - The address to validate + * @returns True if the address is valid, false otherwise + */ + validateTonAddress(address: string): boolean { + try { + return !!Address.parse(address); + } catch { + return false; + } + } + + /** + * Validate a Starknet address. See https://starknetjs.com/docs/next/API/modules/#validateandparseaddress for more details. + * @param address - The address to validate + * @returns True if the address is valid, false otherwise + */ + validateStarknetAddress(address: string): boolean { + try { + return !!validateAndParseAddress(address); + } catch { + return false; + } + } + + /** + * Validate an Aleo address using proper Bech32 validation with checksum verification. + * Aleo addresses use Bech32 encoding with: + * - HRP (Human Readable Part): "aleo" + * - Separator: "1" + * - Data + checksum: 58 characters + * - Total length: 63 characters + * - Strict Bech32 character set with checksum validation + * + * See https://namespaces.chainagnostic.org/aleo/caip10 for more details. + * @param address - The address to validate + * @returns True if the address is valid, false otherwise + */ + validateAleoAddress(address: string): boolean { + try { + const { prefix } = bech32.decode(address); + return prefix === 'aleo'; + } catch { + return false; + } + } + /** * Returns the list of currencies supported by Request out of the box * Contains: diff --git a/packages/currency/test/currencyManager.test.ts b/packages/currency/test/currencyManager.test.ts index 26a0819a3..12b885061 100644 --- a/packages/currency/test/currencyManager.test.ts +++ b/packages/currency/test/currencyManager.test.ts @@ -765,4 +765,46 @@ describe('CurrencyManager', () => { }); }); }); + + describe('validateAleoAddress', () => { + it('should validate correct Aleo addresses', () => { + const validAddress = 'aleo1qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8'; + expect(currencyManager.validateAleoAddress(validAddress)).toBe(true); + expect(currencyManager.validateAleoAddress(validAddress.toUpperCase())).toBe(true); + }); + + it('should reject invalid Aleo addresses', () => { + const invalidAddresses = [ + // Empty or null inputs + '', + ' ', + null, + undefined, + // Wrong prefix + 'bitcoin1qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8', + 'cosmos1qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8', + // Mixed case + 'aleo1Qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8', + // Wrong format + 'aleo1', + 'aleo1abc', + 'not-an-address', + 'random-string', + // Invalid characters that would pass simple regex but fail Bech32 + 'aleo1' + 'b'.repeat(58), // 'b' not in Bech32 alphabet + 'aleo1' + 'i'.repeat(58), // 'i' not in Bech32 alphabet + 'aleo1' + 'o'.repeat(58), // 'o' not in Bech32 alphabet + // Non-string inputs + 123, + {}, + [], + // valid address with whitespace + ' aleo1qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8 ', + ]; + + invalidAddresses.forEach((address) => { + expect(currencyManager.validateAleoAddress(address as any)).toBe(false); + }); + }); + }); }); diff --git a/packages/request-client.js/test/index.test.ts b/packages/request-client.js/test/index.test.ts index 714a850fa..868bca8f3 100644 --- a/packages/request-client.js/test/index.test.ts +++ b/packages/request-client.js/test/index.test.ts @@ -5,6 +5,7 @@ import { ExtensionTypes, IdentityTypes, PaymentTypes, + CurrencyTypes, RequestLogicTypes, } from '@requestnetwork/types'; import { decrypt, random32Bytes } from '@requestnetwork/utils'; @@ -1647,48 +1648,59 @@ 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, - }); + describe('Can create ERC20 declarative requests with non-evm currencies', () => { + const cases: Array<[CurrencyTypes.DeclarativeChainName, string]> = [ + ['solana', 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'], + ['ton', 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs'], + ['starknet', '0x028757d11c97078Dd182023B1cC7b9E7659716c631ADF94D24f1fa7Dc5943072'], + ['aleo', 'aleo1qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8'], + ]; + + it.each(cases)( + 'Can create ERC20 declarative requests with non-evm currency - %s', + async (network, tokenAddress) => { + const requestNetwork = new RequestNetwork({ + signatureProvider: TestData.fakeSignatureProvider, + useMockStorage: true, + }); - const paymentNetwork: PaymentTypes.PaymentNetworkCreateParameters = { - id: ExtensionTypes.PAYMENT_NETWORK_ID.ANY_DECLARATIVE, - parameters: {}, - }; + 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 requestInfo = Object.assign({}, TestData.parametersWithoutExtensionsData, { + currency: { + network, + type: RequestLogicTypes.CURRENCY.ERC20, + value: tokenAddress, + }, + }); - const request = await requestNetwork.createRequest({ - paymentNetwork, - requestInfo, - signer: TestData.payee.identity, - }); + const request = await requestNetwork.createRequest({ + paymentNetwork, + requestInfo, + signer: TestData.payee.identity, + }); - await new Promise((resolve): any => setTimeout(resolve, 150)); - let data = await request.refresh(); + await new Promise((resolve): any => setTimeout(resolve, 150)); + const 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).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); + 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 () => { diff --git a/packages/types/src/currency-types.ts b/packages/types/src/currency-types.ts index b0b51d8fd..6a3dd1c19 100644 --- a/packages/types/src/currency-types.ts +++ b/packages/types/src/currency-types.ts @@ -42,7 +42,7 @@ export type BtcChainName = 'mainnet' | 'testnet'; /** * List of supported Declarative chains */ -export type DeclarativeChainName = 'tron' | 'solana'; +export type DeclarativeChainName = 'tron' | 'solana' | 'ton' | 'starknet' | 'aleo'; /** * List of supported NEAR chains diff --git a/yarn.lock b/yarn.lock index e7be0a5d7..d93bc1a41 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4150,6 +4150,13 @@ dependencies: "@noble/hashes" "1.3.2" +"@noble/curves@1.7.0", "@noble/curves@~1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45" + integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw== + dependencies: + "@noble/hashes" "1.6.0" + "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" @@ -4170,11 +4177,21 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== +"@noble/hashes@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5" + integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ== + "@noble/hashes@^1.1.2": version "1.5.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== +"@noble/hashes@~1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" + integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" @@ -5140,6 +5157,11 @@ dependencies: semver "^7.3.7" +"@scure/base@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.1.tgz#dd0b2a533063ca612c17aa9ad26424a2ff5aa865" + integrity sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ== + "@scure/base@~1.1.0": version "1.1.1" resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz" @@ -5179,6 +5201,14 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" +"@scure/starknet@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@scure/starknet/-/starknet-1.1.0.tgz#d1902e053d98196e161b9b2c3996b20999094e7a" + integrity sha512-83g3M6Ix2qRsPN4wqLDqiRZ2GBNbjVWfboJE/9UjfG+MHr6oDSu/CWgy8hsBSJejr09DkkL+l0Ze4KVrlCIdtQ== + dependencies: + "@noble/curves" "~1.7.0" + "@noble/hashes" "~1.6.0" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" @@ -5463,6 +5493,16 @@ "@stablelib/random" "^1.0.2" "@stablelib/wipe" "^1.0.1" +"@starknet-io/starknet-types-07@npm:@starknet-io/types-js@~0.7.10": + version "0.7.10" + resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.7.10.tgz#d21dc973d0cd04d7b6293ce461f2f06a5873c760" + integrity sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w== + +"@starknet-io/starknet-types-08@npm:@starknet-io/types-js@~0.8.4": + version "0.8.4" + resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.8.4.tgz#bbc07422e89cb5bac45da28e8457f0f17535950d" + integrity sha512-0RZ3TZHcLsUTQaq1JhDSCM8chnzO4/XNsSCozwDET64JK5bjFDIf2ZUkta+tl5Nlbf4usoU7uZiDI/Q57kt2SQ== + "@superfluid-finance/ethereum-contracts@1.1.1": version "1.1.1" resolved "https://registry.npmjs.org/@superfluid-finance/ethereum-contracts/-/ethereum-contracts-1.1.1.tgz" @@ -5512,6 +5552,29 @@ dependencies: defer-to-connect "^2.0.1" +"@ton/core@0.61.0": + version "0.61.0" + resolved "https://registry.yarnpkg.com/@ton/core/-/core-0.61.0.tgz#09b37801cb2f5a942020fcc992be1e99f4b16689" + integrity sha512-0qyVfP2dDue2bq80ydXggo2MlufcmzuFk6G94qRrZxvyQ3NSe4UeBTeRf1gQmN7tywgTsX2gS61e4yvJrlUu4Q== + dependencies: + symbol.inspect "1.0.1" + +"@ton/crypto-primitives@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@ton/crypto-primitives/-/crypto-primitives-2.1.0.tgz#8c9277c250b59aae3c819e0d6bd61e44d998e9ca" + integrity sha512-PQesoyPgqyI6vzYtCXw4/ZzevePc4VGcJtFwf08v10OevVJHVfW238KBdpj1kEDQkxWLeuNHEpTECNFKnP6tow== + dependencies: + jssha "3.2.0" + +"@ton/crypto@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@ton/crypto/-/crypto-3.3.0.tgz#019103df6540fbc1d8102979b4587bc85ff9779e" + integrity sha512-/A6CYGgA/H36OZ9BbTaGerKtzWp50rg67ZCH2oIjV1NcrBaCK9Z343M+CxedvM7Haf3f/Ee9EhxyeTp0GKMUpA== + dependencies: + "@ton/crypto-primitives" "2.1.0" + jssha "3.2.0" + tweetnacl "1.0.3" + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" @@ -6718,6 +6781,16 @@ abbrev@^2.0.0: resolved "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz" integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== +abi-wan-kanabi@2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/abi-wan-kanabi/-/abi-wan-kanabi-2.2.4.tgz#47ebbafbb7f8df81773efbdcca60cdda8008c821" + integrity sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg== + dependencies: + ansicolors "^0.3.2" + cardinal "^2.1.1" + fs-extra "^10.0.0" + yargs "^17.7.2" + abortcontroller-polyfill@^1.7.5: version "1.7.5" resolved "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz" @@ -7024,6 +7097,11 @@ ansi-wrap@0.1.0: resolved "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= +ansicolors@^0.3.2, ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + antlr4@4.7.1: version "4.7.1" resolved "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz" @@ -9152,6 +9230,14 @@ capital-case@^1.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" @@ -11955,7 +12041,7 @@ esprima@1.2.2: resolved "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz" integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -13517,6 +13603,15 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^11.1.0: version "11.2.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz" @@ -16844,6 +16939,11 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jssha@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jssha/-/jssha-3.2.0.tgz#88ec50b866dd1411deaddbe6b3e3692e4c710f16" + integrity sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q== + jssha@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/jssha/-/jssha-2.4.2.tgz" @@ -17575,6 +17675,11 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lossless-json@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lossless-json/-/lossless-json-4.1.1.tgz#b7cbac00c222a68072a9037563dfc4c71cee52f0" + integrity sha512-HusN80C0ohtT9kOHQH7EuUaqzRQsnekpa+2ot8OzvW0iC08dq/YtM/7uKwwajldQsCrHyC8q9fz3t3L+TmDltA== + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz" @@ -19814,7 +19919,7 @@ pako@^0.2.5: resolved "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= -pako@^2.1.0: +pako@^2.0.4, pako@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== @@ -21153,6 +21258,13 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== + dependencies: + esprima "~4.0.0" + reduce-flatten@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" @@ -22614,6 +22726,22 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" +starknet@7.6.4: + version "7.6.4" + resolved "https://registry.yarnpkg.com/starknet/-/starknet-7.6.4.tgz#8ca2f3decbecde6316e7561b39f6a296a7fa33b5" + integrity sha512-FB20IaLCDbh/XomkB+19f5jmNxG+RzNdRO7QUhm7nfH81UPIt2C/MyWAlHCYkbv2wznSEb73wpxbp9tytokTgQ== + dependencies: + "@noble/curves" "1.7.0" + "@noble/hashes" "1.6.0" + "@scure/base" "1.2.1" + "@scure/starknet" "1.1.0" + "@starknet-io/starknet-types-07" "npm:@starknet-io/types-js@~0.7.10" + "@starknet-io/starknet-types-08" "npm:@starknet-io/types-js@~0.8.4" + abi-wan-kanabi "2.2.4" + lossless-json "^4.0.1" + pako "^2.0.4" + ts-mixer "^6.0.3" + static-eval@2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz" @@ -22768,7 +22896,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -22786,6 +22914,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" @@ -22920,7 +23057,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -22955,6 +23092,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" @@ -23155,6 +23299,11 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" +symbol.inspect@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol.inspect/-/symbol.inspect-1.0.1.tgz#e13125b8038c4996eb0dfa1567332ad4dcd0763f" + integrity sha512-YQSL4duoHmLhsTD1Pw8RW6TZ5MaTX5rXJnqacJottr2P2LZBF/Yvrc3ku4NUpMOm8aM0KOCqM+UAkMA5HWQCzQ== + syntax-error@^1.1.1: version "1.4.0" resolved "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz" @@ -23737,6 +23886,11 @@ ts-log@^2.2.3: resolved "https://registry.npmjs.org/ts-log/-/ts-log-2.2.3.tgz" integrity sha512-XvB+OdKSJ708Dmf9ore4Uf/q62AYDTzFcAdxc8KNML1mmAWywRFVt/dn1KYJH8Agt5UJNujfM3znU5PxgAzA2w== +ts-mixer@^6.0.3: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.4.tgz#1da39ceabc09d947a82140d9f09db0f84919ca28" + integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== + ts-morph@^19.0.0: version "19.0.0" resolved "https://registry.npmjs.org/ts-morph/-/ts-morph-19.0.0.tgz" @@ -23937,16 +24091,16 @@ tweetnacl-util@^0.15.0, tweetnacl-util@^0.15.1: resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== +tweetnacl@1.0.3, tweetnacl@^1.0.0, tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -tweetnacl@^1.0.0, tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" @@ -26160,7 +26314,7 @@ workerpool@6.2.1: resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -26195,6 +26349,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" @@ -26585,7 +26748,7 @@ yargs@^17.0.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.3.1, yargs@^17.6.2: +yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==