From c045d0ba51900965871214327cd65e91dd79cd27 Mon Sep 17 00:00:00 2001 From: Jason Efstathiou Date: Thu, 10 Oct 2024 16:22:22 +0200 Subject: [PATCH] Filecoin, Multichain API, Ethers v6 (#1250) * feat: add chain picker * refactor: fix wrong explore URL when changing networks * wip * refactor: add a delay to FlyOut * refactor: wip * refactor: integrate multi-chain API * fix: issue causing newly claimed project not appearing in projects after claiming flow completes * test: fix broken unit tests * refactor: update ethers to v6 * refactor: remove RepoDriverClient and use the new AbiType repoDriverRead func * refactor: remove NFTDriverClient and use the new AbiType nftDriverRead and nftDriverWrite funcs * refactor: replace SDK getAllowance calls with local function * refactor: replace SDK AddressDriver with local function * refactor: remove DripsClient and use the new AbiType dripsRead funcs * refactor: replace SDK ERC20TxFactory with local functions * refactor: replace SDK DripsTxFactory with local functions * refactor: cleanup new contract client funcs * refactor: create generic ERC20 Tx builder * refactor: replace SDK RepoDriverTxFactory with local functions * refactor: replace SDK NftDriverTxFactory with local functions * refactor: replace SDK AddressDriverTxFactory with local functions * refactor: replace SDK CallerTxFactory with local functions * refactor: replace SDK Caller presets with local functions * fix: wrong own account ID calculation when initializing store * fix: missing assert import * fix: wrong contract address when creating caller client * refactor: remove erc20 utils and use the typed client Also fix drip list creation flow errors * fix: errors when creating streams and managing funds * fix: check errors * explictly define @rollup/rollup-linux-x64-gnu as optional dep * fix: construct new response instance in GQL API proxy endpoint * initial setup * wip * feat: auto unwrap on collect * Unsupported network handling (#1200) * refactor: allow disconnecting wallet instead of switching * refactor: add button for adding unsupported network * refactor: avoid page duplicates serving identical content for alternative chains (#1199) * remove display of native token name in collect modal * fix gql build error * fix: Filecoin block explorer URL creation (#1210) * fix: Filecoin block explorer URL creation * refactor: revert naming * fix lockfile * fix lockfile again * Add network config value for hiding network picker per network (#1229) * add `displayNetworkPicker` to network config, refactor as one config var * hide network pickers if disabled in network config * animate network picker chevron * disable gas buffers on filecoin * move contract addresses to network config, update filecoin deployment addresses (#1230) * update filecoin deployment addresses * fix: #1231, add block explorer config to network config (#1234) * allow customizing settlement info per network (#1237) * finalize network picker (#1236) * fix: #1232 (#1235) * fix: #1239 * fix checks * scope cache keys by network * fix tlv * fix: #1248 * invalidate account IDs as strings * update gh workflows * fix unable to add custom token --------- Co-authored-by: Ioannis Tourkogiorgis Co-authored-by: Ioannis <6360154+jtourkos@users.noreply.github.com> --- .env.template | 3 + .github/workflows/check.yml | 4 +- .github/workflows/unit-tests.yml | 4 +- .husky/pre-commit | 2 - codegen.ts | 3 + graphql.config.yml | 3 + package-lock.json | 865 +----------- package.json | 7 +- src/app.d.ts | 5 + .../account-menu/account-menu.svelte | 26 +- src/lib/components/amount/amount.svelte | 4 +- .../components/amount/realtime-amount.svelte | 4 +- .../components/blog-drip-list-card.svelte | 10 +- .../connect-button/connect-button.svelte | 21 - .../developer.section.svelte | 4 +- .../stream-developer.section.svelte | 6 +- .../drip-list-badge/drip-list-badge.svelte | 1 + .../components/voting-round-splits.svelte | 7 +- .../drip-list-card/drip-list-card.svelte | 18 +- .../methods/get-supporters-pile.ts | 4 +- .../drip-lists-section.svelte | 2 +- .../components/drip-visual/drip-visual.svelte | 22 +- src/lib/components/flyout/flyout.svelte | 18 +- .../formatted-amount/formatted-amount.svelte | 4 +- src/lib/components/header/header.svelte | 77 +- src/lib/components/icons/networks/Base.svelte | 30 + .../components/icons/networks/Ethereum.svelte | 30 + .../components/icons/networks/Filecoin.svelte | 29 + .../components/icons/networks/Optimism.svelte | 29 + .../components/icons/networks/Polygon.svelte | 25 + .../icons/networks/TestnetFrame.svelte | 22 + .../identity-card/identity-card.svelte | 22 +- .../input-stream-receiver.svelte | 6 +- .../input-wallet-amount.svelte | 2 +- src/lib/components/list-editor/classifiers.ts | 2 +- .../components/list-editor-input.svelte | 2 +- src/lib/components/list-editor/hydrators.ts | 26 +- .../split-receivers-to-list-editor-config.ts | 11 +- src/lib/components/list-editor/validators.ts | 2 +- .../components/network-list.svelte | 104 ++ .../network-picker/network-picker.svelte | 59 + .../one-time-donation-editor.svelte | 16 +- .../project-avatar/project-avatar.svelte | 9 +- .../components/project-name.svelte | 14 +- .../components/project-tooltip.svelte | 43 +- .../project-badge/project-badge.svelte | 69 +- .../project-card/project-card.svelte | 31 +- .../project-customizer.svelte | 108 +- .../project-profile-header.svelte | 29 +- .../projects-section/projects-section.svelte | 6 +- src/lib/components/search-bar/search.ts | 2 +- .../splits/components/split/split.svelte | 18 +- src/lib/components/splits/splits.svelte | 271 +--- src/lib/components/splits/types.ts | 130 ++ src/lib/components/splits/utils.ts | 159 +++ .../stepper/components/transact-step.svelte | 48 +- .../{etherscan-link.svelte => tx-link.svelte} | 3 +- src/lib/components/stepper/types.ts | 6 +- src/lib/components/stepper/utils/transact.ts | 294 ----- .../support-card/support-card.svelte | 31 +- .../support-stream-editor.svelte | 22 +- .../unclaimed-project-card.svelte | 19 +- .../add-custom-token/enter-details.svelte | 31 +- .../claim-project-flow/claim-project-flow.ts | 8 +- .../add-ethereum-address.svelte | 17 +- .../steps/enter-git-url/enter-git-url.svelte | 39 +- .../steps/poll-api/poll-api.svelte | 34 +- .../project-customizer-modal.svelte | 10 +- .../components/project-customizer-step.svelte | 15 +- .../steps/review/review.svelte | 68 +- .../set-splits-and-emit-metadata.svelte | 33 +- .../steps/success/success.svelte | 7 +- .../create-donation/input-details.svelte | 14 +- .../methods/create-donation.ts | 39 +- .../steps/build-list/build-list.svelte | 5 +- .../review-voting-round.svelte | 7 +- .../continuous-support-review-card.svelte | 4 +- .../steps/review/review.svelte | 6 +- .../create-stream-flow/fetch-data.svelte | 23 +- .../create-stream-flow/input-details.svelte | 30 +- .../flows/delete-stream-flow/confirm.svelte | 20 +- .../add-member/steps/select-drip-list.svelte | 18 +- .../shared/steps/edit-drip-list.svelte | 68 +- .../edit-project-metadata-steps.ts | 2 +- .../steps/set-new-metadata.svelte | 61 +- .../edit-project-splits-steps.ts | 9 +- .../edit-project-splits/steps/review.svelte | 12 +- .../edit-stream-flow-state.ts | 7 +- .../edit-stream-flow/enter-new-details.svelte | 23 +- .../global-collect-flow/batch-collect.ts | 51 +- .../steps/select-tokens/select-tokens.svelte | 53 +- src/lib/flows/pause-flow/pause.svelte | 26 +- .../publish-voting-round-list/review.svelte | 6 +- .../fetch-allowance-and-balance.svelte | 15 +- src/lib/flows/top-up-flow/methods/top-up.ts | 29 +- src/lib/flows/top-up-flow/select-token.svelte | 15 +- src/lib/flows/unpause-flow/unpause.svelte | 39 +- .../flows/view-voting-round/fetch-data.svelte | 2 +- .../view-voting-round-flow-steps.ts | 2 +- .../flows/withdraw-flow/enter-amount.svelte | 13 +- src/lib/flows/withdraw-flow/fetch-data.svelte | 18 +- .../cupertino-pane/cupertino-pane.store.ts | 5 + src/lib/stores/ens/ens.store.ts | 37 +- src/lib/stores/tokens/additional-tokens.json | 8 + src/lib/stores/tokens/stored-custom-tokens.ts | 4 +- src/lib/stores/tokens/tokens.store.ts | 4 +- .../stores/tokens/tokens.store.unit.test.ts | 7 +- .../__test__/local-testnet-mock-provider.ts | 22 +- .../stores/wallet/__test__/wallet.store.ts | 41 +- src/lib/stores/wallet/network.ts | 289 +++- src/lib/stores/wallet/wallet.store.ts | 139 +- src/lib/utils/RepoDriverUtils.ts | 18 - .../__test__/RepoDriverUtils.unit.test.ts | 32 - src/lib/utils/base-url.ts | 2 +- src/lib/utils/cache/remote/cached.ts | 11 +- src/lib/utils/decode-universal-account-id.ts | 32 +- src/lib/utils/driplist/DripListService.ts | 190 ++- .../utils/drips/fetch-balances-for-tokens.ts | 51 +- src/lib/utils/drips/get-cycle.ts | 7 +- src/lib/utils/erc20/erc20.abi.json | 222 ---- src/lib/utils/erc20/fetch-balance.ts | 19 - src/lib/utils/erc20/fetch-info.ts | 32 - src/lib/utils/erc20/index.ts | 2 - src/lib/utils/etherscan-link.ts | 11 - .../utils/fiat-estimates/fiat-estimates.ts | 32 +- src/lib/utils/filter-current-chain-data.ts | 44 + src/lib/utils/format-token-amount.ts | 10 +- src/lib/utils/get-drips-clients.ts | 199 --- src/lib/utils/ipfs.ts | 18 +- src/lib/utils/metadata/MetadataManagerBase.ts | 29 +- .../utils/metadata/MetadataManagerFactory.ts | 12 - .../metadata/NftDriverMetadataManager.ts | 13 +- .../metadata/RepoDriverMetadataManager.ts | 62 +- .../metadata/schemas/address-driver/v1.ts | 4 +- .../RepoDriverMetadataManager.unit.test.ts | 278 ---- src/lib/utils/multiplayer/multiplayer.ts | 59 +- src/lib/utils/parse-token-amount.ts | 4 +- src/lib/utils/project/GitProjectService.ts | 172 ++- .../utils/project/get-project-chain-data.ts | 7 + src/lib/utils/project/is-claimed.ts | 27 +- src/lib/utils/random-bigint-until-unique.ts | 4 +- .../sdk/address-driver/address-driver-abi.ts | 394 ++++++ .../sdk/address-driver/address-driver.ts | 64 + .../populate-create-collect-flow-txs.ts | 108 ++ .../populate-create-new-stream-flow-txs.ts | 63 + src/lib/utils/sdk/caller/caller-abi.ts | 186 +++ src/lib/utils/sdk/caller/caller.ts | 31 + src/lib/utils/sdk/drips/drips-abi.ts | 1171 +++++++++++++++++ src/lib/utils/sdk/drips/drips.ts | 50 + src/lib/utils/sdk/erc20/erc20.ts | 64 + .../native-token-unwrapper-abi.ts | 70 + .../native-token-unwrapper.ts | 43 + .../utils/sdk/nft-driver/nft-driver-abi.ts | 688 ++++++++++ src/lib/utils/sdk/nft-driver/nft-driver.ts | 68 + .../utils/sdk/repo-driver/repo-driver-abi.ts | 573 ++++++++ src/lib/utils/sdk/repo-driver/repo-driver.ts | 50 + src/lib/utils/sdk/sdk-types.ts | 98 ++ src/lib/utils/sdk/utils/contract-constants.ts | 15 + .../utils/extract-address-from-accountId.ts | 34 + .../utils/extract-driver-from-accountId.ts | 32 + .../utils/sdk/utils/format-split-receivers.ts | 32 + .../sdk/utils/format-stream-receivers.ts | 32 + src/lib/utils/sdk/utils/get-own-account-id.ts | 18 + .../utils/sdk/utils/is-address-driver-id.ts | 15 + .../utils/sdk/utils/key-value-to-metadata.ts | 15 + .../utils/sdk/utils/stream-config-utils.ts | 86 ++ src/lib/utils/sdk/utils/tx-to-caller-call.ts | 10 + .../utils/sdk/utils/tx-to-safe-drips-tx.ts | 10 + .../utils/sdk/utils/unwrap-ethers-result.ts | 11 + src/lib/utils/settlement-date.ts | 7 +- src/lib/utils/streams/make-stream-id.ts | 2 +- src/lib/utils/streams/streams.ts | 303 +++-- src/lib/utils/total-dripped-approx.ts | 2 +- src/lib/utils/validate-amt-per-sec.ts | 4 +- src/routes/+page.server.ts | 10 + .../cache/invalidate-account-ids/+server.ts | 38 +- .../queries/associated-account-ids-queries.ts | 112 +- .../gasless/call/repo-owner-update/+server.ts | 15 +- .../drip-list/[listId].png/+server.ts | 7 +- .../project/[projectUrl].png/+server.ts | 68 +- src/routes/api/tlv/+server.ts | 13 +- src/routes/app/(app)/+page.server.ts | 31 +- src/routes/app/(app)/+page.svelte | 20 +- .../app/(app)/[accountId]/+page.server.ts | 59 +- src/routes/app/(app)/[accountId]/+page.svelte | 32 +- .../(app)/[accountId]/tokens/[token]/+page.ts | 29 +- .../[token]/streams/[dripId]/+page.server.ts | 12 +- .../[token]/streams/[dripId]/+page.svelte | 15 +- .../app/(app)/component-showcase/+page.svelte | 151 ++- src/routes/app/(app)/drip-lists/+page.ts | 19 +- .../(app)/drip-lists/[listId]/+page.server.ts | 19 +- .../app/(app)/drip-lists/all/+page.server.ts | 12 +- .../app/(app)/drip-lists/all/+page.svelte | 28 +- src/routes/app/(app)/funds/+page.ts | 28 +- .../funds/sections/balances.section.svelte | 4 +- .../project-profile/project-profile.svelte | 145 +- .../[githubRepoName]/+page.server.ts | 24 +- src/routes/app/(app)/projects/+page.ts | 9 +- .../app/(app)/projects/all/+page.server.ts | 11 +- .../app/(app)/projects/all/+page.svelte | 101 +- src/routes/app/(app)/settings/+page.ts | 3 + .../app/(app)/settings/custom-tokens/+page.ts | 3 + src/routes/app/+layout.ts | 7 +- src/routes/app/utils/+page.svelte | 11 +- src/routes/legal/+layout.ts | 12 + 205 files changed, 7403 insertions(+), 3885 deletions(-) create mode 100644 graphql.config.yml create mode 100644 src/lib/components/icons/networks/Base.svelte create mode 100644 src/lib/components/icons/networks/Ethereum.svelte create mode 100644 src/lib/components/icons/networks/Filecoin.svelte create mode 100644 src/lib/components/icons/networks/Optimism.svelte create mode 100644 src/lib/components/icons/networks/Polygon.svelte create mode 100644 src/lib/components/icons/networks/TestnetFrame.svelte create mode 100644 src/lib/components/network-picker/components/network-list.svelte create mode 100644 src/lib/components/network-picker/network-picker.svelte create mode 100644 src/lib/components/splits/types.ts create mode 100644 src/lib/components/splits/utils.ts rename src/lib/components/stepper/components/{etherscan-link.svelte => tx-link.svelte} (78%) delete mode 100644 src/lib/components/stepper/utils/transact.ts delete mode 100644 src/lib/utils/RepoDriverUtils.ts delete mode 100644 src/lib/utils/__test__/RepoDriverUtils.unit.test.ts delete mode 100644 src/lib/utils/erc20/erc20.abi.json delete mode 100644 src/lib/utils/erc20/fetch-balance.ts delete mode 100644 src/lib/utils/erc20/fetch-info.ts delete mode 100644 src/lib/utils/erc20/index.ts delete mode 100644 src/lib/utils/etherscan-link.ts create mode 100644 src/lib/utils/filter-current-chain-data.ts delete mode 100644 src/lib/utils/get-drips-clients.ts delete mode 100644 src/lib/utils/metadata/MetadataManagerFactory.ts delete mode 100644 src/lib/utils/metadata/tests/RepoDriverMetadataManager.unit.test.ts create mode 100644 src/lib/utils/project/get-project-chain-data.ts create mode 100644 src/lib/utils/sdk/address-driver/address-driver-abi.ts create mode 100644 src/lib/utils/sdk/address-driver/address-driver.ts create mode 100644 src/lib/utils/sdk/address-driver/populate-create-collect-flow-txs.ts create mode 100644 src/lib/utils/sdk/address-driver/populate-create-new-stream-flow-txs.ts create mode 100644 src/lib/utils/sdk/caller/caller-abi.ts create mode 100644 src/lib/utils/sdk/caller/caller.ts create mode 100644 src/lib/utils/sdk/drips/drips-abi.ts create mode 100644 src/lib/utils/sdk/drips/drips.ts create mode 100644 src/lib/utils/sdk/erc20/erc20.ts create mode 100644 src/lib/utils/sdk/native-token-unrapper/native-token-unwrapper-abi.ts create mode 100644 src/lib/utils/sdk/native-token-unrapper/native-token-unwrapper.ts create mode 100644 src/lib/utils/sdk/nft-driver/nft-driver-abi.ts create mode 100644 src/lib/utils/sdk/nft-driver/nft-driver.ts create mode 100644 src/lib/utils/sdk/repo-driver/repo-driver-abi.ts create mode 100644 src/lib/utils/sdk/repo-driver/repo-driver.ts create mode 100644 src/lib/utils/sdk/sdk-types.ts create mode 100644 src/lib/utils/sdk/utils/contract-constants.ts create mode 100644 src/lib/utils/sdk/utils/extract-address-from-accountId.ts create mode 100644 src/lib/utils/sdk/utils/extract-driver-from-accountId.ts create mode 100644 src/lib/utils/sdk/utils/format-split-receivers.ts create mode 100644 src/lib/utils/sdk/utils/format-stream-receivers.ts create mode 100644 src/lib/utils/sdk/utils/get-own-account-id.ts create mode 100644 src/lib/utils/sdk/utils/is-address-driver-id.ts create mode 100644 src/lib/utils/sdk/utils/key-value-to-metadata.ts create mode 100644 src/lib/utils/sdk/utils/stream-config-utils.ts create mode 100644 src/lib/utils/sdk/utils/tx-to-caller-call.ts create mode 100644 src/lib/utils/sdk/utils/tx-to-safe-drips-tx.ts create mode 100644 src/lib/utils/sdk/utils/unwrap-ethers-result.ts create mode 100644 src/routes/app/(app)/settings/+page.ts create mode 100644 src/routes/app/(app)/settings/custom-tokens/+page.ts diff --git a/.env.template b/.env.template index 9f04bcbe8..fd266da3e 100644 --- a/.env.template +++ b/.env.template @@ -45,3 +45,6 @@ PUBLIC_BASE_URL=string # URL of the Drips Multiplayer API deployment to use. Set to the defaults below to use public Sepolia deployment. MULTIPLAYER_API_URL=string # Default for sepolia https://multiplayer-sepolia.up.railway.app MULTIPLAYER_API_ACCESS_TOKEN=string # Default for sepolia 992b2122-9a09-4a97-b2cc-2292d3dd23aa + +# Optional, defaults to `false`. Setting this to `true` will redirect any requests from `/` to `/app` and any '/legal/**/*' requests to 'drips.network/legal/**/*'. +PUBLIC_ALTERNATIVE_CHAIN_MODE=boolean \ No newline at end of file diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 326a8591f..b81324bee 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -33,8 +33,8 @@ jobs: envkey_GELATO_API_KEY: 1234 envkey_COINMARKETCAP_API_KEY: 1234 envkey_PUBLIC_NETWORK: 5 - envkey_GQL_URL: https://drips-api-mainnet-s2.up.railway.app/ - envkey_GQL_ACCESS_TOKEN: afdb8b7e-8fa7-4de9-bd95-b650b839e745 # public token + envkey_GQL_URL: https://drips-multichain-api.up.railway.app/ + envkey_GQL_ACCESS_TOKEN: 7f82c43a-e7f4-47e9-a623-db7066f8bea2 # public token envkey_PUBLIC_PINATA_GATEWAY_URL: http://localhost:3000 envkey_INFURA_KEY: 1234 envkey_MULTIPLAYER_API_ACCESS_TOKEN: 1234 diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 794b92235..36d6ad355 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -26,8 +26,8 @@ jobs: uses: SpicyPizza/create-envfile@v1.3 with: envkey_PUBLIC_NETWORK: 1 - envkey_GQL_URL: https://drips-api-mainnet-s2.up.railway.app/ - envkey_GQL_ACCESS_TOKEN: afdb8b7e-8fa7-4de9-bd95-b650b839e745 # public token + envkey_GQL_URL: https://drips-multichain-api.up.railway.app/ + envkey_GQL_ACCESS_TOKEN: 7f82c43a-e7f4-47e9-a623-db7066f8bea2 # public token envkey_PUBLIC_PINATA_GATEWAY_URL: http://localhost:3000 envkey_INFURA_KEY: 1234 envkey_MULTIPLAYER_API_ACCESS_TOKEN: 1234 diff --git a/.husky/pre-commit b/.husky/pre-commit index c8fec63e2..9ee079137 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,2 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" npx lint-staged --concurrent false diff --git a/codegen.ts b/codegen.ts index 6452d84b6..df195d3a6 100644 --- a/codegen.ts +++ b/codegen.ts @@ -17,6 +17,9 @@ const config: CodegenConfig = { }, ], generates: { + './src/lib/graphql/__generated__/schema.graphql': { + plugins: ['schema-ast'], + }, './src/lib/graphql/__generated__/base-types.ts': { plugins: ['typescript'], }, diff --git a/graphql.config.yml b/graphql.config.yml new file mode 100644 index 000000000..e294558dc --- /dev/null +++ b/graphql.config.yml @@ -0,0 +1,3 @@ +schema: 'src/lib/graphql/__generated__/schema.graphql' +documents: 'src/**/*.{graphql,js,ts,svelte}' +ignoreNoDocuments: true \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 26ad135cb..99b9e14c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "csv-simple-parser": "^1.0.3", "cupertino-pane": "^1.4.21", "ethereum-blockies-base64": "^1.0.2", - "ethers": "^5.7.2", + "ethers": "^6.13.1", "fuzzysort": "^2.0.3", "globals": "^15.6.0", "graphql": "^16.8.2", @@ -39,7 +39,6 @@ "isomorphic-fetch": "^3.0.0", "jimp": "^0.22.12", "lodash": "^4.17.21", - "radicle-drips": "github:drips-network/sdk", "redis": "^4.6.14", "sanitize-html": "^2.13.0", "satori": "^0.10.13", @@ -50,6 +49,7 @@ "devDependencies": { "@graphql-codegen/cli": "^5.0.2", "@graphql-codegen/near-operation-file-preset": "^3.0.0", + "@graphql-codegen/schema-ast": "^4.1.0", "@graphql-codegen/typescript": "^4.0.7", "@graphql-codegen/typescript-operations": "^4.2.3", "@playwright/test": "^1.44.1", @@ -91,6 +91,9 @@ "typescript-eslint": "^8.7.0", "vite": "^5.4.6", "vitest": "^1.6.0" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.9.5" } }, "node_modules/@adobe/css-tools": { @@ -1767,726 +1770,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bignumber/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@ethersproject/signing-key/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/@ethersproject/signing-key/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, "node_modules/@formatjs/ecma402-abstract": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz", @@ -2570,12 +1853,6 @@ "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", "license": "MIT" }, - "node_modules/@gelatonetwork/relay-sdk/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "license": "MIT" - }, "node_modules/@gelatonetwork/relay-sdk/node_modules/ethers": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.0.tgz", @@ -2963,10 +2240,11 @@ } }, "node_modules/@graphql-codegen/schema-ast": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.0.2.tgz", - "integrity": "sha512-5mVAOQQK3Oz7EtMl/l3vOQdc2aYClUzVDHHkMvZlunc+KlGgl81j8TLa+X7ANIllqU4fUEsQU3lJmk4hXP6K7Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.1.0.tgz", + "integrity": "sha512-kZVn0z+th9SvqxfKYgztA6PM7mhnSZaj4fiuBWvMTqA+QqQ9BBed6Pz41KuD/jr0gJtnlr2A4++/0VlpVbCTmQ==", "dev": true, + "license": "MIT", "dependencies": { "@graphql-codegen/plugin-helpers": "^5.0.3", "@graphql-tools/utils": "^10.0.0", @@ -6126,12 +5404,13 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", + "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -8582,9 +7861,10 @@ } }, "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" }, "node_modules/agent-base": { "version": "7.1.1", @@ -9002,11 +8282,6 @@ } ] }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", @@ -9110,7 +8385,8 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true }, "node_modules/browserify-aes": { "version": "1.2.0", @@ -11067,52 +10343,51 @@ } }, "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "version": "6.13.3", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.3.tgz", + "integrity": "sha512-/DzbZOLVtoO4fKvvQwpEucHAQgIwBGWuRvBdwE/lMXgXvvHHTSkn7XqAQ2b+gjJzZDJjWA9OD05bVceVOsBHbg==", "funding": [ { "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "url": "https://github.com/sponsors/ethers-io/" }, { "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" } }, + "node_modules/ethers/node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "license": "MIT" + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "license": "0BSD" + }, "node_modules/ethjs-util": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", @@ -12035,6 +11310,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -12120,6 +11396,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -13245,11 +12522,6 @@ "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", "license": "BSD-3-Clause" }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -13995,12 +13267,14 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true }, "node_modules/minimatch": { "version": "3.1.2", @@ -15838,13 +15112,6 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, - "node_modules/radicle-drips": { - "version": "2.0.0-beta.0", - "resolved": "git+ssh://git@github.com/drips-network/sdk.git#703f6083610ad1b6398ef7463b35f2ce346a9806", - "peerDependencies": { - "ethers": "^5.7.2" - } - }, "node_modules/radix3": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", @@ -16346,6 +15613,19 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/rrweb-cssom": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", @@ -16520,7 +15800,8 @@ "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true }, "node_modules/scuid": { "version": "1.1.0", diff --git a/package.json b/package.json index 0229f7af5..22b401a62 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "devDependencies": { "@graphql-codegen/cli": "^5.0.2", "@graphql-codegen/near-operation-file-preset": "^3.0.0", + "@graphql-codegen/schema-ast": "^4.1.0", "@graphql-codegen/typescript": "^4.0.7", "@graphql-codegen/typescript-operations": "^4.2.3", "@playwright/test": "^1.44.1", @@ -90,7 +91,7 @@ "csv-simple-parser": "^1.0.3", "cupertino-pane": "^1.4.21", "ethereum-blockies-base64": "^1.0.2", - "ethers": "^5.7.2", + "ethers": "^6.13.1", "fuzzysort": "^2.0.3", "globals": "^15.6.0", "graphql": "^16.8.2", @@ -98,7 +99,6 @@ "isomorphic-fetch": "^3.0.0", "jimp": "^0.22.12", "lodash": "^4.17.21", - "radicle-drips": "github:drips-network/sdk", "redis": "^4.6.14", "sanitize-html": "^2.13.0", "satori": "^0.10.13", @@ -115,5 +115,8 @@ } } }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.9.5" + }, "type": "module" } diff --git a/src/app.d.ts b/src/app.d.ts index 8e7db0d5e..70676053f 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -11,6 +11,11 @@ declare namespace App { * load function. */ blockWhileInitializing?: false; + + /** + * If false, the app will redirect to the explore page. + */ + preservePathOnNetworkChange?: boolean; } // interface PageError {} diff --git a/src/lib/components/account-menu/account-menu.svelte b/src/lib/components/account-menu/account-menu.svelte index b9490f4ed..ed02a5947 100644 --- a/src/lib/components/account-menu/account-menu.svelte +++ b/src/lib/components/account-menu/account-menu.svelte @@ -11,10 +11,16 @@ import { navigating } from '$app/stores'; import LegalLinks from '../legal-links/legal-links.svelte'; import Settings from '$lib/components/icons/Settings.svelte'; + import NetworkPicker from '../network-picker/network-picker.svelte'; + import NetworkList from '../network-picker/components/network-list.svelte'; + import { slide } from 'svelte/transition'; + import network from '$lib/stores/wallet/network'; $: $navigating && cupertinoPaneStore.closeSheet(); $: safeAppMode = Boolean($wallet.safe); + + let shouldShowNetworkList = false; {/if} + {#if shouldShowNetworkList} +
+ +
+ {/if}
import tokens from '$lib/stores/tokens'; import assert from '$lib/utils/assert'; - import { constants } from 'radicle-drips'; import formatTokenAmount from '$lib/utils/format-token-amount'; import amtDeltaUnitStore, { FRIENDLY_NAMES, MULTIPLIERS, } from '$lib/stores/amt-delta-unit/amt-delta-unit.store'; + import contractConstants from '$lib/utils/sdk/utils/contract-constants'; interface Amount { amount: bigint; @@ -17,7 +17,7 @@ export let amountPerSecond: Amount | undefined = undefined; export let showSymbol = true; export let showPlusMinus = true; - export let multiplier = BigInt(constants.AMT_PER_SEC_MULTIPLIER); + export let multiplier = BigInt(contractConstants.AMT_PER_SEC_MULTIPLIER); export let amountClasses = 'typo-text tabular-nums'; export let amountPerSecClasses = 'typo-text-small tabular-nums text-foreground-level-4'; diff --git a/src/lib/components/amount/realtime-amount.svelte b/src/lib/components/amount/realtime-amount.svelte index be6b9c3f7..93af6b521 100644 --- a/src/lib/components/amount/realtime-amount.svelte +++ b/src/lib/components/amount/realtime-amount.svelte @@ -11,11 +11,11 @@ import addCustomTokenFlowSteps from '$lib/flows/add-custom-token/add-custom-token-flow-steps'; import { fade } from 'svelte/transition'; import AggregateFiatEstimate from '../aggregate-fiat-estimate/aggregate-fiat-estimate.svelte'; - import { constants } from 'radicle-drips'; import type { CurrentAmountsTimelineItemFragment, CurrentAmountsUserBalanceTimelineItemFragment, } from '$lib/utils/__generated__/gql.generated'; + import contractConstants from '$lib/utils/sdk/utils/contract-constants'; export let timeline: ( | CurrentAmountsTimelineItemFragment @@ -55,7 +55,7 @@ tokenAddress: $currentAmountsStore.currentAmount.tokenAddress, amount: $currentAmountsStore.currentAmount.amount / - BigInt(constants.AMT_PER_SEC_MULTIPLIER), + BigInt(contractConstants.AMT_PER_SEC_MULTIPLIER), }, ]} /> diff --git a/src/lib/components/blog/article-layout/components/blog-drip-list-card.svelte b/src/lib/components/blog/article-layout/components/blog-drip-list-card.svelte index 2ee3c8cea..491d95575 100644 --- a/src/lib/components/blog/article-layout/components/blog-drip-list-card.svelte +++ b/src/lib/components/blog/article-layout/components/blog-drip-list-card.svelte @@ -13,6 +13,7 @@ import TransitionedHeight from '$lib/components/transitioned-height/transitioned-height.svelte'; import Spinner from '$lib/components/spinner/spinner.svelte'; import { fade } from 'svelte/transition'; + import network from '$lib/stores/wallet/network'; export let dripListId: string; @@ -23,15 +24,18 @@ const blogDripListQuery = gql` ${DRIP_LIST_CARD_FRAGMENT} - query blogDripList($dripListId: ID!) { - dripList(id: $dripListId) { + query blogDripList($dripListId: ID!, $chain: SupportedChain!) { + dripList(id: $dripListId, chain: $chain) { ...DripListCard } } `; dripList = ( - await query(blogDripListQuery, { dripListId }) + await query(blogDripListQuery, { + dripListId, + chain: network.gqlName, + }) ).dripList; }); diff --git a/src/lib/components/connect-button/connect-button.svelte b/src/lib/components/connect-button/connect-button.svelte index 305dcf820..37c0629df 100644 --- a/src/lib/components/connect-button/connect-button.svelte +++ b/src/lib/components/connect-button/connect-button.svelte @@ -15,11 +15,6 @@
- {#if $wallet.network.chainId !== 1} -
-

{$wallet.network.label}

-
- {/if} {#if $wallet.connected}
@@ -77,22 +72,6 @@ display: flex; } - .network-badge { - height: 2rem; - padding: 0 8px; - display: flex; - align-content: center; - justify-content: center; - text-transform: capitalize; - background-color: var(--color-primary-level-1); - border-radius: 1rem 0 1rem 1rem; - color: var(--color-primary-level-6); - } - - .network-badge p { - line-height: 2rem; - } - .trigger > .safe-logo { border-radius: 1rem; height: 2rem; diff --git a/src/lib/components/developer-section/developer.section.svelte b/src/lib/components/developer-section/developer.section.svelte index 6c0f50c46..5bdab3ae1 100644 --- a/src/lib/components/developer-section/developer.section.svelte +++ b/src/lib/components/developer-section/developer.section.svelte @@ -6,8 +6,8 @@ import Coin from '$lib/components/icons/Coin.svelte'; import Wallet from '$lib/components/icons/Wallet.svelte'; import Box from '$lib/components/icons/Box.svelte'; - import { Utils } from 'radicle-drips'; import Splits from '$lib/components/icons/Splits.svelte'; + import { extractDriverNameFromAccountId } from '$lib/utils/sdk/utils/extract-driver-from-accountId'; export let accountId: string | undefined = undefined; @@ -25,7 +25,7 @@ immutableSplits: Splits, } as const; - $: driver = accountId && Utils.AccountId.getDriver(accountId); + $: driver = accountId && extractDriverNameFromAccountId(accountId); {#if $developerModeStore} diff --git a/src/lib/components/developer-section/stream-developer.section.svelte b/src/lib/components/developer-section/stream-developer.section.svelte index a7d9cd90b..320a13726 100644 --- a/src/lib/components/developer-section/stream-developer.section.svelte +++ b/src/lib/components/developer-section/stream-developer.section.svelte @@ -3,7 +3,7 @@ import Section from '../section/section.svelte'; import developerModeStore from '$lib/stores/developer-mode/developer-mode.store'; import Copyable from '../copyable/copyable.svelte'; - import { constants } from 'radicle-drips'; + import contractConstants from '$lib/utils/sdk/utils/contract-constants'; export let amtPerSec: bigint | undefined = undefined; export let tokenAddress: string | undefined = undefined; @@ -41,7 +41,9 @@ {/if} {#if amtPerSec} - {@const amtPerSecondWei = String(amtPerSec / BigInt(constants.AMT_PER_SEC_MULTIPLIER))} + {@const amtPerSecondWei = String( + amtPerSec / BigInt(contractConstants.AMT_PER_SEC_MULTIPLIER), + )}
Amount per sec (with extra precision)
diff --git a/src/lib/components/drip-list-badge/drip-list-badge.svelte b/src/lib/components/drip-list-badge/drip-list-badge.svelte index 22dbc4afa..6c04b43f6 100644 --- a/src/lib/components/drip-list-badge/drip-list-badge.svelte +++ b/src/lib/components/drip-list-badge/drip-list-badge.svelte @@ -1,6 +1,7 @@ diff --git a/src/lib/components/header/header.svelte b/src/lib/components/header/header.svelte index 0c6ccb5d8..fdbf25212 100644 --- a/src/lib/components/header/header.svelte +++ b/src/lib/components/header/header.svelte @@ -5,8 +5,11 @@ export const HEADER_USER_FRAGMENT = gql` ${COLLECT_BUTTON_WITHDRAWABLE_BALANCE_FRAGMENT} fragment HeaderUser on User { - withdrawableBalances { - ...CollectButtonWithdrawableBalance + chainData { + chain + withdrawableBalances { + ...CollectButtonWithdrawableBalance + } } } `; @@ -26,9 +29,17 @@ import breakpointsStore from '$lib/stores/breakpoints/breakpoints.store'; import type { HeaderUserFragment } from './__generated__/gql.generated'; import walletStore from '$lib/stores/wallet/wallet.store'; + import Flyout from '../flyout/flyout.svelte'; + import NetworkPicker from '../network-picker/network-picker.svelte'; + import NetworkList from '../network-picker/components/network-list.svelte'; + import cupertinoPaneStore from '$lib/stores/cupertino-pane/cupertino-pane.store'; + import filterCurrentChainData from '$lib/utils/filter-current-chain-data'; + import network from '$lib/stores/wallet/network'; export let user: HeaderUserFragment | null; + $: chainData = user?.chainData ? filterCurrentChainData(user.chainData) : undefined; + $: elevated = $scroll.pos > 16; export let showLoadingIndicator = true; @@ -37,6 +48,7 @@ let collectButtonPeeking: boolean; + let networkPickerExpanded = false; $: connected = $walletStore.connected; @@ -60,7 +72,7 @@ {#if connected && ($breakpointsStore?.breakpoint === 'mobile' || $breakpointsStore?.breakpoint === 'tablet')}
@@ -92,6 +104,36 @@ + + {#if network.displayNetworkPicker} +
+
+
+ +
+ (networkPickerExpanded = !networkPickerExpanded)} + /> +
+
+ +
+
+
+
+ +
cupertinoPaneStore.openSheet(NetworkList, undefined)} + on:keydown={() => cupertinoPaneStore.openSheet(NetworkList, undefined)} + > + +
+
+ {/if} {/if}
@@ -99,7 +141,7 @@
{#if $walletStore.connected && ($breakpointsStore?.breakpoint === 'desktop' || $breakpointsStore?.breakpoint === 'desktopWide')}
- +
{/if}
@@ -207,4 +249,31 @@ z-index: 10; } } + + .network-picker-flyout { + display: flex; + align-items: center; + margin-left: 0.5rem; + } + + .network-picker { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + } + + .mobile-only { + display: none; + } + + @media (max-width: 768px) { + .desktop-only { + display: none; + } + + .mobile-only { + display: initial; + } + } diff --git a/src/lib/components/icons/networks/Base.svelte b/src/lib/components/icons/networks/Base.svelte new file mode 100644 index 000000000..74a79ceab --- /dev/null +++ b/src/lib/components/icons/networks/Base.svelte @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/components/icons/networks/Ethereum.svelte b/src/lib/components/icons/networks/Ethereum.svelte new file mode 100644 index 000000000..3e664b186 --- /dev/null +++ b/src/lib/components/icons/networks/Ethereum.svelte @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/components/icons/networks/Filecoin.svelte b/src/lib/components/icons/networks/Filecoin.svelte new file mode 100644 index 000000000..2e0dfdf8a --- /dev/null +++ b/src/lib/components/icons/networks/Filecoin.svelte @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/src/lib/components/icons/networks/Optimism.svelte b/src/lib/components/icons/networks/Optimism.svelte new file mode 100644 index 000000000..62df01b14 --- /dev/null +++ b/src/lib/components/icons/networks/Optimism.svelte @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + diff --git a/src/lib/components/icons/networks/Polygon.svelte b/src/lib/components/icons/networks/Polygon.svelte new file mode 100644 index 000000000..284d08b08 --- /dev/null +++ b/src/lib/components/icons/networks/Polygon.svelte @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + diff --git a/src/lib/components/icons/networks/TestnetFrame.svelte b/src/lib/components/icons/networks/TestnetFrame.svelte new file mode 100644 index 000000000..2e6f4ae72 --- /dev/null +++ b/src/lib/components/icons/networks/TestnetFrame.svelte @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/src/lib/components/identity-card/identity-card.svelte b/src/lib/components/identity-card/identity-card.svelte index 0e2902acc..61ffaa7d2 100644 --- a/src/lib/components/identity-card/identity-card.svelte +++ b/src/lib/components/identity-card/identity-card.svelte @@ -12,18 +12,15 @@ ${PROJECT_AVATAR_FRAGMENT} fragment IdentityCardProject on Project { ...ProjectBadge - ...ProjectAvatar - ... on ClaimedProject { - owner { - address - } - source { - repoName - } + source { + repoName } - ... on UnclaimedProject { - source { - repoName + chainData { + ...ProjectAvatar + ... on ClaimedProjectData { + owner { + address + } } } } @@ -45,6 +42,7 @@ } from '$lib/components/project-avatar/project-avatar.svelte'; import { PROJECT_BADGE_FRAGMENT } from '$lib/components/project-badge/project-badge.svelte'; import Github from '$lib/components/icons/Github.svelte'; + import filterCurrentChainData from '$lib/utils/filter-current-chain-data'; // Either pass address, dripList, or project. Otherwise it will say "TBD" as a placeholder. export let address: string | undefined = undefined; @@ -93,7 +91,7 @@
{#if 'owner' in project}
- +
{/if}
diff --git a/src/lib/components/input-address/input-stream-receiver.svelte b/src/lib/components/input-address/input-stream-receiver.svelte index 251c14cad..f2f3dd8b9 100644 --- a/src/lib/components/input-address/input-stream-receiver.svelte +++ b/src/lib/components/input-address/input-stream-receiver.svelte @@ -6,7 +6,7 @@ import { createEventDispatcher } from 'svelte'; import { BASE_URL } from '$lib/utils/base-url'; import assert from '$lib/utils/assert'; - import { Utils } from 'radicle-drips'; + import { extractDriverNameFromAccountId } from '$lib/utils/sdk/utils/extract-driver-from-accountId'; export let value: string | undefined = undefined; export let validatedValue: string | undefined = undefined; @@ -37,7 +37,7 @@ const dripListId = input.substring(input.lastIndexOf('/') + 1); assert(dripListId); - if (Utils.AccountId.getDriver(dripListId) !== 'nft') { + if (extractDriverNameFromAccountId(dripListId) !== 'nft') { inputValidationState = { type: 'invalid', message: 'Invalid Drip List URL', @@ -82,7 +82,7 @@ message: 'Unable to resolve ENS name', }; } - } else if (input && ethers.utils.isAddress(input)) { + } else if (input && ethers.isAddress(input)) { // is address validatedValue = input; diff --git a/src/lib/components/input-wallet-amount/input-wallet-amount.svelte b/src/lib/components/input-wallet-amount/input-wallet-amount.svelte index 676b31bdc..e2929c50b 100644 --- a/src/lib/components/input-wallet-amount/input-wallet-amount.svelte +++ b/src/lib/components/input-wallet-amount/input-wallet-amount.svelte @@ -4,11 +4,11 @@ import FormField from '../form-field/form-field.svelte'; import TextInput from '../text-input/text-input.svelte'; import Toggle from '../toggle/toggle.svelte'; - import { formatUnits } from 'ethers/lib/utils'; import parseTokenAmount from '$lib/utils/parse-token-amount'; import formatTokenAmount from '$lib/utils/format-token-amount'; import Token from '../token/token.svelte'; import Spinner from '../spinner/spinner.svelte'; + import { formatUnits } from 'ethers'; export let tokenAddress: string | undefined; export let tokenBalance: bigint | undefined; diff --git a/src/lib/components/list-editor/classifiers.ts b/src/lib/components/list-editor/classifiers.ts index 081708c88..f557720a4 100644 --- a/src/lib/components/list-editor/classifiers.ts +++ b/src/lib/components/list-editor/classifiers.ts @@ -8,9 +8,9 @@ import { validateProject, } from './validators'; import { getAddress, getDripList, getProject } from './hydrators'; -import { isAddress } from 'ethers/lib/utils'; import { buildRepositoryURL, isDripsProjectUrl } from '../../utils/build-repo-url'; import type { RecipientClassification } from './types'; +import { isAddress } from 'ethers'; export const classifyRecipient = ( input: string, diff --git a/src/lib/components/list-editor/components/list-editor-input.svelte b/src/lib/components/list-editor/components/list-editor-input.svelte index 431841b42..7ba0f3d85 100644 --- a/src/lib/components/list-editor/components/list-editor-input.svelte +++ b/src/lib/components/list-editor/components/list-editor-input.svelte @@ -9,7 +9,6 @@ import { isSupportedGitUrl } from '$lib/utils/is-valid-git-url'; import { BASE_URL } from '$lib/utils/base-url'; import { type RecipientResult } from '../types'; - import { isAddress } from 'ethers/lib/utils'; import mapFilterUndefined from '$lib/utils/map-filter-undefined'; import DripList from '$lib/components/icons/DripList.svelte'; import List from '$lib/components/icons/List.svelte'; @@ -17,6 +16,7 @@ import ListEditorInputError from './list-editor-input-error.svelte'; import { AddItemError } from '../errors'; import { classifyRecipient } from '$lib/components/list-editor/classifiers'; + import { isAddress } from 'ethers'; const dispatch = createEventDispatcher<{ addAddress: { accountId: string; address: string }; diff --git a/src/lib/components/list-editor/hydrators.ts b/src/lib/components/list-editor/hydrators.ts index fb8038dad..210bf942f 100644 --- a/src/lib/components/list-editor/hydrators.ts +++ b/src/lib/components/list-editor/hydrators.ts @@ -2,20 +2,21 @@ import query from '../../graphql/dripsQL'; import { LIST_EDITOR_DRIP_LIST_FRAGMENT, LIST_EDITOR_PROJECT_FRAGMENT } from './types'; import { gql } from 'graphql-request'; import type { RecipientResult } from './types'; -import { isAddress } from 'ethers/lib/utils'; import type { GetDripListQuery, GetDripListQueryVariables, GetProjectQuery, GetProjectQueryVariables, } from './__generated__/gql.generated'; +import { isAddress } from 'ethers'; +import network from '$lib/stores/wallet/network'; export const getDripList = async (dripListId: string): Promise => { const res = await query( gql` ${LIST_EDITOR_DRIP_LIST_FRAGMENT} - query GetDripList($id: ID!) { - dripList: dripList(id: $id) { + query GetDripList($id: ID!, $chain: SupportedChain!) { + dripList: dripList(id: $id, chain: $chain) { ...ListEditorDripList account { accountId @@ -23,7 +24,7 @@ export const getDripList = async (dripListId: string): Promise } } `, - { id: dripListId }, + { id: dripListId, chain: network.gqlName }, ); if (!res.dripList) { @@ -40,23 +41,16 @@ export const getProject = async (url: string): Promise => { const res = await query( gql` ${LIST_EDITOR_PROJECT_FRAGMENT} - query GetProject($url: String!) { - project: projectByUrl(url: $url) { + query GetProject($url: String!, $chains: [SupportedChain!]!) { + project: projectByUrl(url: $url, chains: $chains) { ...ListEditorProject - ... on ClaimedProject { - account { - accountId - } - } - ... on UnclaimedProject { - account { - accountId - } + account { + accountId } } } `, - { url }, + { url, chains: [network.gqlName] }, ); if (!res.project) { diff --git a/src/lib/components/list-editor/utils/split-receivers-to-list-editor-config.ts b/src/lib/components/list-editor/utils/split-receivers-to-list-editor-config.ts index c2f6a0229..2ce2bddec 100644 --- a/src/lib/components/list-editor/utils/split-receivers-to-list-editor-config.ts +++ b/src/lib/components/list-editor/utils/split-receivers-to-list-editor-config.ts @@ -29,15 +29,8 @@ export const SPLIT_RECEIVERS_TO_LIST_EDITOR_CONFIG_PROJECT_RECEIVER_FRAGMENT = g weight project { ...ListEditorProject - ... on ClaimedProject { - account { - accountId - } - } - ... on UnclaimedProject { - account { - accountId - } + account { + accountId } } } diff --git a/src/lib/components/list-editor/validators.ts b/src/lib/components/list-editor/validators.ts index cb251f3d2..dcd748dbf 100644 --- a/src/lib/components/list-editor/validators.ts +++ b/src/lib/components/list-editor/validators.ts @@ -1,4 +1,4 @@ -import { isAddress } from 'ethers/lib/utils'; +import { isAddress } from 'ethers'; import ensStore from '../../stores/ens/ens.store'; export const reformatUrl = (url: string): string => { diff --git a/src/lib/components/network-picker/components/network-list.svelte b/src/lib/components/network-picker/components/network-list.svelte new file mode 100644 index 000000000..a4128d89b --- /dev/null +++ b/src/lib/components/network-picker/components/network-list.svelte @@ -0,0 +1,104 @@ + + +
+ {#each networksToShow as { chainId, label, icon, color, isTestnet }} + {@const colorRgb = hexToRgb(color)} + +
+
+ + {#if isTestnet} +
+ {/if} +
+
+ {label} + {#if chainId === selectedChainId} + + {/if} +
+ {/each} +
+ + diff --git a/src/lib/components/network-picker/network-picker.svelte b/src/lib/components/network-picker/network-picker.svelte new file mode 100644 index 000000000..e7abbbc2d --- /dev/null +++ b/src/lib/components/network-picker/network-picker.svelte @@ -0,0 +1,59 @@ + + + + + diff --git a/src/lib/components/one-time-donation-editor/one-time-donation-editor.svelte b/src/lib/components/one-time-donation-editor/one-time-donation-editor.svelte index 40da401b0..4b5579f1a 100644 --- a/src/lib/components/one-time-donation-editor/one-time-donation-editor.svelte +++ b/src/lib/components/one-time-donation-editor/one-time-donation-editor.svelte @@ -1,7 +1,5 @@ - + {#if !hideAvatar}
- {#if !forceUnclaimed && isClaimed(processedProject)} + {#if !forceUnclaimed && isClaimed(chainData)}
- +
{/if} -
+
{/if}
diff --git a/src/lib/components/project-card/project-card.svelte b/src/lib/components/project-card/project-card.svelte index 4a4ad05f7..aa0774f77 100644 --- a/src/lib/components/project-card/project-card.svelte +++ b/src/lib/components/project-card/project-card.svelte @@ -3,21 +3,20 @@ ${PROJECT_AVATAR_FRAGMENT} ${PROJECT_NAME_FRAGMENT} fragment ProjectCard on Project { - ...ProjectAvatar ...ProjectName - ... on ClaimedProject { - source { - forge - ownerName - repoName - } + source { + forge + ownerName + repoName } - ... on UnclaimedProject { - source { - forge - ownerName - repoName + chainData { + ... on ClaimedProjectData { + chain + } + ... on UnClaimedProjectData { + chain } + ...ProjectAvatar } } `; @@ -34,8 +33,10 @@ import { gql } from 'graphql-request'; import type { ProjectCardFragment } from './__generated__/gql.generated'; import isClaimed from '$lib/utils/project/is-claimed'; + import filterCurrentChainData from '$lib/utils/filter-current-chain-data'; export let project: ProjectCardFragment; + let projectChainData = filterCurrentChainData(project.chainData);
-
+
+ +
diff --git a/src/lib/components/project-customizer/project-customizer.svelte b/src/lib/components/project-customizer/project-customizer.svelte index 732b78742..c6ba69e0c 100644 --- a/src/lib/components/project-customizer/project-customizer.svelte +++ b/src/lib/components/project-customizer/project-customizer.svelte @@ -1,17 +1,23 @@ @@ -21,18 +27,23 @@ import possibleColors from '$lib/utils/project/possible-colors'; import type { Writable } from 'svelte/store'; import FormField from '../form-field/form-field.svelte'; - import ProjectProfileHeader, { - PROJECT_PROFILE_HEADER_FRAGMENT, - } from '../project-profile-header/project-profile-header.svelte'; + import ProjectProfileHeader from '../project-profile-header/project-profile-header.svelte'; import { gql } from 'graphql-request'; import type { ProjectCustomizerFragment } from './__generated__/gql.generated'; import FileUpload from '../custom-avatar-upload/custom-avatar-upload.svelte'; import TabbedBox from '../tabbed-box/tabbed-box.svelte'; import twemoji from '$lib/utils/twemoji'; + import filterCurrentChainData from '$lib/utils/filter-current-chain-data'; - export let project: Writable; + export let originalProject: ProjectCustomizerFragment; + export let newProjectData: Writable< + ReturnType< + typeof filterCurrentChainData + > + >; - let selectedEmoji = $project.avatar.__typename === 'EmojiAvatar' ? $project.avatar.emoji : '๐Ÿ’ง'; + let activeTab: 'tab-1' | 'tab-2' = + $newProjectData.avatar.__typename === 'EmojiAvatar' ? 'tab-1' : 'tab-2'; let searchTerm = ''; $: filteredEmoji = emoji.filter((e) => { @@ -43,51 +54,72 @@ ); }); - let lastUploadedAvatarCid: string | undefined = - $project.__typename === 'ClaimedProject' && $project.avatar.__typename === 'ImageAvatar' - ? $project.avatar.cid - : undefined; - $: { - if (lastUploadedAvatarCid && activeTab === 'tab-2') { - $project.avatar = { - __typename: 'ImageAvatar', - cid: lastUploadedAvatarCid, - }; - } + let selectedEmoji = + $newProjectData.avatar.__typename === 'EmojiAvatar' ? $newProjectData.avatar.emoji : '๐Ÿ’ง'; + function handleEmojiChange(newEmoji: string) { + $newProjectData.avatar = { + __typename: 'EmojiAvatar', + emoji: newEmoji, + }; + } + $: handleEmojiChange(selectedEmoji); + + let selectedColor = $newProjectData.color; + function handleColorChange(newColor: string) { + $newProjectData.color = newColor; } + $: handleColorChange(selectedColor); + let lastUploadedCid = + $newProjectData.avatar.__typename === 'ImageAvatar' ? $newProjectData.avatar.cid : undefined; function handleFileUpload(e: CustomEvent<{ ipfsCid: string }>) { if (activeTab !== 'tab-2') { return; } - lastUploadedAvatarCid = e.detail.ipfsCid; - } + lastUploadedCid = e.detail.ipfsCid; - let activeTab = $project.avatar.__typename === 'EmojiAvatar' ? 'tab-1' : 'tab-2'; + $newProjectData.avatar = { + __typename: 'ImageAvatar', + cid: lastUploadedCid, + }; + } - $: { - if (activeTab === 'tab-1') { - $project.avatar = { + function handleTabChange(newTab: 'tab-1' | 'tab-2', lastUploadedCid: string | undefined) { + if (newTab === 'tab-1') { + $newProjectData.avatar = { __typename: 'EmojiAvatar', emoji: selectedEmoji, }; + } else if (newTab === 'tab-2' && lastUploadedCid) { + $newProjectData = { + ...$newProjectData, + avatar: { + __typename: 'ImageAvatar', + cid: lastUploadedCid, + }, + }; + } else { + return; } } + $: handleTabChange(activeTab, lastUploadedCid); export let valid = false; - $: valid = Boolean(activeTab === 'tab-1' || lastUploadedAvatarCid); - - let selectedColor = $project.color; - $: $project.color = selectedColor; + $: valid = Boolean(activeTab === 'tab-1' || lastUploadedCid);
- +
+ +
diff --git a/src/lib/components/project-profile-header/project-profile-header.svelte b/src/lib/components/project-profile-header/project-profile-header.svelte index 4d7a00f53..0981a1f1d 100644 --- a/src/lib/components/project-profile-header/project-profile-header.svelte +++ b/src/lib/components/project-profile-header/project-profile-header.svelte @@ -4,18 +4,16 @@ ${PROJECT_AVATAR_FRAGMENT} fragment ProjectProfileHeader on Project { ...ProjectBadge - ...ProjectAvatar - ... on ClaimedProject { - source { - url - } - owner { - address - } + source { + url } - ... on UnclaimedProject { - source { - url + chainData { + ...ProjectAvatar + ... on ClaimedProjectData { + chain + owner { + address + } } } } @@ -38,6 +36,7 @@ import twemoji from '$lib/utils/twemoji'; import IdentityBadge from '../identity-badge/identity-badge.svelte'; import isClaimed from '$lib/utils/project/is-claimed'; + import filterCurrentChainData from '$lib/utils/filter-current-chain-data'; export let project: ProjectProfileHeaderFragment; export let description: string | undefined = undefined; @@ -50,19 +49,21 @@ export let pendingAvatar = false; + $: projectChainData = filterCurrentChainData(project.chainData); + const dispatch = createEventDispatcher<{ editButtonClick: void }>();
- +

{project.source.repoName}

- {#if isClaimed(project)} - + {#if isClaimed(projectChainData)} + {/if}
diff --git a/src/lib/components/projects-section/projects-section.svelte b/src/lib/components/projects-section/projects-section.svelte index 8df802644..46952008a 100644 --- a/src/lib/components/projects-section/projects-section.svelte +++ b/src/lib/components/projects-section/projects-section.svelte @@ -18,6 +18,7 @@ import ClaimProjectStepper from '$lib/flows/claim-project-flow/claim-project-stepper.svelte'; import Plus from '../icons/Plus.svelte'; import modal from '$lib/stores/modal'; + import filterCurrentChainData from '$lib/utils/filter-current-chain-data'; export let projects: ProjectsSectionProjectFragment[]; export let withClaimProjectButton = false; @@ -59,9 +60,10 @@ {#if projects}
{#each projects as project} - {#if isClaimed(project)} + {@const projectChainData = filterCurrentChainData(project.chainData)} + {#if isClaimed(projectChainData)}
- +
diff --git a/src/lib/components/search-bar/search.ts b/src/lib/components/search-bar/search.ts index 501f69b43..6084e7f73 100644 --- a/src/lib/components/search-bar/search.ts +++ b/src/lib/components/search-bar/search.ts @@ -3,9 +3,9 @@ import fuzzysort from 'fuzzysort'; import tokens from '$lib/stores/tokens'; import type { TokenInfoWrapper } from '$lib/stores/tokens/tokens.store'; import { get } from 'svelte/store'; -import { isAddress } from 'ethers/lib/utils'; import { isValidGitUrl } from '$lib/utils/is-valid-git-url'; import GitProjectService from '$lib/utils/project/GitProjectService'; +import { isAddress } from 'ethers'; export enum SearchItemType { PROFILE, diff --git a/src/lib/components/splits/components/split/split.svelte b/src/lib/components/splits/components/split/split.svelte index 7ded0e9b6..79e242c2d 100644 --- a/src/lib/components/splits/components/split/split.svelte +++ b/src/lib/components/splits/components/split/split.svelte @@ -5,8 +5,7 @@ import getContrastColor from '$lib/utils/get-contrast-text-color'; import { getSplitPercent } from '$lib/utils/splits/get-split-percent'; import { fade } from 'svelte/transition'; - import SplitsListComponent, { type Splits } from '../../splits.svelte'; - import type { SplitsComponentSplitsReceiver, SplitGroup } from '../../splits.svelte'; + import SplitsListComponent from '../../splits.svelte'; import Pile from '$lib/components/pile/pile.svelte'; import { tick, type SvelteComponent, onMount } from 'svelte'; import ProjectAvatar from '$lib/components/project-avatar/project-avatar.svelte'; @@ -17,6 +16,9 @@ import ChevronRight from '$lib/components/icons/ChevronRight.svelte'; import isClaimed from '$lib/utils/project/is-claimed'; import { browser } from '$app/environment'; + import filterCurrentChainData from '$lib/utils/filter-current-chain-data'; + import unreachable from '$lib/utils/unreachable'; + import type { SplitGroup, Splits, SplitsComponentSplitsReceiver } from '../../types'; export let split: SplitsComponentSplitsReceiver | SplitGroup; export let disableLink = true; @@ -96,7 +98,7 @@ return { component: ProjectAvatar, props: { - project: s.project, + project: filterCurrentChainData(s.project.chainData), outline: true, }, } as ComponentAndProps; @@ -190,7 +192,15 @@ {:else if split.__typename === 'DripListReceiver'} {:else if split.__typename === 'ProjectReceiver'} - + {@const projectReceiverChainData = + split.__typename === 'ProjectReceiver' + ? filterCurrentChainData(split.project.chainData) + : unreachable()} + - import type { Items, Weights } from '$lib/components/list-editor/types'; - import mapFilterUndefined from '$lib/utils/map-filter-undefined'; - import type { - ProjectForVoteReceiverQuery, - ProjectForVoteReceiverQueryVariables, - DripListForVoteReceiverQuery, - DripListForVoteReceiverQueryVariables, - } from './__generated__/gql.generated'; - import { gql } from 'graphql-request'; - - export const SPLITS_COMPONENT_PROJECT_SPLITS_FRAGMENT = gql` - fragment SplitsComponentProjectSplits on Project { - ... on ClaimedProject { - splits { - dependencies { - ... on AddressReceiver { - ...EditProjectSplitsFlowAddressReceiver - account { - address - } - } - ... on ProjectReceiver { - ...EditProjectSplitsFlowProjectReceiver - project { - ...ProjectAvatar - } - } - ... on DripListReceiver { - ...EditProjectSplitsFlowDripListReceiver - dripList { - ...DripListBadge - } - } - } - maintainers { - ... on AddressReceiver { - ...EditProjectSplitsFlowAddressReceiver - account { - address - } - } - } - } - } - } - `; - - export const SPLITS_COMPONENT_PROJECT_FRAGMENT = gql` - ${PROJECT_BADGE_FRAGMENT} - fragment SplitsComponentProject on Project { - ...ProjectBadge - ... on UnclaimedProject { - source { - repoName - ownerName - } - } - ... on ClaimedProject { - owner { - address - } - source { - repoName - ownerName - } - color - } - } - `; - - export const SPLITS_COMPONENT_DRIP_LIST_FRAGMENT = gql` - fragment SplitsComponentDripList on DripList { - account { - accountId - } - name - owner { - address - } - } - `; - - export const SPLITS_COMPONENT_PROJECT_RECEIVER_FRAGMENT = gql` - ${SPLITS_COMPONENT_PROJECT_FRAGMENT} - fragment SplitsComponentProjectReceiver on ProjectReceiver { - weight - project { - ...SplitsComponentProject - } - } - `; - - export const SPLITS_COMPONENT_DRIP_LIST_RECEIVER_FRAGMENT = gql` - ${SPLITS_COMPONENT_DRIP_LIST_FRAGMENT} - fragment SplitsComponentDripListReceiver on DripListReceiver { - weight - dripList { - ...SplitsComponentDripList - } - } - `; - - export const SPLITS_COMPONENT_ADDRESS_RECEIVER_FRAGMENT = gql` - fragment SplitsComponentAddressReceiver on AddressReceiver { - weight - account { - address - } - } - `; - - export type SplitsComponentSplitsReceiver = - | SplitsComponentAddressReceiverFragment - | SplitsComponentDripListReceiverFragment - | SplitsComponentProjectReceiverFragment; - - export type Splits = (SplitGroup | SplitsComponentSplitsReceiver)[]; - - export interface SplitGroup { - __typename: 'SplitGroup'; - list: Splits; - name?: string; - } - - export function mapSplitsFromListEditorData( - items: Items, - weights: Weights, - groupPercentage: number, - ): SplitsComponentSplitsReceiver[] { - return mapFilterUndefined(Object.keys(items), (accountId) => { - const item = items[accountId]; - - const weight = Math.floor((groupPercentage / 100) * weights[accountId]); - - switch (item.type) { - case 'address': - return { - __typename: 'AddressReceiver', - account: { - __typename: 'AddressDriverAccount', - address: item.address, - }, - weight, - }; - case 'project': - return { - __typename: 'ProjectReceiver', - project: item.project, - weight, - }; - case 'drip-list': - return { - __typename: 'DripListReceiver', - dripList: item.dripList, - weight, - }; - } - }); - } - - export async function mapSplitsFromMultiplayerResults( - receivers: VoteReceiver[], - f = fetch, - ): Promise { - const receiversToFetchDataFor = receivers.filter( - (v): v is ProjectVoteReceiver | DripListVoteReceiver => { - return 'type' in v && (v.type === 'project' || v.type === 'dripList'); - }, - ); - - const receiversData = mapFilterUndefined( - await Promise.all( - receiversToFetchDataFor.map(async (v) => { - const projectQuery = gql` - ${SPLITS_COMPONENT_PROJECT_FRAGMENT} - query ProjectForVoteReceiver($url: String!) { - projectByUrl(url: $url) { - ...SplitsComponentProject - } - } - `; - - const dripListQuery = gql` - ${SPLITS_COMPONENT_DRIP_LIST_FRAGMENT} - query DripListForVoteReceiver($id: ID!) { - dripList(id: $id) { - ...SplitsComponentDripList - } - } - `; - - if (v.type === 'dripList') { - return ( - await query( - dripListQuery, - { - id: v.accountId, - }, - f, - ) - ).dripList; - } else { - return ( - await query( - projectQuery, - { url: v.url }, - f, - ) - ).projectByUrl; - } - }), - ), - (v) => (v ? v : undefined), - ); - - return mapFilterUndefined(receivers, (v) => { - switch (v.type) { - case 'address': - return { - __typename: 'AddressReceiver', - account: { - __typename: 'AddressDriverAccount', - address: v.address, - }, - weight: v.weight, - }; - case 'project': { - const project = receiversData.find( - (p): p is Extract => - p.__typename !== 'DripList' && p.source.url === v.url, - ); - if (!project) throw new Error(`Project not found for url: ${v.url}`); - - return { - __typename: 'ProjectReceiver', - project: project, - weight: v.weight, - }; - } - case 'dripList': { - const dripList = receiversData.find( - (d): d is Extract => - d.__typename === 'DripList' && d.account.accountId === v.accountId, - ); - if (!dripList) throw new Error(`DripList not found for accountId: ${v.accountId}`); - - return { - __typename: 'DripListReceiver', - dripList: dripList, - weight: v.weight, - }; - } - } - }); - } - - {#if url} - โ€ข View on Etherscan + โ€ข
View on {explorerName} {/if} diff --git a/src/lib/flows/pause-flow/pause.svelte b/src/lib/flows/pause-flow/pause.svelte index c12990f84..ca647346c 100644 --- a/src/lib/flows/pause-flow/pause.svelte +++ b/src/lib/flows/pause-flow/pause.svelte @@ -15,7 +15,6 @@ diff --git a/src/routes/app/(app)/projects/(forges)/components/project-profile/project-profile.svelte b/src/routes/app/(app)/projects/(forges)/components/project-profile/project-profile.svelte index b2363d6dc..db0d124d6 100644 --- a/src/routes/app/(app)/projects/(forges)/components/project-profile/project-profile.svelte +++ b/src/routes/app/(app)/projects/(forges)/components/project-profile/project-profile.svelte @@ -1,7 +1,7 @@