From 1990d8954395d811e252e3a55a5268627b42a968 Mon Sep 17 00:00:00 2001 From: gitwoz <177856586+gitwoz@users.noreply.github.com> Date: Thu, 21 Nov 2024 13:48:04 +0700 Subject: [PATCH 01/10] feat(donation): add mutation and notice for token withdrawal --- schema.graphql | 8 ++++++++ src/definitions/schema.d.ts | 38 ++++++++++++++++++++++++++++++++++++- src/types/notice.ts | 1 + src/types/payment.ts | 7 +++++++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/schema.graphql b/schema.graphql index 32cd5a430..56eb9e501 100644 --- a/schema.graphql +++ b/schema.graphql @@ -252,6 +252,9 @@ type Mutation { """Create Stripe Connect account for Payout""" connectStripeAccount(input: ConnectStripeAccountInput!): ConnectStripeAccountResult! + """Withdraw locked ERC20/native token from donation vault""" + withdrawLockedTokens: WithdrawLockedTokensResult! + """Create or Update an OAuth Client, used in OSS.""" putOAuthClient(input: PutOAuthClientInput!): OAuthClient putCollection(input: PutCollectionInput!): Collection! @@ -1887,6 +1890,7 @@ type TransactionNotice implements Notice { enum TransactionNoticeType { PaymentReceivedDonation + WithdrewLockedTokens } type CircleNotice implements Notice { @@ -3531,6 +3535,10 @@ type ConnectStripeAccountResult { redirectUrl: String! } +type WithdrawLockedTokensResult { + transaction: Transaction! +} + enum StripeAccountCountry { Australia Austria diff --git a/src/definitions/schema.d.ts b/src/definitions/schema.d.ts index f33ab3ece..7ba1c993d 100644 --- a/src/definitions/schema.d.ts +++ b/src/definitions/schema.d.ts @@ -1967,6 +1967,8 @@ export type GQLMutation = { voteComment: GQLComment /** Login/Signup via a wallet. */ walletLogin: GQLAuthResult + /** Withdraw locked ERC20/native token from donation vault */ + withdrawLockedTokens: GQLWithdrawLockedTokensResult } export type GQLMutationAddBlockedSearchKeywordArgs = { @@ -3587,7 +3589,9 @@ export type GQLTransactionNotice = GQLNotice & { unread: Scalars['Boolean']['output'] } -export type GQLTransactionNoticeType = 'PaymentReceivedDonation' +export type GQLTransactionNoticeType = + | 'PaymentReceivedDonation' + | 'WithdrewLockedTokens' export type GQLTransactionPurpose = | 'addCredit' @@ -4170,6 +4174,11 @@ export type GQLWalletLoginInput = { signedMessage: Scalars['String']['input'] } +export type GQLWithdrawLockedTokensResult = { + __typename?: 'WithdrawLockedTokensResult' + transaction: GQLTransaction +} + export type GQLWriting = GQLArticle | GQLMoment export type GQLWritingChallenge = GQLCampaign & @@ -5127,6 +5136,11 @@ export type GQLResolversTypes = ResolversObject<{ VoteCommentInput: GQLVoteCommentInput Wallet: ResolverTypeWrapper WalletLoginInput: GQLWalletLoginInput + WithdrawLockedTokensResult: ResolverTypeWrapper< + Omit & { + transaction: GQLResolversTypes['Transaction'] + } + > Writing: ResolverTypeWrapper WritingChallenge: ResolverTypeWrapper WritingConnection: ResolverTypeWrapper< @@ -5625,6 +5639,10 @@ export type GQLResolversParentTypes = ResolversObject<{ VoteCommentInput: GQLVoteCommentInput Wallet: UserModel WalletLoginInput: GQLWalletLoginInput + WithdrawLockedTokensResult: Omit< + GQLWithdrawLockedTokensResult, + 'transaction' + > & { transaction: GQLResolversParentTypes['Transaction'] } Writing: WritingModel WritingChallenge: CampaignModel WritingConnection: Omit & { @@ -8114,6 +8132,11 @@ export type GQLMutationResolvers< ContextType, RequireFields > + withdrawLockedTokens?: Resolver< + GQLResolversTypes['WithdrawLockedTokensResult'], + ParentType, + ContextType + > }> export type GQLNftAssetResolvers< @@ -9724,6 +9747,18 @@ export type GQLWalletResolvers< __isTypeOf?: IsTypeOfResolverFn }> +export type GQLWithdrawLockedTokensResultResolvers< + ContextType = Context, + ParentType extends GQLResolversParentTypes['WithdrawLockedTokensResult'] = GQLResolversParentTypes['WithdrawLockedTokensResult'] +> = ResolversObject<{ + transaction?: Resolver< + GQLResolversTypes['Transaction'], + ParentType, + ContextType + > + __isTypeOf?: IsTypeOfResolverFn +}> + export type GQLWritingResolvers< ContextType = Context, ParentType extends GQLResolversParentTypes['Writing'] = GQLResolversParentTypes['Writing'] @@ -9979,6 +10014,7 @@ export type GQLResolvers = ResolversObject<{ UserSettings?: GQLUserSettingsResolvers UserStatus?: GQLUserStatusResolvers Wallet?: GQLWalletResolvers + WithdrawLockedTokensResult?: GQLWithdrawLockedTokensResultResolvers Writing?: GQLWritingResolvers WritingChallenge?: GQLWritingChallengeResolvers WritingConnection?: GQLWritingConnectionResolvers diff --git a/src/types/notice.ts b/src/types/notice.ts index c80495b9f..df9109f72 100644 --- a/src/types/notice.ts +++ b/src/types/notice.ts @@ -263,6 +263,7 @@ export default /* GraphQL */ ` enum TransactionNoticeType { PaymentReceivedDonation + WithdrewLockedTokens } diff --git a/src/types/payment.ts b/src/types/payment.ts index d509ac36d..b15c59638 100644 --- a/src/types/payment.ts +++ b/src/types/payment.ts @@ -17,6 +17,9 @@ export default /* GraphQL */ ` "Create Stripe Connect account for Payout" connectStripeAccount(input: ConnectStripeAccountInput!): ConnectStripeAccountResult! @auth(mode: "${AUTH_MODE.oauth}", group: "${SCOPE_GROUP.level3}") + + "Withdraw locked ERC20/native token from donation vault" + withdrawLockedTokens: WithdrawLockedTokensResult! @auth(mode: "${AUTH_MODE.oauth}") } input ExchangeRatesInput { @@ -208,6 +211,10 @@ export default /* GraphQL */ ` redirectUrl: String! } + type WithdrawLockedTokensResult { + transaction: Transaction! + } + enum StripeAccountCountry { Australia Austria From 9d6d8cb656eded8dc118cef81904d079e5437637 Mon Sep 17 00:00:00 2001 From: gitwoz <177856586+gitwoz@users.noreply.github.com> Date: Fri, 29 Nov 2024 16:05:28 +0700 Subject: [PATCH 02/10] feat(donation): impl "withdrawLockedTokens" mutation and integrate with Alchemy AA --- .env.example | 1 + ...0241129125017_alter_transaction_purpose.js | 68 + package-lock.json | 2027 +++++++++++------ package.json | 4 +- src/common/enums/notification.ts | 1 + src/common/enums/payment.ts | 1 + src/common/environment.ts | 7 + src/connectors/baseService.ts | 2 +- src/connectors/blockchain/baseContract.ts | 6 +- src/connectors/blockchain/curation.ts | 4 +- src/connectors/blockchain/curationVault.ts | 212 ++ src/connectors/userService.ts | 2 +- src/definitions/notification.d.ts | 8 + src/mutations/user/claimLogbooks.ts | 6 +- src/mutations/user/index.ts | 2 + src/mutations/user/withdrawLockedTokens.ts | 106 + src/queries/notice/index.ts | 3 + 17 files changed, 1753 insertions(+), 707 deletions(-) create mode 100644 db/migrations/20241129125017_alter_transaction_purpose.js create mode 100644 src/connectors/blockchain/curationVault.ts create mode 100644 src/mutations/user/withdrawLockedTokens.ts diff --git a/.env.example b/.env.example index 5dbac45ee..f8d739561 100644 --- a/.env.example +++ b/.env.example @@ -75,6 +75,7 @@ APOLLO_KEY= APOLLO_GRAPH_REF= MATTERS_OPENSEA_API_BASE=https://rinkeby-api.opensea.io/api/v1 MATTERS_LOGBOOK_CLAIMER_PRIVATE_KEY= +MATTERS_CURATION_VAULT_SIGNER_PRIVATE_KEY= MATTERS_ALCHEMY_API_KEY= MATTERS_OPENSEA_API_KEY= MATTERS_EXCHANGE_RATES_DATA_API_KEY=QLqGNNhnz8MHpwOh9AqTJv069po2aR09 diff --git a/db/migrations/20241129125017_alter_transaction_purpose.js b/db/migrations/20241129125017_alter_transaction_purpose.js new file mode 100644 index 000000000..2e1cbfd58 --- /dev/null +++ b/db/migrations/20241129125017_alter_transaction_purpose.js @@ -0,0 +1,68 @@ +const { alterEnumString } = require('../utils') + +const table = 'transaction' + +exports.up = async (knex) => { + await knex.raw( + alterEnumString(table, 'purpose', [ + 'donation', + 'add-credit', + 'refund', + 'payout', + 'subscription', + 'subscription-split', + 'dispute-withdrawn-funds', + 'dispute', + ]) + ) + + await knex(table) + .where({ purpose: 'dispute-withdrawn-funds' }) + .update({ purpose: 'dispute' }) + + await knex.raw( + alterEnumString(table, 'purpose', [ + 'donation', + 'add-credit', + 'refund', + 'payout', + 'subscription', + 'subscription-split', + 'dispute', + 'payout-reversal', + ]) + ) +} + +exports.down = async (knex) => { + await knex.raw( + alterEnumString(table, 'purpose', [ + 'donation', + 'add-credit', + 'refund', + 'payout', + 'subscription', + 'subscription-split', + 'dispute-withdrawn-funds', + 'dispute', + 'curation-vault-withdrawal', + ]) + ) + + await knex(table) + .where({ purpose: 'dispute' }) + .update({ purpose: 'dispute-withdrawn-funds' }) + + await knex.raw( + alterEnumString(table, 'purpose', [ + 'donation', + 'add-credit', + 'refund', + 'payout', + 'subscription', + 'subscription-split', + 'dispute-withdrawn-funds', + 'dispute', + ]) + ) +} diff --git a/package-lock.json b/package-lock.json index d7d22ee90..cab34c724 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "5.5.6", "license": "Apache-2.0", "dependencies": { + "@alchemy/aa-accounts": "^3.19.0", + "@alchemy/aa-core": "^3.19.0", "@apollo/cache-control-types": "^1.0.2", "@apollo/datasource-rest": "^6.0.0", "@apollo/server": "^4.7.4", @@ -81,7 +83,7 @@ "typescript": "^5.0.4", "uuid": "^9.0.0", "validator": "^13.9.0", - "viem": "^1.21.1", + "viem": "^2.21.52", "winston": "^3.8.2", "xss": "^1.0.14" }, @@ -164,10 +166,221 @@ } }, "node_modules/@adraffy/ens-normalize": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", + "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==" + }, + "node_modules/@alchemy/aa-accounts": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@alchemy/aa-accounts/-/aa-accounts-3.19.0.tgz", + "integrity": "sha512-cdR8H9LveeUyBWFkmoqU7hZnFoqmdyPQDYZRtFr9aF+3zWAQYYJ/13Vz7aoVQ4lZ57+JQj7fN5vSVn2gFI47yA==", + "dependencies": { + "@alchemy/aa-core": "^3.18.2", + "viem": "2.8.6" + }, + "peerDependencies": { + "viem": "2.8.6" + } + }, + "node_modules/@alchemy/aa-accounts/node_modules/@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + }, + "node_modules/@alchemy/aa-accounts/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@alchemy/aa-accounts/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@alchemy/aa-accounts/node_modules/abitype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", + "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@alchemy/aa-accounts/node_modules/isows": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", + "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@alchemy/aa-accounts/node_modules/viem": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.8.6.tgz", + "integrity": "sha512-LqxLOSFtXfbC3tsiZ8Km8jKR4ktTOLfigL2dR9IN28He2+QrNhYvvwGPz3P4hbfU12Wvuxo6mWGZ2L1lpNtvrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@scure/bip32": "1.3.2", + "@scure/bip39": "1.2.1", + "abitype": "1.0.0", + "isows": "1.0.3", + "ws": "8.13.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@alchemy/aa-core": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@alchemy/aa-core/-/aa-core-3.19.0.tgz", + "integrity": "sha512-gVSesLsXORMuiA3w/w+4eQikzrikpj1XN2Sbrcik0v25AKH5QrHn0HddhyrN1aCFW2NoXjyhwxlySiTDVfTgxQ==", + "dependencies": { + "abitype": "^0.8.3", + "eventemitter3": "^5.0.1", + "viem": "2.8.6", + "zod": "^3.22.4" + }, + "peerDependencies": { + "viem": "2.8.6" + } + }, + "node_modules/@alchemy/aa-core/node_modules/@adraffy/ens-normalize": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" }, + "node_modules/@alchemy/aa-core/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@alchemy/aa-core/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@alchemy/aa-core/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/@alchemy/aa-core/node_modules/isows": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", + "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@alchemy/aa-core/node_modules/viem": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.8.6.tgz", + "integrity": "sha512-LqxLOSFtXfbC3tsiZ8Km8jKR4ktTOLfigL2dR9IN28He2+QrNhYvvwGPz3P4hbfU12Wvuxo6mWGZ2L1lpNtvrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@scure/bip32": "1.3.2", + "@scure/bip39": "1.2.1", + "abitype": "1.0.0", + "isows": "1.0.3", + "ws": "8.13.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@alchemy/aa-core/node_modules/viem/node_modules/abitype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", + "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -763,12 +976,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -824,15 +1038,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -849,12 +1064,12 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -901,19 +1116,17 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", - "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -957,54 +1170,41 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1014,35 +1214,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1052,25 +1252,26 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1089,27 +1290,25 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", - "dev": true, + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1128,25 +1327,13 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.26.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1226,12 +1413,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", - "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", + "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1280,12 +1467,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1382,12 +1569,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1496,13 +1683,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", - "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", + "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-flow": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1574,14 +1761,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1717,45 +1904,48 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1764,14 +1954,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", - "dev": true, + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -5110,22 +5298,25 @@ "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" }, "node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", "dependencies": { - "@noble/hashes": "1.3.2" + "@noble/hashes": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -5287,9 +5478,9 @@ "dev": true }, "node_modules/@scure/base": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", - "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz", + "integrity": "sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==", "funding": { "url": "https://paulmillr.com/funding/" } @@ -5307,6 +5498,47 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@scure/bip39": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", @@ -5319,6 +5551,25 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@sendgrid/client": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.7.0.tgz", @@ -6279,9 +6530,12 @@ } }, "node_modules/@types/node": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.2.tgz", - "integrity": "sha512-jJs9ErFLP403I+hMLGnqDRWT0RYKSvArxuBVh2veudHV7ifEC1WAmjJADacZ7mRbA2nWgHtn8xyECMAot0SkAw==" + "version": "18.19.67", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.67.tgz", + "integrity": "sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-fetch": { "version": "2.6.4", @@ -6811,23 +7065,14 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/abitype": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz", - "integrity": "sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.8.11.tgz", + "integrity": "sha512-bM4v2dKvX08sZ9IU38IN5BKmN+ZkOSd2oI4a9f0ejHYZQYV6cDr7j+d95ga0z2XHG36Y4jzoG5Z7qDqxp7fi/A==", "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.19.1" }, "peerDependenciesMeta": { - "typescript": { - "optional": true - }, "zod": { "optional": true } @@ -6857,9 +7102,9 @@ } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -6956,9 +7201,9 @@ "integrity": "sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==" }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -7256,11 +7501,11 @@ } }, "node_modules/axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -7712,12 +7957,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -7729,9 +7974,9 @@ "integrity": "sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==" }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -7748,10 +7993,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -7811,9 +8056,9 @@ } }, "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", "hasInstallScript": true, "optional": true, "dependencies": { @@ -7918,9 +8163,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001637", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001637.tgz", - "integrity": "sha512-1x0qRI1mD1o9e+7mBI7XtzFAP4XszbHaVWsMiGbSPLYekKTJF7K+FNk6AsXH4sUpc+qrsI3pVgf1Jdl/uGkuSQ==", + "version": "1.0.30001684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", "dev": true, "funding": [ { @@ -8116,16 +8361,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -8138,6 +8377,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -9342,9 +9584,9 @@ } }, "node_modules/dset": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", - "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", "engines": { "node": ">=4" } @@ -9391,9 +9633,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.812", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.812.tgz", - "integrity": "sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==", + "version": "1.5.67", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.67.tgz", + "integrity": "sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==", "dev": true }, "node_modules/emittery": { @@ -9572,9 +9814,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -9680,23 +9922,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", @@ -9773,23 +9998,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -9942,18 +10150,6 @@ "eslint": ">=8.38.0" } }, - "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -10608,9 +10804,9 @@ "integrity": "sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -10766,9 +10962,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -10899,9 +11095,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -11058,9 +11254,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -11962,6 +12161,17 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-util-embedded": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", @@ -13328,11 +13538,14 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13722,13 +13935,13 @@ } }, "node_modules/isows": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", - "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" + "url": "https://github.com/sponsors/wevm" } ], "peerDependencies": { @@ -15605,9 +15818,9 @@ } }, "node_modules/jiti": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", - "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -15755,15 +15968,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-bigint": { @@ -17461,12 +17674,12 @@ ] }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -17764,9 +17977,9 @@ "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" }, "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -17961,9 +18174,9 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/nodemon": { @@ -18653,6 +18866,84 @@ "os-tmpdir": "^1.0.0" } }, + "node_modules/ox": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.1.2.tgz", + "integrity": "sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ox/node_modules/@scure/bip32": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.0.tgz", + "integrity": "sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==", + "dependencies": { + "@noble/curves": "~1.7.0", + "@noble/hashes": "~1.6.0", + "@scure/base": "~1.2.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@scure/bip39": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.0.tgz", + "integrity": "sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==", + "dependencies": { + "@noble/hashes": "~1.6.0", + "@scure/base": "~1.2.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/abitype": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", + "integrity": "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/ox/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "node_modules/p-defer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", @@ -19046,29 +19337,26 @@ } }, "node_modules/path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/path-scurry/node_modules/minipass": { "version": "6.0.2", @@ -19182,9 +19470,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -20139,9 +20427,9 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -20209,12 +20497,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, "node_modules/regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", @@ -20648,12 +20930,16 @@ } }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21697,7 +21983,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -21855,15 +22140,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -22154,15 +22430,15 @@ } }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/ua-parser-js": { @@ -22265,6 +22541,11 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -22450,9 +22731,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -22469,8 +22750,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -22581,9 +22862,13 @@ } }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -22713,9 +22998,9 @@ "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/viem": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/viem/-/viem-1.21.1.tgz", - "integrity": "sha512-4Tb2f73FTGN+6PRPmgmKmlIfy/ENS4iU1KKfOPhUA37pZMmVw2rxN0QXMHB4OMa1ZVBlbpde1eG33vyj0L8YeQ==", + "version": "2.21.52", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.52.tgz", + "integrity": "sha512-O53JhgVhp9CB0T3afy79O5ixNr8XXRGYQtlGYerzttnP56Oh2NBx4+Otz8IFd9N5DVPywf6tmYxHP1RVA99xJA==", "funding": [ { "type": "github", @@ -22723,14 +23008,15 @@ } ], "dependencies": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@scure/bip32": "1.3.2", - "@scure/bip39": "1.2.1", - "abitype": "0.9.8", - "isows": "1.0.3", - "ws": "8.13.0" + "@noble/curves": "1.6.0", + "@noble/hashes": "1.5.0", + "@scure/bip32": "1.5.0", + "@scure/bip39": "1.4.0", + "abitype": "1.0.6", + "isows": "1.0.6", + "ox": "0.1.2", + "webauthn-p256": "0.0.10", + "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -22741,6 +23027,104 @@ } } }, + "node_modules/viem/node_modules/@noble/curves": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "dependencies": { + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@scure/bip32": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz", + "integrity": "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==", + "dependencies": { + "@noble/curves": "~1.6.0", + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.7" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@scure/bip39": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz", + "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==", + "dependencies": { + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.8" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/abitype": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", + "integrity": "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", @@ -22782,6 +23166,21 @@ "node": ">= 8" } }, + "node_modules/webauthn-p256": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz", + "integrity": "sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0" + } + }, "node_modules/webcrypto-core": { "version": "1.7.7", "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.7.tgz", @@ -23313,6 +23712,14 @@ "url": "https://github.com/sponsors/holtwick" } }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", @@ -23325,9 +23732,126 @@ }, "dependencies": { "@adraffy/ens-normalize": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", + "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==" + }, + "@alchemy/aa-accounts": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@alchemy/aa-accounts/-/aa-accounts-3.19.0.tgz", + "integrity": "sha512-cdR8H9LveeUyBWFkmoqU7hZnFoqmdyPQDYZRtFr9aF+3zWAQYYJ/13Vz7aoVQ4lZ57+JQj7fN5vSVn2gFI47yA==", + "requires": { + "@alchemy/aa-core": "^3.18.2", + "viem": "2.8.6" + }, + "dependencies": { + "@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + }, + "@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "requires": { + "@noble/hashes": "1.3.2" + } + }, + "@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" + }, + "abitype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", + "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==" + }, + "isows": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", + "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==" + }, + "viem": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.8.6.tgz", + "integrity": "sha512-LqxLOSFtXfbC3tsiZ8Km8jKR4ktTOLfigL2dR9IN28He2+QrNhYvvwGPz3P4hbfU12Wvuxo6mWGZ2L1lpNtvrA==", + "requires": { + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@scure/bip32": "1.3.2", + "@scure/bip39": "1.2.1", + "abitype": "1.0.0", + "isows": "1.0.3", + "ws": "8.13.0" + } + } + } + }, + "@alchemy/aa-core": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@alchemy/aa-core/-/aa-core-3.19.0.tgz", + "integrity": "sha512-gVSesLsXORMuiA3w/w+4eQikzrikpj1XN2Sbrcik0v25AKH5QrHn0HddhyrN1aCFW2NoXjyhwxlySiTDVfTgxQ==", + "requires": { + "abitype": "^0.8.3", + "eventemitter3": "^5.0.1", + "viem": "2.8.6", + "zod": "^3.22.4" + }, + "dependencies": { + "@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + }, + "@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "requires": { + "@noble/hashes": "1.3.2" + } + }, + "@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" + }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "isows": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", + "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==" + }, + "viem": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.8.6.tgz", + "integrity": "sha512-LqxLOSFtXfbC3tsiZ8Km8jKR4ktTOLfigL2dR9IN28He2+QrNhYvvwGPz3P4hbfU12Wvuxo6mWGZ2L1lpNtvrA==", + "requires": { + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@scure/bip32": "1.3.2", + "@scure/bip39": "1.2.1", + "abitype": "1.0.0", + "isows": "1.0.3", + "ws": "8.13.0" + }, + "dependencies": { + "abitype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", + "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==" + } + } + } + } }, "@ampproject/remapping": { "version": "2.2.1", @@ -23769,12 +24293,13 @@ } }, "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "requires": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, @@ -23816,15 +24341,16 @@ } }, "@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, "requires": { - "@babel/types": "^7.24.7", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "dependencies": { "@jridgewell/trace-mapping": { @@ -23840,12 +24366,12 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" } }, "@babel/helper-compilation-targets": { @@ -23885,19 +24411,17 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", - "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "dependencies": { @@ -23928,90 +24452,81 @@ "@babel/types": "^7.24.7" } }, - "@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, "@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" } }, "@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true }, "@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/helper-split-export-declaration": { @@ -24024,21 +24539,19 @@ } }, "@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", - "dev": true + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" }, "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" }, "@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true }, "@babel/helpers": { @@ -24051,23 +24564,14 @@ "@babel/types": "^7.24.7" } }, - "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, + "@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "requires": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.26.0" } }, - "@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==" - }, "@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -24119,12 +24623,12 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", - "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", + "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-syntax-import-assertions": { @@ -24155,12 +24659,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -24227,12 +24731,12 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-arrow-functions": { @@ -24299,13 +24803,13 @@ } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", - "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", + "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-flow": "^7.25.9" } }, "@babel/plugin-transform-for-of": { @@ -24347,14 +24851,14 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" } }, "@babel/plugin-transform-object-super": { @@ -24436,52 +24940,55 @@ } }, "@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + } } }, "@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "dev": true, "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", - "dev": true, + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "requires": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" } }, "@bcoe/v8-coverage": { @@ -27022,17 +27529,17 @@ "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" }, "@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", "requires": { - "@noble/hashes": "1.3.2" + "@noble/hashes": "1.6.0" } }, "@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -27168,9 +27675,9 @@ "dev": true }, "@scure/base": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", - "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz", + "integrity": "sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==" }, "@scure/bip32": { "version": "1.3.2", @@ -27180,6 +27687,33 @@ "@noble/curves": "~1.2.0", "@noble/hashes": "~1.3.2", "@scure/base": "~1.1.2" + }, + "dependencies": { + "@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "requires": { + "@noble/hashes": "1.3.2" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" + } + } + }, + "@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==" + }, + "@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==" + } } }, "@scure/bip39": { @@ -27189,6 +27723,18 @@ "requires": { "@noble/hashes": "~1.3.0", "@scure/base": "~1.1.0" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==" + }, + "@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==" + } } }, "@sendgrid/client": { @@ -27956,9 +28502,12 @@ } }, "@types/node": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.2.tgz", - "integrity": "sha512-jJs9ErFLP403I+hMLGnqDRWT0RYKSvArxuBVh2veudHV7ifEC1WAmjJADacZ7mRbA2nWgHtn8xyECMAot0SkAw==" + "version": "18.19.67", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.67.tgz", + "integrity": "sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==", + "requires": { + "undici-types": "~5.26.4" + } }, "@types/node-fetch": { "version": "2.6.4", @@ -28378,9 +28927,9 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "abitype": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz", - "integrity": "sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==" + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.8.11.tgz", + "integrity": "sha512-bM4v2dKvX08sZ9IU38IN5BKmN+ZkOSd2oI4a9f0ejHYZQYV6cDr7j+d95ga0z2XHG36Y4jzoG5Z7qDqxp7fi/A==" }, "abort-controller": { "version": "3.0.0", @@ -28400,9 +28949,9 @@ } }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, "acorn-jsx": { "version": "5.3.2", @@ -28468,9 +29017,9 @@ "integrity": "sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==" }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -28704,11 +29253,11 @@ } }, "axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -29055,12 +29604,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browser-readablestream-to-it": { @@ -29069,15 +29618,15 @@ "integrity": "sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==" }, "browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" } }, "bs-logger": { @@ -29125,9 +29674,9 @@ "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" }, "bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", "optional": true, "requires": { "node-gyp-build": "^4.3.0" @@ -29206,9 +29755,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001637", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001637.tgz", - "integrity": "sha512-1x0qRI1mD1o9e+7mBI7XtzFAP4XszbHaVWsMiGbSPLYekKTJF7K+FNk6AsXH4sUpc+qrsI3pVgf1Jdl/uGkuSQ==", + "version": "1.0.30001684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", "dev": true }, "capital-case": { @@ -29349,9 +29898,9 @@ } }, "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -30257,9 +30806,9 @@ "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" }, "dset": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", - "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==" + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==" }, "duplexify": { "version": "4.1.2", @@ -30300,9 +30849,9 @@ } }, "electron-to-chromium": { - "version": "1.4.812", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.812.tgz", - "integrity": "sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==", + "version": "1.5.67", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.67.tgz", + "integrity": "sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==", "dev": true }, "emittery": { @@ -30450,9 +30999,9 @@ } }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" }, "escape-html": { "version": "1.0.3", @@ -30718,17 +31267,6 @@ "requires": { "ms": "^2.1.1" } - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } } } }, @@ -30793,17 +31331,6 @@ "esutils": "^2.0.2" } }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -30915,14 +31442,6 @@ "safe-regex": "^2.1.1", "semver": "^7.3.8", "strip-indent": "^3.0.0" - }, - "dependencies": { - "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true - } } }, "eslint-scope": { @@ -31209,9 +31728,9 @@ "integrity": "sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g==" }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -31353,9 +31872,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -31466,9 +31985,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==" + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" }, "for-each": { "version": "0.3.3", @@ -31573,9 +32092,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { "version": "1.1.5", @@ -32227,6 +32746,14 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, "hast-util-embedded": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", @@ -33311,11 +33838,11 @@ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "requires": { - "has": "^1.0.3" + "hasown": "^2.0.2" } }, "is-date-object": { @@ -33586,9 +34113,9 @@ "dev": true }, "isows": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", - "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==" }, "istanbul-lib-coverage": { "version": "3.2.2", @@ -34965,9 +35492,9 @@ } }, "jiti": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", - "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true }, "jmespath": { @@ -35081,9 +35608,9 @@ "dev": true }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true }, "json-bigint": { @@ -36296,12 +36823,12 @@ "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==" }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -36532,9 +37059,9 @@ "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" }, "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "requires": { "whatwg-url": "^5.0.0" }, @@ -36679,9 +37206,9 @@ } }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "nodemon": { @@ -37204,6 +37731,51 @@ "os-tmpdir": "^1.0.0" } }, + "ox": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.1.2.tgz", + "integrity": "sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==", + "requires": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "dependencies": { + "@scure/bip32": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.0.tgz", + "integrity": "sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==", + "requires": { + "@noble/curves": "~1.7.0", + "@noble/hashes": "~1.6.0", + "@scure/base": "~1.2.1" + } + }, + "@scure/bip39": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.0.tgz", + "integrity": "sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==", + "requires": { + "@noble/hashes": "~1.6.0", + "@scure/base": "~1.2.1" + } + }, + "abitype": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", + "integrity": "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==" + }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + } + } + }, "p-defer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", @@ -37492,19 +38064,19 @@ "dev": true }, "path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "requires": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "dependencies": { "lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, "minipass": { @@ -37593,9 +38165,9 @@ } }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -38332,9 +38904,9 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -38384,12 +38956,6 @@ "redis-errors": "^1.0.0" } }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, "regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", @@ -38754,12 +39320,13 @@ } }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { @@ -39577,8 +40144,7 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "swap-case": { "version": "2.0.2", @@ -39707,12 +40273,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -39901,9 +40461,9 @@ } }, "typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" }, "ua-parser-js": { "version": "1.0.35", @@ -39979,6 +40539,11 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -40133,13 +40698,13 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "upper-case": { @@ -40236,9 +40801,9 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" }, "v8-compile-cache-lib": { "version": "3.0.1", @@ -40349,18 +40914,68 @@ } }, "viem": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/viem/-/viem-1.21.1.tgz", - "integrity": "sha512-4Tb2f73FTGN+6PRPmgmKmlIfy/ENS4iU1KKfOPhUA37pZMmVw2rxN0QXMHB4OMa1ZVBlbpde1eG33vyj0L8YeQ==", - "requires": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@scure/bip32": "1.3.2", - "@scure/bip39": "1.2.1", - "abitype": "0.9.8", - "isows": "1.0.3", - "ws": "8.13.0" + "version": "2.21.52", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.52.tgz", + "integrity": "sha512-O53JhgVhp9CB0T3afy79O5ixNr8XXRGYQtlGYerzttnP56Oh2NBx4+Otz8IFd9N5DVPywf6tmYxHP1RVA99xJA==", + "requires": { + "@noble/curves": "1.6.0", + "@noble/hashes": "1.5.0", + "@scure/bip32": "1.5.0", + "@scure/bip39": "1.4.0", + "abitype": "1.0.6", + "isows": "1.0.6", + "ox": "0.1.2", + "webauthn-p256": "0.0.10", + "ws": "8.18.0" + }, + "dependencies": { + "@noble/curves": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "requires": { + "@noble/hashes": "1.5.0" + } + }, + "@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==" + }, + "@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==" + }, + "@scure/bip32": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz", + "integrity": "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==", + "requires": { + "@noble/curves": "~1.6.0", + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.7" + } + }, + "@scure/bip39": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz", + "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==", + "requires": { + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.8" + } + }, + "abitype": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", + "integrity": "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==" + }, + "ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==" + } } }, "w3c-keyname": { @@ -40397,6 +41012,15 @@ "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", "dev": true }, + "webauthn-p256": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz", + "integrity": "sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==", + "requires": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0" + } + }, "webcrypto-core": { "version": "1.7.7", "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.7.tgz", @@ -40799,6 +41423,11 @@ "entities": "^4.5.0" } }, + "zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==" + }, "zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index 48c9cbd1b..b3c629998 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,8 @@ "prepare": "husky install" }, "dependencies": { + "@alchemy/aa-accounts": "^3.19.0", + "@alchemy/aa-core": "^3.19.0", "@apollo/cache-control-types": "^1.0.2", "@apollo/datasource-rest": "^6.0.0", "@apollo/server": "^4.7.4", @@ -111,7 +113,7 @@ "typescript": "^5.0.4", "uuid": "^9.0.0", "validator": "^13.9.0", - "viem": "^1.21.1", + "viem": "^2.21.52", "winston": "^3.8.2", "xss": "^1.0.14" }, diff --git a/src/common/enums/notification.ts b/src/common/enums/notification.ts index 2e7132c51..0441bab5a 100644 --- a/src/common/enums/notification.ts +++ b/src/common/enums/notification.ts @@ -38,6 +38,7 @@ export enum NOTICE_TYPE { // transaction payment_received_donation = 'payment_received_donation', + withdrew_locked_tokens = 'withdrew_locked_tokens', // circle circle_invitation = 'circle_invitation', diff --git a/src/common/enums/payment.ts b/src/common/enums/payment.ts index 985410338..107ee6895 100644 --- a/src/common/enums/payment.ts +++ b/src/common/enums/payment.ts @@ -29,6 +29,7 @@ export enum TRANSACTION_PURPOSE { subscription = 'subscription', subscriptionSplit = 'subscription-split', dispute = 'dispute', + curationVaultWithdrawal = 'curation-vault-withdrawal', } export enum TRANSACTION_TARGET_TYPE { diff --git a/src/common/environment.ts b/src/common/environment.ts index 868de142f..9a2f01e0c 100644 --- a/src/common/environment.ts +++ b/src/common/environment.ts @@ -130,6 +130,8 @@ export const environment = { openseaAPIKey: process.env.MATTERS_OPENSEA_API_KEY || undefined, logbookClaimerPrivateKey: process.env.MATTERS_LOGBOOK_CLAIMER_PRIVATE_KEY || '', + curationVaultSignerPrivateKey: + process.env.MATTERS_CURATION_VAULT_SIGNER_PRIVATE_KEY || '', alchemyApiKey: process.env.MATTERS_ALCHEMY_API_KEY || '', exchangeRatesDataAPIKey: process.env.MATTERS_EXCHANGE_RATES_DATA_API_KEY || '', @@ -186,6 +188,9 @@ export const contract = { tokenAddress: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58'.toLowerCase(), tokenDecimals: 6, + // TODO: update to prod address + curationVaultAddress: + '0x891060263b8397cB3c69F01E3383e7f8838Fd8a8'.toLowerCase(), } : { curationAddress: @@ -194,5 +199,7 @@ export const contract = { tokenAddress: '0x5fd84259d66Cd46123540766Be93DFE6D43130D7'.toLowerCase(), tokenDecimals: 6, + curationVaultAddress: + '0x891060263b8397cB3c69F01E3383e7f8838Fd8a8'.toLowerCase(), }, } diff --git a/src/connectors/baseService.ts b/src/connectors/baseService.ts index 24a0404a3..ab4ebf593 100644 --- a/src/connectors/baseService.ts +++ b/src/connectors/baseService.ts @@ -211,7 +211,7 @@ export class BaseService { trx?: Knex.Transaction ): Promise => { const query = this.knex - .batchInsert(table || this.table, dataItems) + .batchInsert(table || this.table, dataItems as any) .returning('*') if (trx) { query.transacting(trx) diff --git a/src/connectors/blockchain/baseContract.ts b/src/connectors/blockchain/baseContract.ts index bed2da4b8..0b8321be9 100644 --- a/src/connectors/blockchain/baseContract.ts +++ b/src/connectors/blockchain/baseContract.ts @@ -34,7 +34,11 @@ export class BaseContract { transport: http(BLOCKCHAIN_RPC[chainId]), }) - this.contract = getContract({ abi, address, publicClient: this.client }) + this.contract = getContract({ + abi, + address, + client: { public: this.client }, + }) } public fetchBlockNumber = async (): Promise => diff --git a/src/connectors/blockchain/curation.ts b/src/connectors/blockchain/curation.ts index 1566ae87e..54edd3a25 100644 --- a/src/connectors/blockchain/curation.ts +++ b/src/connectors/blockchain/curation.ts @@ -80,11 +80,11 @@ export class CurationContract extends BaseContract { this.erc20TokenCurationEventTopic = encodeEventTopics({ abi: erc20TokenCurationEventABI, eventName: 'Curation', - }) + }) as Hex[] this.nativeTokenCurationEventTopic = encodeEventTopics({ abi: nativeTokenCurationEventABI, eventName: 'Curation', - }) + }) as Hex[] } public fetchLogs = async ( diff --git a/src/connectors/blockchain/curationVault.ts b/src/connectors/blockchain/curationVault.ts new file mode 100644 index 000000000..9492c4fbf --- /dev/null +++ b/src/connectors/blockchain/curationVault.ts @@ -0,0 +1,212 @@ +import { createMultiOwnerModularAccount } from '@alchemy/aa-accounts' +import { + LocalAccountSigner, + optimismSepolia, + HttpTransport, + optimism, + createSmartAccountClient, + SmartAccountSigner, +} from '@alchemy/aa-core' +import { + Address, + encodeFunctionData, + encodePacked, + parseSignature, + keccak256, + http, +} from 'viem' + +import { BLOCKCHAIN_RPC, MINUTE } from 'common/enums' +import { isProd } from 'common/environment' +import { environment, contract } from 'common/environment' + +const CURATION_VAULT_ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'from', + type: 'address', + }, + { + indexed: true, + internalType: 'string', + name: 'uid', + type: 'string', + }, + { + indexed: true, + internalType: 'contract IERC20', + name: 'token', + type: 'address', + }, + { + indexed: false, + internalType: 'string', + name: 'uri', + type: 'string', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'Curation', + type: 'event', + }, + { + inputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'erc20Balances', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'to_', + type: 'address', + }, + { + internalType: 'string', + name: 'uid_', + type: 'string', + }, + { + internalType: 'contract IERC20', + name: 'token_', + type: 'address', + }, + { + internalType: 'uint256', + name: 'expiredAt_', + type: 'uint256', + }, + { + internalType: 'uint8', + name: 'v_', + type: 'uint8', + }, + { + internalType: 'bytes32', + name: 'r_', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 's_', + type: 'bytes32', + }, + ], + name: 'withdraw', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const + +export class CurationVaultContract { + public address: Address + public signer: SmartAccountSigner + + public constructor() { + this.address = contract.Optimism.curationVaultAddress as `0x${string}` + this.signer = LocalAccountSigner.privateKeyToAccountSigner( + environment.curationVaultSignerPrivateKey as `0x${string}` + ) + } + + public async getClient() { + const rpcTransport = http( + BLOCKCHAIN_RPC[isProd ? optimism.id : optimismSepolia.id] + ) as HttpTransport + + return createSmartAccountClient({ + transport: rpcTransport, + chain: isProd ? optimism : optimismSepolia, + account: await createMultiOwnerModularAccount({ + transport: rpcTransport, + chain: isProd ? optimism : optimismSepolia, + signer: this.signer, + }), + }) + } + + public toUID(userId: string) { + return `matters:${userId}` + } + + public parseUID(uid: string) { + if (!uid.startsWith('matters:')) { + throw new Error('Invalid UID') + } + return uid.split(':')[1] + } + + public async getWithdrawableUSDTAmount(userId: string) { + const client = await this.getClient() + const uid = this.toUID(userId) + return client.readContract({ + address: this.address, + abi: CURATION_VAULT_ABI, + functionName: 'erc20Balances', + args: [uid, contract.Optimism.tokenAddress as `0x${string}`], + }) + } + + public async withdraw(userId: string) { + const client = await this.getClient() + const uid = this.toUID(userId) + const expiry = BigInt(Math.floor(Date.now() / 1000) + MINUTE * 3) // 3 mins + const signerAddress = await this.signer.getAddress() + const hash = keccak256( + encodePacked( + ['address', 'string', 'uint256', 'address'], + [signerAddress, uid, expiry, this.address] + ) + ) + const signature = await this.signer.signMessage({ raw: hash }) + const { v, r, s } = parseSignature(signature) + + return client.sendUserOperation({ + uo: { + target: this.address, + data: encodeFunctionData({ + abi: CURATION_VAULT_ABI, + functionName: 'withdraw', + args: [ + signerAddress, + uid, + contract.Optimism.tokenAddress as `0x${string}`, + expiry, + Number(v), + r, + s, + ], + }), + }, + }) + } +} diff --git a/src/connectors/userService.ts b/src/connectors/userService.ts index e710ba96b..9092847dd 100644 --- a/src/connectors/userService.ts +++ b/src/connectors/userService.ts @@ -2222,9 +2222,9 @@ export class UserService extends BaseService { if (isSmartContract) { // verify the message for a decentralized account (contract wallet) const contractWallet = getContract({ - publicClient: client, abi: IERC1271, address: ethAddress, + client: { public: client }, }) const verification = await contractWallet.read.isValidSignature([ diff --git a/src/definitions/notification.d.ts b/src/definitions/notification.d.ts index e110b857d..3dd135566 100644 --- a/src/definitions/notification.d.ts +++ b/src/definitions/notification.d.ts @@ -246,6 +246,13 @@ interface NoticePaymentReceivedDonationParams entities: [NotificationEntity<'target', 'transaction'>] } +interface NoticeWithdrewLockedTokensParams extends NotificationRequiredParams { + event: NOTICE_TYPE.withdrew_locked_tokens + recipientId: string + actorId: string | null + entities: [NotificationEntity<'target', 'transaction'>] +} + /** * Circle */ @@ -415,6 +422,7 @@ export type NotificationParams = | NoticeCampaignArticleFeaturedParams // Payment | NoticePaymentReceivedDonationParams + | NoticeWithdrewLockedTokensParams // Circle | NoticeCircleInvitationParams | NoticeCircleNewSubscriberParams diff --git a/src/mutations/user/claimLogbooks.ts b/src/mutations/user/claimLogbooks.ts index 320123103..9a18eb6d7 100644 --- a/src/mutations/user/claimLogbooks.ts +++ b/src/mutations/user/claimLogbooks.ts @@ -101,10 +101,12 @@ const resolver: GQLMutationResolvers['claimLogbooks'] = async ( transport: http(), }) const logbookContract = getContract({ - publicClient: client, abi, address: contract.Polygon.logbookAddress as Address, - walletClient, + client: { + public: client, + wallet: walletClient, + }, }) const unclaimedTokenIds = [] diff --git a/src/mutations/user/index.ts b/src/mutations/user/index.ts index 8767f29ca..85178a824 100644 --- a/src/mutations/user/index.ts +++ b/src/mutations/user/index.ts @@ -32,6 +32,7 @@ import updateUserState from './updateUserState' import userLogout from './userLogout' import verifyEmail from './verifyEmail' import { walletLogin, addWalletLogin, removeWalletLogin } from './walletLogin' +import withdrawLockedTokens from './withdrawLockedTokens' export default { Mutation: { @@ -66,6 +67,7 @@ export default { payTo, payout, connectStripeAccount, + withdrawLockedTokens, toggleUsersBadge, unbindLikerId, claimLogbooks, diff --git a/src/mutations/user/withdrawLockedTokens.ts b/src/mutations/user/withdrawLockedTokens.ts new file mode 100644 index 000000000..209f1072b --- /dev/null +++ b/src/mutations/user/withdrawLockedTokens.ts @@ -0,0 +1,106 @@ +import type { GQLMutationResolvers, Transaction } from 'definitions' + +import { + NOTICE_TYPE, + PAYMENT_CURRENCY, + PAYMENT_PROVIDER, + TRANSACTION_PURPOSE, + TRANSACTION_STATE, + USER_STATE, +} from 'common/enums' +import { + ForbiddenByStateError, + ForbiddenError, + ServerError, +} from 'common/errors' +import { CurationVaultContract } from 'connectors/blockchain/curationVault' + +const resolver: GQLMutationResolvers['withdrawLockedTokens'] = async ( + _, + __, + { viewer, dataSources: { atomService, notificationService, paymentService } } +) => { + // check user + if (!viewer.userName) { + throw new ForbiddenError('user has no username') + } + + if ( + [USER_STATE.archived, USER_STATE.frozen, USER_STATE.banned].includes( + viewer.state + ) + ) { + throw new ForbiddenByStateError(`${viewer.state} user has no permission`) + } + + // skip if there is a pending withdrawal transaction + const tx = await atomService.findFirst({ + table: 'transaction', + where: { + senderId: null, + recipientId: viewer.id, + purpose: TRANSACTION_PURPOSE.curationVaultWithdrawal, + state: TRANSACTION_STATE.pending, + }, + }) + if (tx) { + throw new ForbiddenError('pending withdrawal transaction') + } + + const contract = new CurationVaultContract() + const client = await contract.getClient() + + // check withdraw amount + const amount = await contract.getWithdrawableUSDTAmount(viewer.id) + if (amount <= 0) { + throw new ForbiddenError('no withdrawable amount') + } + + let transaction: Transaction | null = null + try { + // submit transaction + const result = await contract.withdraw(viewer.id) + + // create transaction + transaction = await paymentService.createTransaction({ + state: TRANSACTION_STATE.pending, + currency: PAYMENT_CURRENCY.USDT, + purpose: TRANSACTION_PURPOSE.curationVaultWithdrawal, + provider: PAYMENT_PROVIDER.blockchain, + providerTxId: result.hash, + amount: Number(amount), + recipientId: viewer.id, + }) + + await client.waitForUserOperationTransaction(result) + + // mark as succeeded + await paymentService.markTransactionStateAs({ + id: transaction.id, + state: TRANSACTION_STATE.succeeded, + }) + + // notify + await notificationService.trigger({ + event: NOTICE_TYPE.withdrew_locked_tokens, + actorId: null, + recipientId: viewer.id, + entities: [ + { type: 'target', entityTable: 'transaction', entity: transaction }, + ], + }) + } catch (error) { + if (transaction) { + await paymentService.markTransactionStateAs({ + id: transaction.id, + state: TRANSACTION_STATE.failed, + }) + } + + throw new ServerError('failed to withdraw locked tokens') + } + + return { transaction } +} + +export default resolver diff --git a/src/queries/notice/index.ts b/src/queries/notice/index.ts index 526b9ca43..2799d87e5 100644 --- a/src/queries/notice/index.ts +++ b/src/queries/notice/index.ts @@ -95,6 +95,7 @@ const notice: { // transaction payment_received_donation: NOTICE_TYPE.TransactionNotice, + withdrew_locked_tokens: NOTICE_TYPE.TransactionNotice, // circle circle_invitation: NOTICE_TYPE.CircleNotice, @@ -307,6 +308,8 @@ const notice: { switch (type) { case INNER_NOTICE_TYPE.payment_received_donation: return 'PaymentReceivedDonation' + case INNER_NOTICE_TYPE.withdrew_locked_tokens: + return 'WithdrewLockedTokens' } throw new ServerError(`Unknown TransactionNotice type: ${type}`) }, From 71252516175066887e7d11309ac7b463bc58d78e Mon Sep 17 00:00:00 2001 From: gitwoz <177856586+gitwoz@users.noreply.github.com> Date: Tue, 3 Dec 2024 15:36:05 +0700 Subject: [PATCH 03/10] feat(donation): support sync and confirm curation from vault contract --- src/common/environment.ts | 2 + src/common/utils/IERC1271.ts | 26 -- src/common/utils/index.ts | 1 - .../__test__/curationContract.test.ts | 12 +- src/connectors/blockchain/baseContract.ts | 15 +- src/connectors/blockchain/curation.ts | 16 +- src/connectors/blockchain/curationVault.ts | 223 +++++++++++++++++- .../queue/__test__/payToByBlockchain.test.ts | 3 +- src/connectors/queue/payTo/blockchain.ts | 128 ++++++---- src/connectors/userService.ts | 28 ++- src/mutations/user/payTo.ts | 5 +- 11 files changed, 346 insertions(+), 113 deletions(-) delete mode 100644 src/common/utils/IERC1271.ts diff --git a/src/common/environment.ts b/src/common/environment.ts index 9a2f01e0c..786a59d97 100644 --- a/src/common/environment.ts +++ b/src/common/environment.ts @@ -191,6 +191,7 @@ export const contract = { // TODO: update to prod address curationVaultAddress: '0x891060263b8397cB3c69F01E3383e7f8838Fd8a8'.toLowerCase(), + curationVaultBlockNum: '20457192', } : { curationAddress: @@ -201,5 +202,6 @@ export const contract = { tokenDecimals: 6, curationVaultAddress: '0x891060263b8397cB3c69F01E3383e7f8838Fd8a8'.toLowerCase(), + curationVaultBlockNum: '20457192', }, } diff --git a/src/common/utils/IERC1271.ts b/src/common/utils/IERC1271.ts deleted file mode 100644 index be61c0596..000000000 --- a/src/common/utils/IERC1271.ts +++ /dev/null @@ -1,26 +0,0 @@ -export const IERC1271 = [ - { - inputs: [ - { - internalType: 'bytes32', - name: 'hash', - type: 'bytes32', - }, - { - internalType: 'bytes', - name: 'signature', - type: 'bytes', - }, - ], - name: 'isValidSignature', - outputs: [ - { - internalType: 'bytes4', - name: 'magicValue', - type: 'bytes4', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const diff --git a/src/common/utils/index.ts b/src/common/utils/index.ts index d3679e0e3..9244ef5b7 100644 --- a/src/common/utils/index.ts +++ b/src/common/utils/index.ts @@ -20,7 +20,6 @@ export * from './payment' export * from './text' export * from './time' export * from './ipfs' -export * from './IERC1271' export * from './genDisplayName' export * from './counter' export * from './verify' diff --git a/src/connectors/__test__/curationContract.test.ts b/src/connectors/__test__/curationContract.test.ts index 19b581c1c..a56b59eb4 100644 --- a/src/connectors/__test__/curationContract.test.ts +++ b/src/connectors/__test__/curationContract.test.ts @@ -1,15 +1,11 @@ import { optimismSepolia } from 'viem/chains' import { CurationContract } from 'connectors/blockchain' -import { contract } from 'common/environment' import { BLOCKCHAIN, BLOCKCHAIN_CHAINID } from 'common/enums' describe('curationContract', () => { test('compute topics correctly', async () => { - const curation = new CurationContract( - optimismSepolia.id.toString(), - contract.Optimism.curationAddress - ) + const curation = new CurationContract(optimismSepolia.id.toString()) expect(curation.erc20TokenCurationEventTopic[0]).toBe( '0xc2e41b3d49bbccbac6ceb142bad6119608adf4f1ee1ca5cc6fc332e0ca2fc602' ) @@ -20,8 +16,7 @@ describe('curationContract', () => { test.skip('fetchLogs correctly', async () => { jest.setTimeout(0) const curation = new CurationContract( - BLOCKCHAIN_CHAINID[BLOCKCHAIN.Optimism], - contract.Optimism.curationAddress + BLOCKCHAIN_CHAINID[BLOCKCHAIN.Optimism] ) const logs = await curation.fetchLogs(BigInt(28675517), BigInt(28797000)) console.log(logs) @@ -29,8 +24,7 @@ describe('curationContract', () => { test.skip('fetchTxReceipt correctly', async () => { jest.setTimeout(0) const curation = new CurationContract( - BLOCKCHAIN_CHAINID[BLOCKCHAIN.Optimism], - contract.Optimism.curationAddress + BLOCKCHAIN_CHAINID[BLOCKCHAIN.Optimism] ) const erc20Receipt = await curation.fetchTxReceipt( '0x1764d50fb01e04350248f6a4e30dff3839880f50af26de3e0b78657a46c4118f' diff --git a/src/connectors/blockchain/baseContract.ts b/src/connectors/blockchain/baseContract.ts index 0b8321be9..0016a65f2 100644 --- a/src/connectors/blockchain/baseContract.ts +++ b/src/connectors/blockchain/baseContract.ts @@ -1,10 +1,8 @@ import { - Abi, Address, PublicClient, createPublicClient, extractChain, - getContract, http, } from 'viem' import * as chains from 'viem/chains' @@ -14,15 +12,14 @@ import { BLOCKCHAIN_RPC } from 'common/enums' export class BaseContract { public chainId: string public address: Address - public abi: Abi + public blockNum: string protected client: PublicClient - protected contract: ReturnType - public constructor(chainId: string, address: Address, abi: Abi) { + public constructor(chainId: string, address: Address, blockNum: string) { this.chainId = chainId this.address = address - this.abi = abi + this.blockNum = blockNum const chain = extractChain({ chains: Object.values(chains), @@ -33,12 +30,6 @@ export class BaseContract { chain, transport: http(BLOCKCHAIN_RPC[chainId]), }) - - this.contract = getContract({ - abi, - address, - client: { public: this.client }, - }) } public fetchBlockNumber = async (): Promise => diff --git a/src/connectors/blockchain/curation.ts b/src/connectors/blockchain/curation.ts index 54edd3a25..234275970 100644 --- a/src/connectors/blockchain/curation.ts +++ b/src/connectors/blockchain/curation.ts @@ -2,10 +2,12 @@ import type { Address, Hash, Hex } from 'viem' import { decodeEventLog, encodeEventTopics, parseAbiItem } from 'viem' +import { BLOCKCHAIN_CHAINNAME } from 'common/enums' +import { contract } from 'common/environment' + import { BaseContract } from './baseContract' // type - export interface CurationEvent { curatorAddress: string creatorAddress: string @@ -75,8 +77,16 @@ export class CurationContract extends BaseContract { public erc20TokenCurationEventTopic: Hex[] public nativeTokenCurationEventTopic: Hex[] - public constructor(chainId: string, contractAddress: string) { - super(chainId, contractAddress as Address, CURATION_ABI) + public constructor(chainId: string) { + const contractAddress = contract[BLOCKCHAIN_CHAINNAME[chainId]] + .curationAddress as Address + + super( + chainId, + contractAddress, + contract[BLOCKCHAIN_CHAINNAME[chainId]].curationBlockNum + ) + this.erc20TokenCurationEventTopic = encodeEventTopics({ abi: erc20TokenCurationEventABI, eventName: 'Curation', diff --git a/src/connectors/blockchain/curationVault.ts b/src/connectors/blockchain/curationVault.ts index 9492c4fbf..036231875 100644 --- a/src/connectors/blockchain/curationVault.ts +++ b/src/connectors/blockchain/curationVault.ts @@ -14,12 +14,51 @@ import { parseSignature, keccak256, http, + Hex, + encodeEventTopics, + parseAbiItem, + decodeEventLog, + Hash, } from 'viem' -import { BLOCKCHAIN_RPC, MINUTE } from 'common/enums' +import { + BLOCKCHAIN, + BLOCKCHAIN_CHAINID, + BLOCKCHAIN_RPC, + MINUTE, +} from 'common/enums' import { isProd } from 'common/environment' import { environment, contract } from 'common/environment' +import { BaseContract } from './baseContract' + +// type +export interface CurationVaultEvent { + curatorAddress: string + creatorId: string | null + uri: string + tokenAddress: string | null + amount: string +} + +export interface Log { + event: T + txHash: string + address: string + blockNumber: number + removed: boolean +} + +export interface CurationVaultTxReceipt { + events: CurationVaultEvent[] + txHash: string + reverted: boolean + from: Address + to: Address | null + blockNumber: number +} + +// constants const CURATION_VAULT_ABI = [ { anonymous: false, @@ -127,21 +166,184 @@ const CURATION_VAULT_ABI = [ }, ] as const -export class CurationVaultContract { - public address: Address +const erc20TokenCurationEventSignature = + 'event Curation(address indexed curator, string indexed uid, address indexed token, string uri, uint256 amount)' as const +const erc20TokenCurationEventABI = [ + { + name: 'Curation', + type: 'event', + inputs: [ + { type: 'address', indexed: true, name: 'curator' }, + { type: 'string', indexed: true, name: 'uid' }, + { type: 'address', indexed: true, name: 'token' }, + { type: 'string', name: 'uri' }, + { type: 'uint256', name: 'amount' }, + ], + }, +] as const +const nativeTokenCurationEventSignature = + 'event Curation(address indexed from, string indexed uid, string uri, uint256 amount)' as const +const nativeTokenCurationEventABI = [ + { + name: 'Curation', + type: 'event', + inputs: [ + { type: 'address', indexed: true, name: 'from' }, + { type: 'string', indexed: true, name: 'uid' }, + { type: 'string', name: 'uri' }, + { type: 'uint256', name: 'amount' }, + ], + }, +] as const + +const CURATION_EVENT_ABI = [ + ...erc20TokenCurationEventABI, + ...nativeTokenCurationEventABI, +] as const + +export class CurationVaultContract extends BaseContract { public signer: SmartAccountSigner + public erc20TokenCurationEventTopic: Hex[] + public nativeTokenCurationEventTopic: Hex[] + public constructor() { - this.address = contract.Optimism.curationVaultAddress as `0x${string}` + // support OP only + const chainId = BLOCKCHAIN_CHAINID[BLOCKCHAIN.Optimism] + const contractAddress = contract.Optimism.curationVaultAddress as Address + + super(chainId, contractAddress, contract.Optimism.curationVaultBlockNum) + this.signer = LocalAccountSigner.privateKeyToAccountSigner( environment.curationVaultSignerPrivateKey as `0x${string}` ) + this.erc20TokenCurationEventTopic = encodeEventTopics({ + abi: erc20TokenCurationEventABI, + eventName: 'Curation', + }) as Hex[] + this.nativeTokenCurationEventTopic = encodeEventTopics({ + abi: nativeTokenCurationEventABI, + eventName: 'Curation', + }) as Hex[] + } + + public fetchLogs = async ( + fromBlock: bigint, + toBlock: bigint + ): Promise>> => { + const [erc20Logs, nativeLogs] = await Promise.all([ + this.client.getFilterLogs({ + filter: await this.client.createEventFilter({ + event: parseAbiItem(erc20TokenCurationEventSignature), + fromBlock: BigInt(fromBlock), + toBlock: BigInt(toBlock), + }), + }), + this.client.getFilterLogs({ + filter: await this.client.createEventFilter({ + event: parseAbiItem(nativeTokenCurationEventSignature), + fromBlock: BigInt(fromBlock), + toBlock: BigInt(toBlock), + }), + }), + ]) + + // parse erc20logs and add result to logs + const logs: Array> = [] + ;[...erc20Logs, ...nativeLogs].forEach((log) => { + const { args: logArgs } = decodeEventLog({ + abi: CURATION_EVENT_ABI, + data: log.data, + topics: log.topics as [signature: `0x${string}`, ...hex: Hex[]], + }) + const baseLog = { + txHash: log.transactionHash, + address: this.address, + blockNumber: Number(log.blockNumber), + removed: log.removed, + } + + // ERC20 + if ('curator' in logArgs) { + logs.push({ + event: { + curatorAddress: logArgs.curator.toLowerCase(), + creatorId: this.parseUID(logArgs.uid), + uri: logArgs.uri, + tokenAddress: logArgs.token.toLowerCase(), + amount: logArgs.amount.toString(), + }, + ...baseLog, + }) + } + // native + else { + logs.push({ + event: { + curatorAddress: logArgs.from.toLowerCase(), + creatorId: this.parseUID(logArgs.uid), + uri: logArgs.uri, + tokenAddress: null, + amount: logArgs.amount.toString(), + }, + ...baseLog, + }) + } + }) + + return logs + } + + public fetchTxReceipt = async ( + txHash: Hash + ): Promise => { + const txReceipt = await this.client.getTransactionReceipt({ hash: txHash }) + if (!txReceipt) { + return null + } + const targets = txReceipt.logs.filter( + (log) => + log.address.toLowerCase() === this.address.toLowerCase() && + (log.topics[0] === this.erc20TokenCurationEventTopic[0] || + log.topics[0] === this.nativeTokenCurationEventTopic[0]) + ) + + return { + txHash, + reverted: txReceipt.status === 'reverted', + from: txReceipt.from, + to: txReceipt.to, + blockNumber: Number(txReceipt.blockNumber), + events: targets + .map((log) => + decodeEventLog({ + abi: CURATION_EVENT_ABI, + data: log.data, + topics: log.topics as [signature: `0x${string}`, ...hex: Hex[]], + }) + ) + .map((e) => { + const log = e.args + const isERC20 = 'curator' in log + const curatorAddress = ( + isERC20 ? log.curator : log.from + ).toLowerCase() + const tokenAddress = isERC20 ? log.token.toLowerCase() : null + const uid = this.parseUID(log.uid) + + return { + curatorAddress, + creatorId: uid, + uri: log?.uri, + tokenAddress, + amount: log?.amount?.toString(), + } + }), + } } public async getClient() { - const rpcTransport = http( - BLOCKCHAIN_RPC[isProd ? optimism.id : optimismSepolia.id] - ) as HttpTransport + const rpcTransport = http(BLOCKCHAIN_RPC[this.chainId]) as HttpTransport return createSmartAccountClient({ transport: rpcTransport, @@ -159,10 +361,11 @@ export class CurationVaultContract { } public parseUID(uid: string) { - if (!uid.startsWith('matters:')) { - throw new Error('Invalid UID') + const match = uid.match(/^matters:(\d+)$/) + if (!match) { + return null } - return uid.split(':')[1] + return match[1] } public async getWithdrawableUSDTAmount(userId: string) { diff --git a/src/connectors/queue/__test__/payToByBlockchain.test.ts b/src/connectors/queue/__test__/payToByBlockchain.test.ts index c3ca68673..521b551bd 100644 --- a/src/connectors/queue/__test__/payToByBlockchain.test.ts +++ b/src/connectors/queue/__test__/payToByBlockchain.test.ts @@ -423,8 +423,7 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { ) }) test('fetch logs', async () => { - const contractAddress = contract.Optimism.curationAddress - const curation = new CurationContract(chainId, contractAddress) + const curation = new CurationContract(chainId) const oldSavepoint1 = BigInt(20000000) mockFetchLogs.mockClear() diff --git a/src/connectors/queue/payTo/blockchain.ts b/src/connectors/queue/payTo/blockchain.ts index 01dc9533b..7f04f6985 100644 --- a/src/connectors/queue/payTo/blockchain.ts +++ b/src/connectors/queue/payTo/blockchain.ts @@ -11,7 +11,6 @@ import _capitalize from 'lodash/capitalize' import { formatUnits, parseUnits } from 'viem' import { - BLOCKCHAIN, BLOCKCHAIN_CHAINID, BLOCKCHAIN_CHAINNAME, BLOCKCHAIN_SAFE_CONFIRMS, @@ -39,6 +38,10 @@ import { ArticleService, } from 'connectors' import { CurationContract, CurationEvent, Log } from 'connectors/blockchain' +import { + CurationVaultContract, + CurationVaultEvent, +} from 'connectors/blockchain/curationVault' import SlackService from 'connectors/slack' import { getOrCreateQueue } from '../utils' @@ -163,7 +166,10 @@ export class PayToByBlockchainQueue { const atomService = new AtomService(this.connections) // skip if tx is not found - const tx = await paymentService.baseFindById(txId) + const tx = await atomService.findUnique({ + table: 'transaction', + where: { id: txId }, + }) if (!tx) { job.discard() throw new PaymentQueueJobDataError('pay-to pending tx not found') @@ -185,12 +191,19 @@ export class PayToByBlockchainQueue { } const chain = BLOCKCHAIN_CHAINNAME[blockchainTx.chainId] - const contractAddress = contract[chain].curationAddress - const curation = new CurationContract( - BLOCKCHAIN_CHAINID[chain], - contractAddress - ) - const txReceipt = await curation.fetchTxReceipt(blockchainTx.txHash) + const curation = new CurationContract(BLOCKCHAIN_CHAINID[chain]) + const curationVault = new CurationVaultContract() + + // vault contract only for recipient w/o ETH address + const recipient = await atomService.findUnique({ + table: 'user', + where: { id: tx.recipientId }, + }) + const isVaultCuration = !recipient.ethAddress + const txReceipt = await (isVaultCuration + ? curationVault + : curation + ).fetchTxReceipt(blockchainTx.txHash) // update metadata blockchain tx if (txReceipt) { @@ -198,8 +211,8 @@ export class PayToByBlockchainQueue { table: 'blockchain_transaction', where: { id: blockchainTx.id }, data: { - from: txReceipt.from, - to: txReceipt.to, + from: txReceipt.from, // curator address + to: txReceipt.to, // contract address blockNumber: txReceipt.blockNumber.toString(), }, }) @@ -219,9 +232,11 @@ export class PayToByBlockchainQueue { return data } - const [recipient, sender, article] = await Promise.all([ - userService.baseFindById(tx.recipientId), - userService.baseFindById(tx.senderId as string), + const [sender, article] = await Promise.all([ + atomService.findUnique({ + table: 'user', + where: { id: tx.senderId as string }, + }), atomService.findFirst({ table: 'article', where: { id: tx.targetId }, @@ -287,21 +302,15 @@ export class PayToByBlockchainQueue { * 1. Fetch and save curation events from blockchain; * 2. Correct or create tx if needed; */ - private handleSyncCurationEvents: ProcessCallbackFunction = async ( - _ - ) => { - let syncedBlockNum: { [key: string]: number } = {} - - ;[BLOCKCHAIN.Polygon, BLOCKCHAIN.Optimism].forEach(async (chain) => { - // FIXME: pause support for the Polygon testnet - // @see {src/common/enums/payment.ts:L59} - if (chain === BLOCKCHAIN.Polygon && !isProd) { - return - } + private handleSyncCurationEvents: ProcessCallbackFunction = + async () => { + const chain = BLOCKCHAIN_CHAINNAME.Optimism + const curation = new CurationContract(BLOCKCHAIN_CHAINID[chain]) + const curationVault = new CurationVaultContract() + // sync from curation contract try { - const blockNum = await this._handleSyncCurationEvents(chain) - syncedBlockNum = { ...syncedBlockNum, [chain]: blockNum } + await this._handleSyncCurationEvents(chain, curation) } catch (error) { this.slackService.sendQueueMessage({ data: { error }, @@ -311,25 +320,36 @@ export class PayToByBlockchainQueue { }) throw error } - }) - return syncedBlockNum - } + // sync from curation vault contract + try { + await this._handleSyncCurationEvents(chain, curationVault) + } catch (error) { + this.slackService.sendQueueMessage({ + data: { error }, + title: `${QUEUE_NAME.payToByBlockchain}:${QUEUE_JOB.syncCurationEvents}`, + message: `'Failed to sync ${chain} curation vault events`, + state: SLACK_MESSAGE_STATE.failed, + }) + throw error + } + } - private _handleSyncCurationEvents = async (chain: GQLChain) => { + private _handleSyncCurationEvents = async ( + chain: GQLChain, + curation: CurationContract | CurationVaultContract + ) => { const atomService = new AtomService(this.connections) const chainId = BLOCKCHAIN_CHAINID[chain] // fetch events - const contractAddress = contract[chain].curationAddress - const curation = new CurationContract(chainId, contractAddress) const record = await atomService.findFirst({ table: 'blockchain_sync_record', - where: { chainId, contractAddress }, + where: { chainId, contractAddress: curation.address }, }) const oldSavepoint = record ? BigInt(parseInt(record.blockNumber, 10)) - : BigInt(parseInt(contract[chain].curationBlockNum, 10) || 0) + : BigInt(parseInt(curation.blockNum, 10) || 0) const [logs, newSavepoint] = await this.fetchCurationLogs( curation, oldSavepoint @@ -341,15 +361,15 @@ export class PayToByBlockchainQueue { // save progress await atomService.upsert({ table: 'blockchain_sync_record', - where: { chainId, contractAddress }, + where: { chainId, contractAddress: curation.address }, update: { chainId, - contractAddress, + contractAddress: curation.address, blockNumber: newSavepoint.toString(), }, create: { chainId, - contractAddress, + contractAddress: curation.address, blockNumber: newSavepoint.toString(), }, }) @@ -358,7 +378,7 @@ export class PayToByBlockchainQueue { } private _handleNewEvent = async ( - event: CurationEvent, + event: CurationEvent | CurationVaultEvent, chain: GQLChain, blockchainTx: { id: string @@ -395,7 +415,15 @@ export class PayToByBlockchainQueue { } // skip if recipient or article is not found - const creatorUser = await userService.findByEthAddress(event.creatorAddress) + const creatorUser = + 'creatorAddress' in event // from curation contract + ? await userService.findByEthAddress(event.creatorAddress) + : 'creatorId' in event && event.creatorId // from curation vault contract + ? await atomService.findUnique({ + table: 'user', + where: { id: event.creatorId }, + }) + : undefined if (!creatorUser) { return } @@ -559,9 +587,9 @@ export class PayToByBlockchainQueue { } private fetchCurationLogs = async ( - curation: CurationContract, + curation: CurationContract | CurationVaultContract, savepoint: bigint - ): Promise<[Array>, bigint]> => { + ): Promise<[Array>, bigint]> => { const safeBlockNum = BigInt(await curation.fetchBlockNumber()) - BigInt(BLOCKCHAIN_SAFE_CONFIRMS[BLOCKCHAIN_CHAINNAME[curation.chainId]]) @@ -575,7 +603,7 @@ export class PayToByBlockchainQueue { } private _syncCurationEvents = async ( - logs: Array>, + logs: Array>, chain: GQLChain ) => { const paymentService = new PaymentService(this.connections) @@ -584,25 +612,29 @@ export class PayToByBlockchainQueue { const atomService = new AtomService(this.connections) const chainId = BLOCKCHAIN_CHAINID[chain] - const contractAddress = contract[chain].curationAddress - const curation = new CurationContract(chainId, contractAddress) + const curation = new CurationContract(chainId) + const curationVault = new CurationVaultContract() // save events to `blockchain_curation_event` - const events: any[] = [] + const events: Array = [] for (const log of logs) { // skip if event is removed if (log.removed) { continue } - const data: any = { ...log.event } + const isCurationVaultEvent = 'creatorId' in log.event + const data: (CurationEvent | CurationVaultEvent) & { + blockchainTransactionId?: string + contractAddress?: string + } = { ...log.event } const blockchainTx = await paymentService.findOrCreateBlockchainTransaction( { chainId, txHash: log.txHash }, { state: BLOCKCHAIN_TRANSACTION_STATE.succeeded, from: log.event.curatorAddress, - to: curation.address, + to: isCurationVaultEvent ? curationVault.address : curation.address, blockNumber: log.blockNumber, } ) @@ -685,7 +717,7 @@ export class PayToByBlockchainQueue { } private containMatchedEvent = async ( - events: CurationEvent[], + events: CurationEvent[] | CurationVaultEvent[], { cids, tokenAddress, diff --git a/src/connectors/userService.ts b/src/connectors/userService.ts index 9092847dd..843e951a4 100644 --- a/src/connectors/userService.ts +++ b/src/connectors/userService.ts @@ -104,7 +104,6 @@ import { isValidPassword, makeUserName, getPunishExpiredDate, - IERC1271, genDisplayName, RatelimitCounter, normalizeSearchKey, @@ -2220,6 +2219,33 @@ export class UserService extends BaseService { const bytecode = await client.getBytecode({ address: ethAddress }) const isSmartContract = bytecode && trim(bytecode) !== '0x' if (isSmartContract) { + const IERC1271 = [ + { + inputs: [ + { + internalType: 'bytes32', + name: 'hash', + type: 'bytes32', + }, + { + internalType: 'bytes', + name: 'signature', + type: 'bytes', + }, + ], + name: 'isValidSignature', + outputs: [ + { + internalType: 'bytes4', + name: 'magicValue', + type: 'bytes4', + }, + ], + stateMutability: 'view', + type: 'function', + }, + ] as const + // verify the message for a decentralized account (contract wallet) const contractWallet = getContract({ abi: IERC1271, diff --git a/src/mutations/user/payTo.ts b/src/mutations/user/payTo.ts index b26b2bacd..02399f6a8 100644 --- a/src/mutations/user/payTo.ts +++ b/src/mutations/user/payTo.ts @@ -83,7 +83,10 @@ const resolver: GQLMutationResolvers['payTo'] = async ( const services = { Article: articleService } const targetService = services[targetType] const [recipient, target] = await Promise.all([ - userService.baseFindById(recipientDbId), + atomService.findUnique({ + table: 'user', + where: { id: recipientDbId }, + }), targetService ? targetService.baseFindById(targetDbId) : undefined, ]) From e4b43a9a6a870ddd94a2a02a918034267976126c Mon Sep 17 00:00:00 2001 From: gitwoz <177856586+gitwoz@users.noreply.github.com> Date: Tue, 3 Dec 2024 22:14:07 +0700 Subject: [PATCH 04/10] fix(test): add MATTERS_CURATION_VAULT_SIGNER_PRIVATE_KEY to test.yml --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 87df20a90..4a9af756b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -85,6 +85,7 @@ jobs: MATTERS_STRIPE_SECRET: sk_test_foobar MATTERS_SENDGRID_API_KEY: SG.0-_abcabcabc. MATTERS_OPENSEA_API_BASE: 'https://rinkeby-api.opensea.io/api/v1' + MATTERS_CURATION_VAULT_SIGNER_PRIVATE_KEY: '0x8441d82233625acbb5738a56d9ad0a841515e882d536a06b5962c628472af073' - name: Build run: npm run build From 8bb1d14869a39b6d38f27f256eb8d5136e34691f Mon Sep 17 00:00:00 2001 From: gitwoz <177856586+gitwoz@users.noreply.github.com> Date: Tue, 3 Dec 2024 22:49:49 +0700 Subject: [PATCH 05/10] fix(test): make _handleSyncCurationEvents public and remove ts-ignore in tests --- .../queue/__test__/payToByBlockchain.test.ts | 22 ++++--------------- src/connectors/queue/payTo/blockchain.ts | 6 ++--- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/connectors/queue/__test__/payToByBlockchain.test.ts b/src/connectors/queue/__test__/payToByBlockchain.test.ts index 521b551bd..f010a1f43 100644 --- a/src/connectors/queue/__test__/payToByBlockchain.test.ts +++ b/src/connectors/queue/__test__/payToByBlockchain.test.ts @@ -407,15 +407,15 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { // queue.clearDelayedJobs() // }) test('_handleSyncCurationEvents update sync record', async () => { + const curation = new CurationContract(chainId) + expect(await knex(syncRecordTable).count()).toEqual([{ count: '0' }]) // create record - // @ts-ignore - await queue._handleSyncCurationEvents('Optimism') + await queue._handleSyncCurationEvents('Optimism', curation) expect(await knex(syncRecordTable).count()).toEqual([{ count: '1' }]) const oldSavepoint = await knex(syncRecordTable).first() // update record - // @ts-ignore - await queue._handleSyncCurationEvents('Optimism') + await queue._handleSyncCurationEvents('Optimism', curation) expect(await knex(syncRecordTable).count()).toEqual([{ count: '1' }]) const newSavepoint = await knex(syncRecordTable).first() expect(new Date(newSavepoint.updatedAt).getTime()).toBeGreaterThan( @@ -427,7 +427,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { const oldSavepoint1 = BigInt(20000000) mockFetchLogs.mockClear() - // @ts-ignore const [, newSavepoint1] = await queue.fetchCurationLogs( curation, oldSavepoint1 @@ -439,7 +438,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { expect(newSavepoint1).toBe(safeBlockNum) mockFetchLogs.mockClear() - // @ts-ignore const [logs1, newSavepoint3] = await queue.fetchCurationLogs( curation, safeBlockNum - BigInt(1) @@ -449,7 +447,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { expect(newSavepoint3).toBe(safeBlockNum - BigInt(1)) mockFetchLogs.mockClear() - // @ts-ignore const [logs2, newSavepoint4] = await queue.fetchCurationLogs( curation, safeBlockNum @@ -459,7 +456,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { expect(newSavepoint4).toBe(safeBlockNum) }) test('handle empty logs', async () => { - // @ts-ignore await queue._syncCurationEvents([], 'Optimism') }) test('handle native token curation logs', async () => { @@ -470,7 +466,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { removed: false, event: nativeTokenEvent, } - // @ts-ignore await queue._syncCurationEvents([nativeTokenLog], 'Optimism') expect( await knex(eventTable).where({ tokenAddress: null }).count() @@ -487,7 +482,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { removed: true, event: validEvent, } - // @ts-ignore await queue._syncCurationEvents([removedLog], 'Optimism') expect(await knex(txTable).count()).toEqual([{ count: '0' }]) expect(await knex(blockchainTxTable).count()).toEqual([{ count: '0' }]) @@ -529,7 +523,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { }, }, ] - // @ts-ignore await queue._syncCurationEvents(invalidLogs, 'Optimism') expect(await knex(txTable).count()).toEqual([{ count: '0' }]) expect(await knex(blockchainTxTable).count()).toEqual([{ count: '3' }]) @@ -564,7 +557,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { targetId, targetType, }) - // @ts-ignore await queue._syncCurationEvents(logs, 'Optimism') const updatedTx = await knex(txTable).first() const updatedBlockchainTx = await knex(blockchainTxTable).first() @@ -579,7 +571,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { await knex(eventTable).del() await knex(blockchainTxTable).del() await knex(txTable).del() - // @ts-ignore await queue._syncCurationEvents(logs, 'Optimism') expect(await knex(txTable).count()).toEqual([{ count: '1' }]) const tx = await knex(txTable).first() @@ -594,7 +585,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { state: BLOCKCHAIN_TRANSACTION_STATE.pending, }) await knex(txTable).update({ state: TRANSACTION_STATE.pending }) - // @ts-ignore await queue._syncCurationEvents(logs, 'Optimism') expect(await knex(txTable).count()).toEqual([{ count: '1' }]) const updatedTx1 = await knex(txTable).where('id', tx.id).first() @@ -615,7 +605,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { await knex(blockchainTxTable).update({ state: BLOCKCHAIN_TRANSACTION_STATE.pending, }) - // @ts-ignore await queue._syncCurationEvents(logs, 'Optimism') expect(await knex(txTable).count()).toEqual([{ count: '1' }]) const updatedTx2 = await knex(txTable).where('id', tx.id).first() @@ -633,7 +622,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { test.skip('blockchain_transaction forgeting adding transaction_id will be update and not send notification', async () => { // mock notify failed below as we have no direct access to paymentService in queue now const mockNotify = jest.fn() - // @ts-ignore paymentService.notifyDonation = mockNotify expect(mockNotify).not.toHaveBeenCalled() @@ -677,7 +665,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { }, }, ] - // @ts-ignore await queue._syncCurationEvents(logs, 'Optimism') const updatedBlockchainTx = @@ -702,7 +689,6 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { mockNotify.mockClear() expect(mockNotify).not.toHaveBeenCalled() - // @ts-ignore await queue._syncCurationEvents(logs, 'Optimism') expect(mockNotify).not.toHaveBeenCalled() diff --git a/src/connectors/queue/payTo/blockchain.ts b/src/connectors/queue/payTo/blockchain.ts index 7f04f6985..53c627952 100644 --- a/src/connectors/queue/payTo/blockchain.ts +++ b/src/connectors/queue/payTo/blockchain.ts @@ -335,7 +335,7 @@ export class PayToByBlockchainQueue { } } - private _handleSyncCurationEvents = async ( + public _handleSyncCurationEvents = async ( chain: GQLChain, curation: CurationContract | CurationVaultContract ) => { @@ -586,7 +586,7 @@ export class PayToByBlockchainQueue { await this.invalidCache(tx.targetType, tx.targetId, userService) } - private fetchCurationLogs = async ( + public fetchCurationLogs = async ( curation: CurationContract | CurationVaultContract, savepoint: bigint ): Promise<[Array>, bigint]> => { @@ -602,7 +602,7 @@ export class PayToByBlockchainQueue { return [await curation.fetchLogs(fromBlockNum, safeBlockNum), safeBlockNum] } - private _syncCurationEvents = async ( + public _syncCurationEvents = async ( logs: Array>, chain: GQLChain ) => { From 07bc3abd76dd590a9bf8c7672f5bf098fc25289d Mon Sep 17 00:00:00 2001 From: gitwoz <177856586+gitwoz@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:15:47 +0700 Subject: [PATCH 06/10] test(donation): add test for vault event --- .../queue/__test__/payToByBlockchain.test.ts | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/connectors/queue/__test__/payToByBlockchain.test.ts b/src/connectors/queue/__test__/payToByBlockchain.test.ts index f010a1f43..8ce4cb67c 100644 --- a/src/connectors/queue/__test__/payToByBlockchain.test.ts +++ b/src/connectors/queue/__test__/payToByBlockchain.test.ts @@ -130,9 +130,15 @@ const txReceipt1 = { reverted: false, events: [validEvent], } +const vaultNativeTokenEvent = { + curatorAddress: '0x999999cf1046e68e36e1aa2e0e07105eddd1f08f', + creatorId: recipientId, + uri: 'ipfs://someIpfsDataHash1', + tokenAddress: null, + amount: (amount * 1e18).toString(), +} // tests - describe('payToByBlockchainQueue.payTo', () => { let queue: PayToByBlockchainQueue beforeAll(async () => { @@ -619,6 +625,46 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { ) }) + test('valid vault logs will update tx', async () => { + const logs = [ + { + txHash, + address: contract.Optimism.curationVaultAddress, + blockNumber: 1, + removed: false, + event: { + ...vaultNativeTokenEvent, + }, + }, + ] + + // match a pending tx, update to succeeded + await knex(eventTable).del() + await knex(blockchainTxTable).del() + await knex(txTable).del() + await paymentService.createTransaction({ + amount, + state: TRANSACTION_STATE.pending, + purpose, + currency, + provider, + providerTxId: v4(), + recipientId, + senderId: '10', + targetId, + targetType, + }) + await queue._syncCurationEvents(logs, 'Optimism') + const updatedTx = await knex(txTable).first() + const updatedBlockchainTx = await knex(blockchainTxTable).first() + expect(updatedTx.state).toBe(TRANSACTION_STATE.succeeded) + expect(updatedBlockchainTx.state).toBe( + BLOCKCHAIN_TRANSACTION_STATE.succeeded + ) + expect(updatedBlockchainTx.transactionId).toBe(updatedTx.id) + expect(updatedTx.providerTxId).toBe(updatedBlockchainTx.id) + }) + test.skip('blockchain_transaction forgeting adding transaction_id will be update and not send notification', async () => { // mock notify failed below as we have no direct access to paymentService in queue now const mockNotify = jest.fn() From 827535a710455af590bc2c40d3a6467bb2116450 Mon Sep 17 00:00:00 2001 From: gitwoz <177856586+gitwoz@users.noreply.github.com> Date: Wed, 4 Dec 2024 16:04:50 +0700 Subject: [PATCH 07/10] feat(donation): alter "blockchain_curation_event" table and add "creator_id" column --- ...4160111_alter_blockchain_curation_event.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 db/migrations/20241204160111_alter_blockchain_curation_event.js diff --git a/db/migrations/20241204160111_alter_blockchain_curation_event.js b/db/migrations/20241204160111_alter_blockchain_curation_event.js new file mode 100644 index 000000000..b2dfdd552 --- /dev/null +++ b/db/migrations/20241204160111_alter_blockchain_curation_event.js @@ -0,0 +1,19 @@ +const table = 'blockchain_curation_event' + +exports.up = async (knex) => { + await knex.schema.alterTable(table, (t) => { + t.bigInteger('creator_id').unsigned() + t.string('creator_address').nullable().alter() + + t.foreign('creator_id').references('id').inTable('user') + + t.index('creator_id') + }) +} + +exports.down = async (knex) => { + await knex.schema.alterTable(table, (t) => { + t.dropColumn('creator_id') + t.string('creator_address').notNullable().alter() + }) +} From 355ab51887ba470dc7d91e9c5878cecddee36f07 Mon Sep 17 00:00:00 2001 From: gitwoz <177856586+gitwoz@users.noreply.github.com> Date: Wed, 4 Dec 2024 16:33:30 +0700 Subject: [PATCH 08/10] fix(test): use erc20 token event instead of native event --- src/connectors/queue/__test__/payToByBlockchain.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/connectors/queue/__test__/payToByBlockchain.test.ts b/src/connectors/queue/__test__/payToByBlockchain.test.ts index 8ce4cb67c..c376c3666 100644 --- a/src/connectors/queue/__test__/payToByBlockchain.test.ts +++ b/src/connectors/queue/__test__/payToByBlockchain.test.ts @@ -130,12 +130,12 @@ const txReceipt1 = { reverted: false, events: [validEvent], } -const vaultNativeTokenEvent = { +const vaultTokenEvent = { curatorAddress: '0x999999cf1046e68e36e1aa2e0e07105eddd1f08f', creatorId: recipientId, uri: 'ipfs://someIpfsDataHash1', - tokenAddress: null, - amount: (amount * 1e18).toString(), + tokenAddress: contract.Optimism.tokenAddress, + amount: (amount * 1e6).toString(), } // tests @@ -633,7 +633,7 @@ describe('payToByBlockchainQueue._syncCurationEvents', () => { blockNumber: 1, removed: false, event: { - ...vaultNativeTokenEvent, + ...vaultTokenEvent, }, }, ] From 24429aa5d2b0da99bf71ba692dbcff73fd2eacc0 Mon Sep 17 00:00:00 2001 From: gitwoz <177856586+gitwoz@users.noreply.github.com> Date: Thu, 5 Dec 2024 11:08:35 +0700 Subject: [PATCH 09/10] fix(transaction): correct enum altering --- ...0241129125017_alter_transaction_purpose.js | 38 +------------------ 1 file changed, 2 insertions(+), 36 deletions(-) diff --git a/db/migrations/20241129125017_alter_transaction_purpose.js b/db/migrations/20241129125017_alter_transaction_purpose.js index 2e1cbfd58..324917d5b 100644 --- a/db/migrations/20241129125017_alter_transaction_purpose.js +++ b/db/migrations/20241129125017_alter_transaction_purpose.js @@ -3,23 +3,6 @@ const { alterEnumString } = require('../utils') const table = 'transaction' exports.up = async (knex) => { - await knex.raw( - alterEnumString(table, 'purpose', [ - 'donation', - 'add-credit', - 'refund', - 'payout', - 'subscription', - 'subscription-split', - 'dispute-withdrawn-funds', - 'dispute', - ]) - ) - - await knex(table) - .where({ purpose: 'dispute-withdrawn-funds' }) - .update({ purpose: 'dispute' }) - await knex.raw( alterEnumString(table, 'purpose', [ 'donation', @@ -30,6 +13,7 @@ exports.up = async (knex) => { 'subscription-split', 'dispute', 'payout-reversal', + 'curation-vault-withdrawal', ]) ) } @@ -43,26 +27,8 @@ exports.down = async (knex) => { 'payout', 'subscription', 'subscription-split', - 'dispute-withdrawn-funds', - 'dispute', - 'curation-vault-withdrawal', - ]) - ) - - await knex(table) - .where({ purpose: 'dispute' }) - .update({ purpose: 'dispute-withdrawn-funds' }) - - await knex.raw( - alterEnumString(table, 'purpose', [ - 'donation', - 'add-credit', - 'refund', - 'payout', - 'subscription', - 'subscription-split', - 'dispute-withdrawn-funds', 'dispute', + 'payout-reversal', ]) ) } From e58bca26c4caf1c68933ef0328aa70f1bd6ceb7f Mon Sep 17 00:00:00 2001 From: gitwoz <177856586+gitwoz@users.noreply.github.com> Date: Thu, 5 Dec 2024 11:20:44 +0700 Subject: [PATCH 10/10] feat(donation): update production curation vault address --- src/common/environment.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/common/environment.ts b/src/common/environment.ts index 786a59d97..681ce71ae 100644 --- a/src/common/environment.ts +++ b/src/common/environment.ts @@ -188,10 +188,9 @@ export const contract = { tokenAddress: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58'.toLowerCase(), tokenDecimals: 6, - // TODO: update to prod address curationVaultAddress: - '0x891060263b8397cB3c69F01E3383e7f8838Fd8a8'.toLowerCase(), - curationVaultBlockNum: '20457192', + '0x7CC566aa9488a9990977Cb31D856C47e67b35465'.toLowerCase(), + curationVaultBlockNum: '128886733', } : { curationAddress: