├── .env.example
├── .eslintrc.json
├── .gitignore
├── .vscode
├── ltex.dictionary.en-US.txt
└── settings.json
├── LICENSE.md
├── README.md
├── jsconfig.json
├── markdoc
├── nodes.js
├── partials
│ ├── token-standard-full.md
│ └── token-standard-short.md
└── tags.js
├── next.config.js
├── package.json
├── pnpm-lock.yaml
├── postcss.config.js
├── prettier.config.js
├── public
├── android-chrome-192x192.png
├── android-chrome-512x512.png
├── apple-touch-icon.png
├── assets
│ ├── banners
│ │ └── touch-screen.jpg
│ ├── candy-machine
│ │ ├── candy-machine-photo.png
│ │ ├── core-cm-v3.jpg
│ │ └── creator-studio.png
│ ├── social
│ │ └── dev-hub-preview.jpg
│ └── token-metadata
│ │ └── test-image.png
├── browserconfig.xml
├── favicon-16x16.png
├── favicon-32x32.png
├── favicon.ico
├── fonts
│ ├── Inter-italic.var.woff2
│ ├── Inter-roman.var.woff2
│ ├── lexend.txt
│ └── lexend.woff2
├── images
│ ├── hybrid-ui-template-image.jpg
│ └── metaplex-next-js-template.png
├── mstile-144x144.png
├── mstile-150x150.png
├── mstile-310x150.png
├── mstile-310x310.png
├── mstile-70x70.png
├── robots.txt
├── safari-pinned-tab.svg
└── site.webmanifest
├── src
├── components
│ ├── Button.jsx
│ ├── Callout.jsx
│ ├── DialectContext.jsx
│ ├── DialectSwitcher.jsx
│ ├── Fence.jsx
│ ├── Header.jsx
│ ├── Hero.jsx
│ ├── HeroCode.jsx
│ ├── HeroScreenshot.jsx
│ ├── Image.jsx
│ ├── Layout.jsx
│ ├── MobileNavigation.jsx
│ ├── NavList.jsx
│ ├── Navigation.jsx
│ ├── Prose.jsx
│ ├── QuickLinks.jsx
│ ├── Search.jsx
│ ├── Seperator.jsx
│ ├── TableOfContent.jsx
│ ├── ThemeSelector.jsx
│ ├── Totem.jsx
│ ├── Video.jsx
│ ├── apiComponents
│ │ ├── apiComponentWrapper.jsx
│ │ ├── apiParams.jsx
│ │ ├── endPointSelector.jsx
│ │ ├── exampleSelector.jsx
│ │ ├── languageComponents
│ │ │ ├── cSharpRenderer.jsx
│ │ │ ├── curlRequestRenderer.jsx
│ │ │ ├── goRequestRenderer.jsx
│ │ │ ├── javaRenderer.jsx
│ │ │ ├── javascriptRequestRenderer.jsx
│ │ │ ├── kotlinRenderer.jsx
│ │ │ ├── phpRenderer.jsx
│ │ │ ├── pythonRequestRenderer.jsx
│ │ │ ├── rubyRenderer.jsx
│ │ │ ├── rustRenderer.jsx
│ │ │ ├── swiftRenderer.jsx
│ │ │ └── umiRequestRenderer.jsx
│ │ ├── languageRenderer.jsx
│ │ ├── languageSelector.jsx
│ │ └── responce.jsx
│ ├── diagrams
│ │ ├── Diagram.jsx
│ │ ├── DiagramWhimsical.jsx
│ │ ├── FloatingEdge.jsx
│ │ ├── Node.jsx
│ │ ├── index.js
│ │ ├── useDownloadImage.js
│ │ ├── useFullscreen.js
│ │ ├── useTransforms.js
│ │ └── utils.jsx
│ ├── helperComponents
│ │ ├── badgesList.jsx
│ │ ├── packages.js
│ │ └── packagesUsed.jsx
│ ├── icons
│ │ ├── RustIcon.jsx
│ │ ├── TrafficLightsIcon.jsx
│ │ ├── dual-tone
│ │ │ ├── InstallationIcon.jsx
│ │ │ ├── LightbulbIcon.jsx
│ │ │ ├── PluginsIcon.jsx
│ │ │ ├── PresetsIcon.jsx
│ │ │ ├── ThemingIcon.jsx
│ │ │ ├── WarningIcon.jsx
│ │ │ └── index.jsx
│ │ ├── index.jsx
│ │ ├── languages
│ │ │ ├── CSharpIcon.jsx
│ │ │ ├── CurlIcon.jsx
│ │ │ ├── GoIcon.jsx
│ │ │ ├── JavaIcon.jsx
│ │ │ ├── JavaScriptIcon.jsx
│ │ │ ├── KotlinIcon.jsx
│ │ │ ├── PhpIcon.jsx
│ │ │ ├── PythonIcon.jsx
│ │ │ ├── RubyIcon.jsx
│ │ │ ├── RustIcon.jsx
│ │ │ ├── ShellIcon.jsx
│ │ │ ├── SwiftIcon.jsx
│ │ │ └── TypescriptIcon.jsx
│ │ └── spinner.jsx
│ └── products
│ │ ├── Badge.jsx
│ │ ├── CopyToClipboard.jsx
│ │ ├── Grid.jsx
│ │ ├── GridAllProducts.jsx
│ │ ├── IconWithName.jsx
│ │ ├── MobileAppGrid.jsx
│ │ ├── Sections.jsx
│ │ ├── SwitcherDialog.jsx
│ │ ├── SwitcherPopover.jsx
│ │ ├── amman
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── aura
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── bubblegum-v2
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── bubblegum
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── candyMachine
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── cli
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── core
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── coreCandyMachine
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── das-api
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── fusion
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── global
│ │ ├── Hero.jsx
│ │ ├── Logo.jsx
│ │ └── index.js
│ │ ├── guides
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── hydra
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── index.js
│ │ ├── inscription
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── legacyDocumentation
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── mpl-hybrid
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── sugar
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── tokenAuthRules
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ ├── tokenMetadata
│ │ ├── Hero.jsx
│ │ └── index.js
│ │ └── umi
│ │ ├── Hero.jsx
│ │ └── index.js
├── images
│ ├── blur-cyan.png
│ ├── blur-indigo.png
│ ├── core-banner.jpg
│ ├── holo-code.jpg
│ └── logos
│ │ ├── discord-mark-white.png
│ │ ├── github-mark-white.png
│ │ ├── github-mark.png
│ │ └── x-black.png
├── lib
│ └── api
│ │ ├── aura
│ │ ├── das
│ │ │ ├── getAssestByAuthority.js
│ │ │ ├── getAsset.js
│ │ │ ├── getAssetBatch.js
│ │ │ ├── getAssetProof.js
│ │ │ ├── getAssetProofBatch.js
│ │ │ ├── getAssetsByCreator.js
│ │ │ ├── getAssetsByGroup.js
│ │ │ ├── getAssetsByOwner.js
│ │ │ ├── getSignaturesForAsset.js
│ │ │ ├── getTokenAccounts.js
│ │ │ └── searchAssest.js
│ │ ├── methods.js
│ │ └── template.js
│ │ ├── renderRequestBody.js
│ │ └── template.js
├── middleware.js
├── pages
│ ├── 404.md
│ ├── _app.jsx
│ ├── _document.jsx
│ ├── amman
│ │ ├── cli-commands.md
│ │ ├── configuration.md
│ │ ├── getting-started.md
│ │ ├── index.md
│ │ └── pre-made-configs.md
│ ├── aura
│ │ ├── api
│ │ │ └── v1
│ │ │ │ ├── das
│ │ │ │ ├── get-asset-batch.md
│ │ │ │ ├── get-asset-proof-batch.md
│ │ │ │ ├── get-asset-proof.md
│ │ │ │ ├── get-asset.md
│ │ │ │ ├── get-assets-by-authority.md
│ │ │ │ ├── get-assets-by-creator.md
│ │ │ │ ├── get-assets-by-group.md
│ │ │ │ ├── get-assets-by-owner.md
│ │ │ │ ├── get-signatures-for-asset.md
│ │ │ │ ├── get-token-accounts.md
│ │ │ │ └── search-assets.md
│ │ │ │ └── testApiMethod.md
│ │ ├── blockchains
│ │ │ ├── eclipse.md
│ │ │ └── solana.md
│ │ ├── faq.md
│ │ ├── index.md
│ │ └── reading-solana-and-svm-data.md
│ ├── bubblegum-v2
│ │ ├── burn-cnfts.md
│ │ ├── collections.md
│ │ ├── concurrent-merkle-trees.md
│ │ ├── create-trees.md
│ │ ├── delegate-cnfts.md
│ │ ├── delegate-trees.md
│ │ ├── faq.md
│ │ ├── fetch-cnfts.md
│ │ ├── freeze-cnfts.md
│ │ ├── hashed-nft-data.md
│ │ ├── index.md
│ │ ├── merkle-tree-canopy.md
│ │ ├── mint-cnfts.md
│ │ ├── sdk
│ │ │ ├── index.md
│ │ │ ├── javascript.md
│ │ │ └── rust.md
│ │ ├── stored-nft-data.md
│ │ ├── transfer-cnfts.md
│ │ ├── update-cnfts.md
│ │ └── verify-creators.md
│ ├── bubblegum
│ │ ├── burn-cnfts.md
│ │ ├── create-trees.md
│ │ ├── decompress-cnfts.md
│ │ ├── delegate-cnfts.md
│ │ ├── delegate-trees.md
│ │ ├── guides
│ │ │ ├── index.md
│ │ │ └── javascript
│ │ │ │ ├── how-to-create-1000000-nfts-on-solana.md
│ │ │ │ └── how-to-interact-with-cnfts-on-other-svms.md
│ │ ├── index.md
│ │ ├── mint-cnfts.md
│ │ ├── sdk
│ │ │ ├── index.md
│ │ │ ├── javascript.md
│ │ │ └── rust.md
│ │ ├── transfer-cnfts.md
│ │ ├── update-cnfts.md
│ │ ├── verify-collections.md
│ │ └── verify-creators.md
│ ├── candy-machine
│ │ ├── custom-guards
│ │ │ └── generating-client.md
│ │ ├── getting-started
│ │ │ ├── index.md
│ │ │ ├── js.md
│ │ │ └── rust.md
│ │ ├── guard-groups.md
│ │ ├── guard-route.md
│ │ ├── guards.md
│ │ ├── guards
│ │ │ ├── address-gate.md
│ │ │ ├── allocation.md
│ │ │ ├── allow-list.md
│ │ │ ├── bot-tax.md
│ │ │ ├── end-date.md
│ │ │ ├── freeze-sol-payment.md
│ │ │ ├── freeze-token-payment.md
│ │ │ ├── gatekeeper.md
│ │ │ ├── mint-limit.md
│ │ │ ├── nft-burn.md
│ │ │ ├── nft-gate.md
│ │ │ ├── nft-payment.md
│ │ │ ├── program-gate.md
│ │ │ ├── redeemed-amount.md
│ │ │ ├── sol-payment.md
│ │ │ ├── start-date.md
│ │ │ ├── third-party-signer.md
│ │ │ ├── token-burn.md
│ │ │ ├── token-gate.md
│ │ │ ├── token-payment.md
│ │ │ └── token2022-payment.md
│ │ ├── guides
│ │ │ ├── airdrop-mint-to-another-wallet.md
│ │ │ ├── create-an-nft-collection-on-solana-with-candy-machine.md
│ │ │ ├── index.md
│ │ │ └── mint-to-another-wallet.md
│ │ ├── index.md
│ │ ├── insert-items.md
│ │ ├── manage.md
│ │ ├── mint.md
│ │ ├── pnfts.md
│ │ ├── references
│ │ │ └── index.md
│ │ ├── settings.md
│ │ └── sugar
│ │ │ ├── bring-your-own-uploader.md
│ │ │ ├── cache.md
│ │ │ ├── commands
│ │ │ ├── airdrop.md
│ │ │ ├── bundlr.md
│ │ │ ├── collection.md
│ │ │ ├── config.md
│ │ │ ├── deploy.md
│ │ │ ├── freeze.md
│ │ │ ├── guard.md
│ │ │ ├── hash.md
│ │ │ ├── launch.md
│ │ │ ├── mint.md
│ │ │ ├── reveal.md
│ │ │ ├── show.md
│ │ │ ├── sign.md
│ │ │ ├── update.md
│ │ │ ├── upload.md
│ │ │ ├── validate.md
│ │ │ ├── verify.md
│ │ │ └── withdraw.md
│ │ │ ├── configuration.md
│ │ │ ├── getting-started.md
│ │ │ ├── index.md
│ │ │ └── installation.md
│ ├── cli
│ │ ├── config
│ │ │ ├── explorer.md
│ │ │ ├── rpcs.md
│ │ │ └── wallets.md
│ │ ├── core
│ │ │ ├── create-asset.md
│ │ │ ├── create-collection.md
│ │ │ ├── fetch.md
│ │ │ ├── plugins.md
│ │ │ └── update-asset.md
│ │ ├── index.md
│ │ ├── installation.md
│ │ └── toolbox
│ │ │ ├── sol-airdrop.md
│ │ │ ├── sol-balance.md
│ │ │ ├── sol-transfer.md
│ │ │ ├── token-create.md
│ │ │ └── token-transfer.md
│ ├── community-guides.md
│ ├── contact.md
│ ├── core-candy-machine
│ │ ├── create.md
│ │ ├── custom-guards
│ │ │ └── generating-client.md
│ │ ├── fetching-a-candy-machine.md
│ │ ├── guard-groups.md
│ │ ├── guard-route.md
│ │ ├── guards.md
│ │ ├── guards
│ │ │ ├── address-gate.md
│ │ │ ├── allocation.md
│ │ │ ├── allow-list.md
│ │ │ ├── asset-burn-multi.md
│ │ │ ├── asset-burn.md
│ │ │ ├── asset-gate.md
│ │ │ ├── asset-mint-limit.md
│ │ │ ├── asset-payment-multi.md
│ │ │ ├── asset-payment.md
│ │ │ ├── bot-tax.md
│ │ │ ├── edition.md
│ │ │ ├── end-date.md
│ │ │ ├── freeze-sol-payment.md
│ │ │ ├── freeze-token-payment.md
│ │ │ ├── gatekeeper.md
│ │ │ ├── mint-limit.md
│ │ │ ├── nft-burn.md
│ │ │ ├── nft-gate.md
│ │ │ ├── nft-mint-limit.md
│ │ │ ├── nft-payment.md
│ │ │ ├── program-gate.md
│ │ │ ├── redeemed-amount.md
│ │ │ ├── sol-fixed-fee.md
│ │ │ ├── sol-payment.md
│ │ │ ├── start-date.md
│ │ │ ├── third-party-signer.md
│ │ │ ├── token-burn.md
│ │ │ ├── token-gate.md
│ │ │ ├── token-payment.md
│ │ │ ├── token2022-payment.md
│ │ │ └── vanity-mint.md
│ │ ├── guides
│ │ │ ├── create-a-core-candy-machine-ui.md
│ │ │ ├── create-a-core-candy-machine-with-hidden-settings.md
│ │ │ └── index.md
│ │ ├── index.md
│ │ ├── insert-items.md
│ │ ├── mint.md
│ │ ├── overview.md
│ │ ├── preparing-assets.md
│ │ ├── references
│ │ │ └── index.md
│ │ ├── sdk
│ │ │ ├── index.md
│ │ │ ├── javascript.md
│ │ │ └── rust.md
│ │ ├── update.md
│ │ └── withdrawing-a-candy-machine.md
│ ├── core
│ │ ├── burn.md
│ │ ├── collections.md
│ │ ├── core-js-sdk-v1-0.md
│ │ ├── create-asset.md
│ │ ├── deserialization.md
│ │ ├── ecosystem-support.md
│ │ ├── execute-asset-signing.md
│ │ ├── external-plugins
│ │ │ ├── adding-external-plugins.md
│ │ │ ├── app-data.md
│ │ │ ├── oracle.md
│ │ │ ├── overview.md
│ │ │ └── removing-external-plugins.md
│ │ ├── faq.md
│ │ ├── fetch.md
│ │ ├── guides
│ │ │ ├── anchor
│ │ │ │ ├── anchor-staking-example.md
│ │ │ │ ├── how-to-create-a-core-collection-with-anchor.md
│ │ │ │ └── how-to-create-a-core-nft-asset-with-anchor.md
│ │ │ ├── create-soulbound-nft-asset.md
│ │ │ ├── immutability.md
│ │ │ ├── index.md
│ │ │ ├── javascript
│ │ │ │ ├── how-to-create-a-core-collection-with-javascript.md
│ │ │ │ ├── how-to-create-a-core-nft-asset-with-javascript.md
│ │ │ │ └── web2-typescript-staking-example.md
│ │ │ ├── loyalty-card-concept-guide.md
│ │ │ ├── onchain-ticketing-with-appdata.md
│ │ │ ├── oracle-plugin-example.md
│ │ │ └── print-editions.md
│ │ ├── helpers.md
│ │ ├── index.md
│ │ ├── json-schema.md
│ │ ├── plugins
│ │ │ ├── addBlocker.md
│ │ │ ├── adding-plugins.md
│ │ │ ├── attribute.md
│ │ │ ├── autograph.md
│ │ │ ├── bubblegum.md
│ │ │ ├── burn-delegate.md
│ │ │ ├── delegating-and-revoking-plugins.md
│ │ │ ├── edition.md
│ │ │ ├── freeze-delegate.md
│ │ │ ├── immutableMetadata.md
│ │ │ ├── index.md
│ │ │ ├── master-edition.md
│ │ │ ├── permanent-burn-delegate.md
│ │ │ ├── permanent-freeze-delegate.md
│ │ │ ├── permanent-transfer-delegate.md
│ │ │ ├── removing-plugins.md
│ │ │ ├── royalties.md
│ │ │ ├── transfer-delegate.md
│ │ │ ├── update-delegate.md
│ │ │ └── verified-creators.md
│ │ ├── sdk
│ │ │ ├── index.md
│ │ │ ├── javascript.md
│ │ │ └── rust.md
│ │ ├── tm-differences.md
│ │ ├── transfer.md
│ │ ├── update.md
│ │ ├── using-core-in-anchor.md
│ │ └── what-is-an-asset.md
│ ├── das-api
│ │ ├── core-extension
│ │ │ ├── convert-das-asset-to-core.md
│ │ │ ├── index.md
│ │ │ ├── methods
│ │ │ │ ├── get-asset.md
│ │ │ │ ├── get-assets-by-authority.md
│ │ │ │ ├── get-assets-by-collection.md
│ │ │ │ ├── get-assets-by-owner.md
│ │ │ │ ├── get-collection.md
│ │ │ │ ├── search-assets.md
│ │ │ │ └── search-collections.md
│ │ │ └── plugin-derivation.md
│ │ ├── getting-started.md
│ │ ├── index.md
│ │ └── methods
│ │ │ ├── get-asset-by-authority.md
│ │ │ ├── get-asset-by-creator.md
│ │ │ ├── get-asset-by-group.md
│ │ │ ├── get-asset-by-owner.md
│ │ │ ├── get-asset-proof.md
│ │ │ ├── get-asset-proofs.md
│ │ │ ├── get-asset-signatures.md
│ │ │ ├── get-asset.md
│ │ │ ├── get-assets.md
│ │ │ ├── index.md
│ │ │ └── search-assets.md
│ ├── developer-tools.md
│ ├── fusion
│ │ ├── constraint-types.md
│ │ ├── getting-started.md
│ │ ├── index.md
│ │ └── transfer-effects.md
│ ├── guides
│ │ ├── general
│ │ │ ├── create-deterministic-metadata-with-turbo.md
│ │ │ ├── how-to-diagnose-solana-transaction-errors.md
│ │ │ ├── payer-authority-pattern.md
│ │ │ └── spl-token-claim-airdrop-using-gumdrop.md
│ │ ├── index.md
│ │ ├── javascript
│ │ │ ├── how-to-add-metadata-to-spl-tokens.md
│ │ │ ├── how-to-create-a-solana-token.md
│ │ │ ├── how-to-create-an-nft-on-solana.md
│ │ │ ├── how-to-transfer-sol-on-solana.md
│ │ │ └── how-to-transfer-spl-tokens-on-solana.md
│ │ ├── rpcs-and-das.md
│ │ ├── rust
│ │ │ ├── getting-started-with-rust.md
│ │ │ ├── how-to-cpi-into-a-metaplex-program.md
│ │ │ ├── metaplex-rust-sdks.md
│ │ │ └── working-with-rust.md
│ │ ├── setup-a-local-validator.md
│ │ ├── solana-programs.md
│ │ ├── templates
│ │ │ └── metaplex-nextjs-tailwind-template.md
│ │ ├── translated
│ │ │ └── japanese.md
│ │ ├── understanding-pdas.md
│ │ ├── validators.md
│ │ ├── what-is-solana.md
│ │ └── where-do-i-start.md
│ ├── hydra
│ │ ├── index.md
│ │ └── quick-start.md
│ ├── index.md
│ ├── inscription
│ │ ├── authority.md
│ │ ├── clear.md
│ │ ├── close.md
│ │ ├── faq.md
│ │ ├── fetch.md
│ │ ├── getting-started
│ │ │ ├── cli.md
│ │ │ ├── index.md
│ │ │ ├── js.md
│ │ │ └── rust.md
│ │ ├── index.md
│ │ ├── initialize.md
│ │ ├── sharding.md
│ │ └── write.md
│ ├── legacy-documentation
│ │ ├── auction-house
│ │ │ ├── auctioneer.md
│ │ │ ├── buyer-escrow.md
│ │ │ ├── faq.md
│ │ │ ├── find.md
│ │ │ ├── getting-started.md
│ │ │ ├── index.md
│ │ │ ├── manage-using-cli.md
│ │ │ ├── manage.md
│ │ │ ├── receipts.md
│ │ │ ├── settings.md
│ │ │ └── trading-assets.md
│ │ ├── developer-tools
│ │ │ ├── beet.md
│ │ │ ├── cusper.md
│ │ │ ├── rust-bin.md
│ │ │ ├── shank.md
│ │ │ └── solita.md
│ │ ├── fixed-price-sale
│ │ │ ├── index.md
│ │ │ └── tech-description.md
│ │ ├── gumdrop.md
│ │ ├── index.md
│ │ ├── mobile-sdks
│ │ │ ├── android.md
│ │ │ └── ios.md
│ │ └── token-entangler.md
│ ├── mpl-hybrid
│ │ ├── create-escrow.md
│ │ ├── escrow.md
│ │ ├── faq.md
│ │ ├── fetch-escrow.md
│ │ ├── funding-escrow.md
│ │ ├── guides
│ │ │ ├── create-your-first-hybrid-collection.md
│ │ │ ├── index.md
│ │ │ └── mpl-404-hybrid-ui-template.md
│ │ ├── index.md
│ │ ├── initializeNFTData.md
│ │ ├── preparation.md
│ │ ├── sdk
│ │ │ ├── index.md
│ │ │ └── javascript.md
│ │ ├── swapping-nfts-to-tokens.md
│ │ ├── swapping-tokens-to-nfts.md
│ │ ├── swapping.md
│ │ └── update-escrow.md
│ ├── official-links.md
│ ├── programs-and-tools.md
│ ├── protocol-fees.md
│ ├── rpc-providers.md
│ ├── security.md
│ ├── sitemap.xml.js
│ ├── stability-index.md
│ ├── storage-providers.md
│ ├── token-auth-rules
│ │ ├── buffers.md
│ │ ├── composite-rules
│ │ │ ├── all.md
│ │ │ ├── any.md
│ │ │ └── not.md
│ │ ├── create-or-update.md
│ │ ├── index.md
│ │ ├── mplx-rule-sets.md
│ │ ├── primitive-rules
│ │ │ ├── additional-signer.md
│ │ │ ├── amount.md
│ │ │ ├── namespace.md
│ │ │ ├── pass.md
│ │ │ ├── pda-match.md
│ │ │ ├── program-owned.md
│ │ │ └── pubkey-match.md
│ │ ├── references
│ │ │ └── index.md
│ │ └── validate.md
│ ├── token-metadata
│ │ ├── burn.md
│ │ ├── collections.md
│ │ ├── creators.md
│ │ ├── delegates.md
│ │ ├── escrow.md
│ │ ├── faq.md
│ │ ├── fetch.md
│ │ ├── getting-started
│ │ │ ├── index.md
│ │ │ ├── js.md
│ │ │ └── rust.md
│ │ ├── guides
│ │ │ ├── account-size-reduction.md
│ │ │ ├── anchor
│ │ │ │ └── token-claimer-smart-contract.md
│ │ │ ├── get-by-collection.md
│ │ │ ├── index.md
│ │ │ └── javascript
│ │ │ │ └── create-an-nft.md
│ │ ├── index.md
│ │ ├── lock.md
│ │ ├── mint.md
│ │ ├── pnfts.md
│ │ ├── print.md
│ │ ├── token-2022.md
│ │ ├── token-standard.md
│ │ ├── transfer.md
│ │ └── update.md
│ ├── umi
│ │ ├── accounts.md
│ │ ├── getting-started
│ │ │ └── index.md
│ │ ├── guides
│ │ │ ├── index.md
│ │ │ ├── optimal-transactions-with-compute-units-and-priority-fees.md
│ │ │ └── serializing-and-deserializing-transactions.md
│ │ ├── helpers.md
│ │ ├── http-requests.md
│ │ ├── implementations.md
│ │ ├── index.md
│ │ ├── interfaces.md
│ │ ├── kinobi.md
│ │ ├── metaplex-umi-plugins.md
│ │ ├── plugins.md
│ │ ├── programs.md
│ │ ├── public-keys-and-signers.md
│ │ ├── rpc.md
│ │ ├── serializers.md
│ │ ├── storage.md
│ │ ├── toolbox
│ │ │ ├── address-lookup-table.md
│ │ │ ├── create-account.md
│ │ │ ├── index.md
│ │ │ ├── priority-fees-and-compute-managment.md
│ │ │ ├── token-managment.md
│ │ │ ├── transaction-memo.md
│ │ │ └── transfer-sol.md
│ │ ├── transactions.md
│ │ └── web3js-differences-and-adapters.md
│ └── understanding-programs.md
├── shared
│ ├── sections.js
│ ├── useAccentClass.js
│ ├── useLightense.js
│ └── usePage.js
└── styles
│ ├── accent.css
│ ├── docsearch.css
│ ├── extra.css
│ ├── fonts.css
│ ├── prism.css
│ ├── react-flow.css
│ ├── scrollbar.css
│ ├── tailwind.css
│ └── totem.css
└── tailwind.config.js
/.env.example:
--------------------------------------------------------------------------------
1 | NEXT_PUBLIC_DOCSEARCH_APP_ID=R2IYF7ETH7
2 | NEXT_PUBLIC_DOCSEARCH_API_KEY=599cec31baffa4868cae4e79f180729b
3 | NEXT_PUBLIC_DOCSEARCH_INDEX_NAME=docsearch
4 | NEXT_PUBLIC_HOTJAR_ID=3793483
5 | NEXT_PUBLIC_HOTJAR_VERSION=6
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals"
3 | }
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # next.js
12 | /.next/
13 | /out/
14 |
15 | # production
16 | /build
17 |
18 | # misc
19 | .DS_Store
20 | *.pem
21 |
22 | # debug
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 | .pnpm-debug.log*
27 |
28 | # local env files
29 | .env*.local
30 | .env
31 |
32 | # vercel
33 | .vercel
34 |
35 | .vscode/settings.json
36 |
37 |
--------------------------------------------------------------------------------
/.vscode/ltex.dictionary.en-US.txt:
--------------------------------------------------------------------------------
1 | Umi
2 | Solana
3 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "cSpell.words": [
3 | "Arweave",
4 | "bincode",
5 | "blockhash",
6 | "Blocktime",
7 | "Bundlr",
8 | "callout",
9 | "composability",
10 | "Datas",
11 | "Devnet",
12 | "disciminant",
13 | "eddsa",
14 | "gamification",
15 | "hashlist",
16 | "Hookable",
17 | "Irys",
18 | "Keypair",
19 | "Kinobi",
20 | "lamports",
21 | "Localnet",
22 | "Memecoin",
23 | "memecoins",
24 | "Merkle",
25 | "metadata",
26 | "metaplex",
27 | "Meteora",
28 | "mintable",
29 | "MPLX",
30 | "msgpack",
31 | "nonblocking",
32 | "offchain",
33 | "pdas",
34 | "performantly",
35 | "Preconfigured",
36 | "println",
37 | "Pubkey",
38 | "publickey",
39 | "Raydium",
40 | "rpcs",
41 | "seperator",
42 | "serde",
43 | "Shdw",
44 | "Solana",
45 | "Solflare",
46 | "Solscan",
47 | "SPACEBAR",
48 | "Struct",
49 | "unverify",
50 | "usize"
51 | ],
52 | "editor.codeActionsOnSave": {
53 | "source.sortImports": "explicit"
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Metaplex Developer Hub
2 |
3 | ## Getting started
4 |
5 | To get started with this app, first install the npm dependencies:
6 |
7 | ```bash
8 | pnpm install
9 | cp .env.example .env.local
10 | ```
11 |
12 | Next, run the development server:
13 |
14 | ```bash
15 | pnpm run dev
16 | ```
17 |
18 | Finally, open [http://localhost:3000](http://localhost:3000) in your browser to view the website.
19 |
20 | ## Customizing
21 |
22 | You can start editing the app by modifying the files in the `/src` folder. The site will auto-update as you edit these files.
23 |
24 | ## Global search
25 |
26 | By default this template uses [Algolia DocSearch](https://docsearch.algolia.com) for the global search. DocSearch is free for open-source projects, and you can sign up for an account on their website. Once your DocSearch account is ready, update the following [environment variables](https://nextjs.org/docs/basic-features/environment-variables) in your project with the values provided by Algolia:
27 |
28 | ```
29 | NEXT_PUBLIC_DOCSEARCH_APP_ID=
30 | NEXT_PUBLIC_DOCSEARCH_API_KEY=
31 | NEXT_PUBLIC_DOCSEARCH_INDEX_NAME=
32 | ```
33 | ## Note
34 |
35 | This repo is made available pursuant to the Tailwind UI License (https://tailwindui.com/license). Please carefully review the terms of the Tailwind UI License if you are considering forking this repo.
36 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "baseUrl": ".",
4 | "paths": {
5 | "@/*": ["src/*"]
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/markdoc/nodes.js:
--------------------------------------------------------------------------------
1 | import { nodes as defaultNodes } from '@markdoc/markdoc'
2 |
3 | import { Fence } from '@/components/Fence'
4 |
5 | const nodes = {
6 | document: {
7 | render: undefined,
8 | },
9 | table: {
10 | ...defaultNodes.table,
11 | render: (props) => {
12 | const Table = defaultNodes.table.render
13 | return (
14 |
17 | )
18 | },
19 | },
20 | th: {
21 | ...defaultNodes.th,
22 | attributes: {
23 | ...defaultNodes.th.attributes,
24 | scope: {
25 | type: String,
26 | default: 'col',
27 | },
28 | },
29 | },
30 | fence: {
31 | render: Fence,
32 | attributes: {
33 | language: {
34 | type: String,
35 | },
36 | },
37 | },
38 | }
39 |
40 | export default nodes
41 |
--------------------------------------------------------------------------------
/markdoc/partials/token-standard-full.md:
--------------------------------------------------------------------------------
1 | {% table %}
2 |
3 | - Field
4 | - Type
5 | - Description
6 |
7 | ---
8 |
9 | - **name**
10 | - string
11 | - Name of the asset.
12 |
13 | ---
14 |
15 |
20 |
21 | - **description**
22 | - string
23 | - Description of the asset.
24 |
25 | ---
26 |
27 | - **image**
28 | - string
29 | - URI pointing to the asset's logo.
30 |
31 | ---
32 |
33 | - **animation_url**
34 | - string
35 | - URI pointing to the asset's animation.
36 |
37 | ---
38 |
39 | - **external_url**
40 | - string
41 | - URI pointing to an external URL defining the asset — e.g. the game's main site.
42 |
43 | ---
44 |
45 | - **attributes**
46 | - array
47 | - Array of attributes defining the characteristics of the asset.
48 | - **trait_type** (string): The type of attribute.
49 | - **value** (string): The value for that attribute.
50 |
51 | ---
52 |
53 | - **properties**
54 | - object
55 | - Additional properties that define the asset.
56 | - **files** (array): Additional files to include with the asset.
57 | - **uri** (string): The file's URI.
58 | - **type** (string): The file's type. E.g. `image/png`, `video/mp4`, etc.
59 | - **cdn** (boolean, optional): Whether the file is served from a CDN.
60 | - **category** (string): A media category for the asset. E.g. `video`, `image`, etc.
61 |
62 | {% /table %}
63 |
--------------------------------------------------------------------------------
/markdoc/partials/token-standard-short.md:
--------------------------------------------------------------------------------
1 | {% table %}
2 |
3 | - Field
4 | - Type
5 | - Description
6 |
7 | ---
8 |
9 | - **name**
10 | - string
11 | - Name of the asset.
12 |
13 | ---
14 |
15 | - **symbol**
16 | - string
17 | - Symbol of the asset.
18 |
19 | ---
20 |
21 | - **description**
22 | - string
23 | - Description of the asset.
24 |
25 | ---
26 |
27 | - **image**
28 | - string
29 | - URI pointing to the asset's logo.
30 |
31 | {% /table %}
32 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | const withMarkdoc = require('@markdoc/next.js')
2 |
3 | /** @type {import('next').NextConfig} */
4 | const nextConfig = {
5 | reactStrictMode: true,
6 | pageExtensions: ['js', 'jsx', 'md'],
7 | experimental: {
8 | scrollRestoration: true,
9 | },
10 | }
11 |
12 | module.exports = withMarkdoc({
13 | tokenizerOptions: { allowComments: true },
14 | })(nextConfig)
15 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "tailwindui-syntax",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint",
10 | "sitemap": "node generate-sitemap.mjs"
11 | },
12 | "browserslist": "defaults, not ie <= 11",
13 | "dependencies": {
14 | "@docsearch/react": "^3.8.0",
15 | "@headlessui/react": "2.2.0",
16 | "@heroicons/react": "^2.2.0",
17 | "@hotjar/browser": "^1.0.9",
18 | "@markdoc/markdoc": "0.3.0",
19 | "@markdoc/next.js": "0.2.3",
20 | "@sindresorhus/slugify": "^2.2.1",
21 | "@tailwindcss/typography": "^0.5.15",
22 | "autoprefixer": "^10.4.20",
23 | "clsx": "^1.2.1",
24 | "focus-visible": "^5.2.1",
25 | "html-to-image": "^1.11.11",
26 | "lightense-images": "^1.0.17",
27 | "next": "13.4.7",
28 | "postcss-focus-visible": "^6.0.4",
29 | "postcss-import": "^14.1.0",
30 | "prism-react-renderer": "^1.3.5",
31 | "prismjs": "^1.29.0",
32 | "react": "18.2.0",
33 | "react-dom": "18.2.0",
34 | "reactflow": "^11.11.4",
35 | "tailwindcss": "^3.4.16"
36 | },
37 | "devDependencies": {
38 | "eslint": "8.26.0",
39 | "eslint-config-next": "13.0.2",
40 | "prettier": "^2.8.8",
41 | "prettier-plugin-tailwindcss": "^0.2.8",
42 | "sharp": "^0.32.6"
43 | },
44 | "packageManager": "pnpm@9.1.4+sha512.9df9cf27c91715646c7d675d1c9c8e41f6fce88246f1318c1aa6a1ed1aeb3c4f032fcdf4ba63cc69c4fe6d634279176b5358727d8f2cc1e65b65f43ce2f8bfb0"
45 | }
46 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: [
3 | 'postcss-import',
4 | 'tailwindcss/nesting',
5 | 'tailwindcss',
6 | 'autoprefixer',
7 | ]
8 | }
--------------------------------------------------------------------------------
/prettier.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | singleQuote: true,
3 | semi: false,
4 | plugins: [require('prettier-plugin-tailwindcss')],
5 | }
6 |
--------------------------------------------------------------------------------
/public/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/android-chrome-192x192.png
--------------------------------------------------------------------------------
/public/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/android-chrome-512x512.png
--------------------------------------------------------------------------------
/public/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/apple-touch-icon.png
--------------------------------------------------------------------------------
/public/assets/banners/touch-screen.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/assets/banners/touch-screen.jpg
--------------------------------------------------------------------------------
/public/assets/candy-machine/candy-machine-photo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/assets/candy-machine/candy-machine-photo.png
--------------------------------------------------------------------------------
/public/assets/candy-machine/core-cm-v3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/assets/candy-machine/core-cm-v3.jpg
--------------------------------------------------------------------------------
/public/assets/candy-machine/creator-studio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/assets/candy-machine/creator-studio.png
--------------------------------------------------------------------------------
/public/assets/social/dev-hub-preview.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/assets/social/dev-hub-preview.jpg
--------------------------------------------------------------------------------
/public/assets/token-metadata/test-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/assets/token-metadata/test-image.png
--------------------------------------------------------------------------------
/public/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #00aba9
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/favicon-16x16.png
--------------------------------------------------------------------------------
/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/favicon-32x32.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/favicon.ico
--------------------------------------------------------------------------------
/public/fonts/Inter-italic.var.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/fonts/Inter-italic.var.woff2
--------------------------------------------------------------------------------
/public/fonts/Inter-roman.var.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/fonts/Inter-roman.var.woff2
--------------------------------------------------------------------------------
/public/fonts/lexend.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/fonts/lexend.woff2
--------------------------------------------------------------------------------
/public/images/hybrid-ui-template-image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/images/hybrid-ui-template-image.jpg
--------------------------------------------------------------------------------
/public/images/metaplex-next-js-template.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/images/metaplex-next-js-template.png
--------------------------------------------------------------------------------
/public/mstile-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/mstile-144x144.png
--------------------------------------------------------------------------------
/public/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/mstile-150x150.png
--------------------------------------------------------------------------------
/public/mstile-310x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/mstile-310x150.png
--------------------------------------------------------------------------------
/public/mstile-310x310.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/mstile-310x310.png
--------------------------------------------------------------------------------
/public/mstile-70x70.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/public/mstile-70x70.png
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Disallow:
3 |
4 | Sitemap: https://developers.metaplex.com/sitemap.xml
--------------------------------------------------------------------------------
/public/site.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Metaplex",
3 | "short_name": "Metaplex",
4 | "icons": [
5 | {
6 | "src": "/android-chrome-192x192.png",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "/android-chrome-512x512.png",
12 | "sizes": "512x512",
13 | "type": "image/png"
14 | }
15 | ],
16 | "theme_color": "#ffffff",
17 | "background_color": "#ffffff",
18 | "display": "standalone"
19 | }
20 |
--------------------------------------------------------------------------------
/src/components/Button.jsx:
--------------------------------------------------------------------------------
1 | import Link from 'next/link'
2 | import clsx from 'clsx'
3 |
4 | const styles = {
5 | primary:
6 | 'rounded-md bg-accent-300 py-2 px-4 text-sm font-semibold text-slate-900 hover:bg-accent-200 focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent-300/50 active:bg-accent-500',
7 | secondary:
8 | 'rounded-md py-2 px-4 text-sm font-medium text-white hover:bg-slate-800 focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white/50 active:text-slate-400',
9 | }
10 |
11 | export function Button({ variant = 'primary', className, href, ...props }) {
12 | className = clsx(styles[variant], className)
13 |
14 | return href ? (
15 |
16 | ) : (
17 |
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/src/components/DialectContext.jsx:
--------------------------------------------------------------------------------
1 | import { createContext, useContext, useEffect, useState } from 'react'
2 |
3 | export const DialectContext = createContext({
4 | dialect: '',
5 | setDialect: () => {},
6 | })
7 |
8 | export const useDialect = () => useContext(DialectContext)
9 |
10 | export function DialectProvider({ children }) {
11 | const [dialect, setDialect] = useState('')
12 | useEffect(() => {
13 | setDialect(localStorage.getItem('dialect'))
14 | }, [])
15 | useEffect(() => {
16 | dialect && localStorage.setItem('dialect', dialect)
17 | }, [dialect])
18 |
19 | return (
20 |
21 | {children}
22 |
23 | )
24 | }
25 |
--------------------------------------------------------------------------------
/src/components/Fence.jsx:
--------------------------------------------------------------------------------
1 | import Highlight, { defaultProps } from 'prism-react-renderer';
2 | import { Fragment } from 'react';
3 | import CopyToClipboardButton from './products/CopyToClipboard';
4 | (typeof global !== 'undefined' ? global : window).Prism = Prism
5 |
6 | require('prismjs/components/prism-kotlin')
7 | require('prismjs/components/prism-csharp')
8 | require('prismjs/components/prism-java')
9 | require('prismjs/components/prism-php')
10 | require('prismjs/components/prism-ruby')
11 |
12 | export function Fence({ children, language }) {
13 | return (
14 |
20 | {({ className, style, tokens, getTokenProps }) => (
21 |
22 |
23 |
24 | {tokens.map((line, lineIndex) => (
25 |
26 | {line
27 | .filter((token) => !token.empty)
28 | .map((token, tokenIndex) => (
29 |
30 | ))}
31 | {'\n'}
32 |
33 | ))}
34 |
35 |
36 | )}
37 |
38 | )
39 | }
40 |
--------------------------------------------------------------------------------
/src/components/HeroScreenshot.jsx:
--------------------------------------------------------------------------------
1 | import Image from 'next/image'
2 | import { TrafficLightsIcon } from '@/components/icons/TrafficLightsIcon'
3 |
4 | export function HeroScreenshot({ src, alt, width, height }) {
5 | return (
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
22 |
23 |
24 |
25 | )
26 | }
27 |
--------------------------------------------------------------------------------
/src/components/Image.jsx:
--------------------------------------------------------------------------------
1 | const Image = ({ src, alt, classes }) => {
2 | return (
3 |
4 |

5 |
6 | )
7 | }
8 |
9 | export default Image
10 |
--------------------------------------------------------------------------------
/src/components/NavList.jsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import { Popover } from '@headlessui/react'
4 | import Link from 'next/link'
5 | import { SwitcherPopover } from './products/SwitcherPopover'
6 | import { productCategories } from './products/index'
7 |
8 | const NavList = () => {
9 | return (
10 |
11 | {productCategories.map((item, index) => {
12 | if (item === 'Aura') {
13 | return (
14 |
15 |
16 | Aura
17 |
18 |
19 | )
20 | }
21 |
22 | return (
23 |
24 |
25 |
26 | {item}
27 |
28 |
29 |
30 | )
31 | })}
32 |
33 |
34 |
35 | Guides
36 |
37 |
38 |
39 |
40 | )
41 | }
42 |
43 | export default NavList
44 |
--------------------------------------------------------------------------------
/src/components/Prose.jsx:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx'
2 |
3 | export function Prose({ as: Component = 'div', className, ...props }) {
4 | return (
5 |
26 | )
27 | }
28 |
--------------------------------------------------------------------------------
/src/components/QuickLinks.jsx:
--------------------------------------------------------------------------------
1 | import Link from 'next/link'
2 |
3 | import { Icon } from '@/components/icons'
4 |
5 | export function QuickLinks({ children }) {
6 | return (
7 |
8 | {children}
9 |
10 | )
11 | }
12 |
13 | export function QuickLink({ title, description, href, target, icon }) {
14 | return (
15 |
16 |
17 |
18 |
22 |
23 |
24 |
25 | {title}
26 |
27 |
28 |
29 | {description}
30 |
31 |
32 |
33 | )
34 | }
35 |
--------------------------------------------------------------------------------
/src/components/Seperator.jsx:
--------------------------------------------------------------------------------
1 | export function Seperator ({h}) {
2 | return
3 | }
4 |
--------------------------------------------------------------------------------
/src/components/Totem.jsx:
--------------------------------------------------------------------------------
1 | import { Disclosure } from '@headlessui/react'
2 | import clsx from 'clsx'
3 |
4 | import { Icon } from '@/components/icons'
5 |
6 | export function Totem({ children }) {
7 | return {children}
8 | }
9 |
10 | export function TotemAccordion({ children, title, defaultOpen = false }) {
11 | return (
12 |
13 | {({ open }) => (
14 |
15 |
16 | {title}
17 |
24 |
25 | {children}
26 |
27 | )}
28 |
29 | )
30 | }
31 |
32 | export function TotemProse({ children }) {
33 | return {children}
34 | }
35 |
--------------------------------------------------------------------------------
/src/components/Video.jsx:
--------------------------------------------------------------------------------
1 | function Video({ src, classes, embed = false }) {
2 | return (
3 |
7 | {embed ? (
8 |
22 | ) : (
23 |
35 | )}
36 |
37 | )
38 | }
39 |
40 | export default Video
41 |
--------------------------------------------------------------------------------
/src/components/apiComponents/languageComponents/cSharpRenderer.jsx:
--------------------------------------------------------------------------------
1 | const { Fence } = require('@/components/Fence');
2 |
3 | const CSharpRequestRenderer = ({
4 | url,
5 | bodyMethod,
6 | rpcVersion,
7 | bodyParams,
8 | id,
9 | }) => {
10 | const httpBody = bodyParams;
11 |
12 | const object = {
13 | method: 'POST',
14 | body: {
15 | jsonrpc: rpcVersion ? rpcVersion : '2.0',
16 | id: id ? id : 1,
17 | method: bodyMethod,
18 | params: httpBody,
19 | },
20 | };
21 |
22 | const jsonBody = JSON.stringify(object.body, null, 2).replace(/"/g, '""');
23 |
24 | const code = `
25 | using System;
26 | using System.Net.Http;
27 | using System.Text;
28 |
29 | class Program
30 | {
31 | static void Main() {
32 | var url = "${url}";
33 | var data = new StringContent(@"
34 | ${jsonBody.replace(/\n/g, '\n ')}
35 | ", Encoding.UTF8, "application/json");
36 |
37 | var client = new HttpClient();
38 | var request = new HttpRequestMessage {
39 | Method = HttpMethod.Post,
40 | RequestUri = new Uri(url),
41 | Content = data
42 | };
43 |
44 | try {
45 | var response = client.SendAsync(request).Result;
46 | Console.WriteLine($"Status Code: {response.StatusCode}");
47 | Console.WriteLine(response.Content.ReadAsStringAsync().Result);
48 | } catch (Exception ex) {
49 | Console.WriteLine($"An error occurred: {ex.Message}");
50 | }
51 | }
52 | }`;
53 |
54 | return (
55 |
56 | {code}
57 |
58 | );
59 | };
60 |
61 | export default CSharpRequestRenderer;
62 |
--------------------------------------------------------------------------------
/src/components/apiComponents/languageComponents/curlRequestRenderer.jsx:
--------------------------------------------------------------------------------
1 | import { Fence } from '@/components/Fence'
2 |
3 | const CurlRequestRenderer = ({
4 | url,
5 | headers,
6 | bodyMethod,
7 | rpcVersion,
8 | bodyParams,
9 | id,
10 | }) => {
11 | const httpBody = bodyParams
12 |
13 | const object = {
14 | method: 'POST',
15 | headers: headers,
16 | body: {
17 | jsonrpc: rpcVersion ? rpcVersion : '2.0',
18 | id: id ? id : 1,
19 | method: bodyMethod,
20 | params: httpBody,
21 | },
22 | }
23 |
24 | // Dynamically generate the headers dictionary for curl
25 | const headersCode = Object.entries(headers)
26 | .map(([key, value]) => `-H "${key}: ${value}"`)
27 | .join(' ')
28 |
29 | // JSON body formatted for curl with escaped double quotes
30 | const jsonBody = JSON.stringify(object.body).replace(/"/g, '\\"') // Make it a single-line string
31 |
32 | // Generate the curl command (single-line body)
33 | const code = `curl -X POST ${headersCode} -d "${jsonBody}" ${url}`
34 |
35 | return (
36 |
37 | {code}
38 |
39 | )
40 | }
41 |
42 | export default CurlRequestRenderer
43 |
--------------------------------------------------------------------------------
/src/components/apiComponents/languageComponents/javascriptRequestRenderer.jsx:
--------------------------------------------------------------------------------
1 | import { Fence } from '@/components/Fence'
2 |
3 | const JavaScriptRequestRenderer = ({
4 | url,
5 | headers,
6 | bodyMethod,
7 | rpcVersion,
8 | bodyParams,
9 | id,
10 | }) => {
11 | const httpBody = bodyParams
12 |
13 | const object = {
14 | method: 'POST',
15 | headers: headers,
16 | body: {
17 | jsonrpc: rpcVersion ? rpcVersion : '2.0',
18 | id: id ? id : 1,
19 | method: bodyMethod,
20 | params: httpBody,
21 | },
22 | }
23 |
24 | // Dynamically generate headers for JavaScript
25 | const headersCode = Object.entries(headers)
26 | .map(([key, value]) => `"${key}": "${value}"`)
27 | .join(',\n')
28 |
29 | // Format the body with indentation
30 | const jsonBody = JSON.stringify(object.body, null, 2) // 4-space indentation for JSON
31 |
32 | const code = `const url = "${url}";
33 |
34 | fetch(url, {
35 | method: "POST",
36 | headers: {${headersCode}},
37 | body: JSON.stringify(${jsonBody.replace(/\n/g, '\n ')})
38 | })
39 | .then(response => response.json())
40 | .then(data => console.log(data))
41 | .catch(error => console.error("Error:", error));
42 | `
43 |
44 | return (
45 |
46 | {code}
47 |
48 | )
49 | }
50 |
51 | export default JavaScriptRequestRenderer
52 |
--------------------------------------------------------------------------------
/src/components/apiComponents/languageComponents/kotlinRenderer.jsx:
--------------------------------------------------------------------------------
1 | import { Fence } from '@/components/Fence';
2 |
3 | const KotlinRequestRenderer = ({ url, bodyMethod, bodyParams }) => {
4 | const httpBody = bodyParams;
5 |
6 | const code = `
7 | import java.io.OutputStream
8 | import java.net.HttpURLConnection
9 | import java.net.URL
10 |
11 | fun main() {
12 | try {
13 | val url = "${url}"
14 | val jsonInputString = """
15 | {
16 | "jsonrpc": "2.0",
17 | "id": 1,
18 | "method": "${bodyMethod}",
19 | "params": ${JSON.stringify(httpBody, null, 2).replace(/\n/g, '\n ')}
20 | }
21 | """
22 |
23 | // Create a URL object from the string URL
24 | val obj = URL(url)
25 | val con = obj.openConnection() as HttpURLConnection
26 |
27 | // Set the HTTP method to POST
28 | con.requestMethod = "POST"
29 |
30 | // Set the headers
31 | con.setRequestProperty("Content-Type", "application/json")
32 |
33 | // Enable input and output streams
34 | con.doOutput = true
35 |
36 | // Write the request body (JSON)
37 | con.outputStream.use { os: OutputStream ->
38 | val input = jsonInputString.toByteArray(Charsets.UTF_8)
39 | os.write(input, 0, input.size)
40 | }
41 |
42 | // Get the response code
43 | val responseCode = con.responseCode
44 | println("Response Code: \$responseCode")
45 |
46 | } catch (e: Exception) {
47 | e.printStackTrace()
48 | }
49 | }
50 | `;
51 |
52 | return (
53 |
54 | {code}
55 |
56 | );
57 | };
58 |
59 | export default KotlinRequestRenderer;
60 |
--------------------------------------------------------------------------------
/src/components/apiComponents/languageComponents/rubyRenderer.jsx:
--------------------------------------------------------------------------------
1 | import { Fence } from '@/components/Fence';
2 |
3 | const RubyRequestRenderer = ({ url, headers, bodyMethod, rpcVersion, bodyParams, id }) => {
4 | const httpBody = bodyParams;
5 |
6 | const headersCode = Object.entries(headers)
7 | .map(([key, value]) => ` request["${key}"] = "${value}"`)
8 | .join("\n");
9 |
10 | const code = `
11 | require 'net/http'
12 | require 'json'
13 | require 'uri'
14 |
15 | # Parse the URL
16 | uri = URI.parse("${url}")
17 | uri.path = uri.path.empty? ? "/" : uri.path # Ensure the path is not empty
18 |
19 | http = Net::HTTP.new(uri.host, uri.port)
20 |
21 | # Prepare the request body
22 | request_body = {
23 | "jsonrpc": "${rpcVersion ? rpcVersion : '2.0'}",
24 | "id": ${id ? id : 1},
25 | "method": "${bodyMethod}",
26 | "params": ${JSON.stringify(httpBody)}
27 | }.to_json
28 |
29 | # Create the POST request
30 | request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" })
31 | ${headersCode}
32 |
33 | # Set the request body
34 | request.body = request_body
35 |
36 | # Send the request and get the response
37 | response = http.request(request)
38 |
39 | # Output the response
40 | puts "Response: #{response.body}"
41 | `;
42 |
43 | return (
44 |
45 | {code}
46 |
47 | );
48 | };
49 |
50 | export default RubyRequestRenderer;
51 |
--------------------------------------------------------------------------------
/src/components/apiComponents/languageComponents/rustRenderer.jsx:
--------------------------------------------------------------------------------
1 | import { Fence } from '@/components/Fence';
2 |
3 | const RustRequestRenderer = ({ url, headers, bodyMethod, rpcVersion, bodyParams, id }) => {
4 | const httpBody = bodyParams;
5 |
6 | const headersCode = Object.entries(headers)
7 | .map(([key, value]) => ` request = request.header("${key}", "${value}")`)
8 | .join("\n");
9 |
10 | const code = `
11 | use reqwest::blocking::Client;
12 | use reqwest::header::CONTENT_TYPE;
13 | use serde::{Serialize, Deserialize};
14 |
15 | #[derive(Serialize, Deserialize)]
16 | struct RequestBody {
17 | jsonrpc: String,
18 | id: u64,
19 | method: String,
20 | params: serde_json::Value,
21 | }
22 |
23 | fn main() -> Result<(), Box> {
24 | let url = "${url}";
25 | let client = Client::new();
26 |
27 | let request_body = RequestBody {
28 | jsonrpc: "${rpcVersion ? rpcVersion : '2.0'}".to_string(),
29 | id: ${id ? id : 1},
30 | method: "${bodyMethod}".to_string(),
31 | params: serde_json::json!(${JSON.stringify(httpBody)}),
32 | };
33 |
34 | let request = client.post(url)
35 | .header(CONTENT_TYPE, "application/json");
36 |
37 | let response = request.json(&request_body).send()?;
38 |
39 | println!("Response: {:?}", response.text()?);
40 |
41 | Ok(())
42 | }
43 | `;
44 |
45 | return (
46 |
47 | {code}
48 |
49 | );
50 | };
51 |
52 | export default RustRequestRenderer;
53 |
--------------------------------------------------------------------------------
/src/components/apiComponents/languageComponents/swiftRenderer.jsx:
--------------------------------------------------------------------------------
1 | import { Fence } from '@/components/Fence';
2 |
3 | const SwiftRequestRenderer = ({ url, headers, bodyMethod, rpcVersion, bodyParams, id }) => {
4 | const httpBody = bodyParams;
5 |
6 | const headersCode = Object.entries(headers)
7 | .map(([key, value]) => ` request.setValue("${value}", forHTTPHeaderField: "${key}")`)
8 | .join("\n");
9 |
10 | const jsonBody = JSON.stringify({
11 | jsonrpc: rpcVersion ? rpcVersion : '2.0',
12 | id: id ? id : 1,
13 | method: bodyMethod,
14 | params: httpBody,
15 | }, null, 2);
16 |
17 | const code = `
18 | import Foundation
19 |
20 | let url = URL(string: "${url}")!
21 | var request = URLRequest(url: url)
22 | request.httpMethod = "POST"
23 | request.setValue("application/json", forHTTPHeaderField: "Content-Type")
24 |
25 | ${headersCode}
26 |
27 | let jsonData = """
28 | ${jsonBody}
29 | """.data(using: .utf8)!
30 |
31 | request.httpBody = jsonData
32 |
33 | let task = URLSession.shared.dataTask(with: request) { data, response, error in
34 | if let error = error {
35 | print("Error: \(error.localizedDescription)")
36 | return
37 | }
38 |
39 | if let response = response as? HTTPURLResponse {
40 | print("Response Status Code: \(response.statusCode)")
41 | }
42 |
43 | if let data = data, let responseString = String(data: data, encoding: .utf8) {
44 | print("Response Body: \(responseString)")
45 | }
46 | }
47 |
48 | task.resume()
49 | `;
50 |
51 | return (
52 |
53 | {code}
54 |
55 | );
56 | };
57 |
58 | export default SwiftRequestRenderer;
59 |
--------------------------------------------------------------------------------
/src/components/apiComponents/languageComponents/umiRequestRenderer.jsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/src/components/apiComponents/languageComponents/umiRequestRenderer.jsx
--------------------------------------------------------------------------------
/src/components/apiComponents/responce.jsx:
--------------------------------------------------------------------------------
1 | import { Fence } from '../Fence'
2 |
3 | const Responce = ({ responce }) => {
4 | return (
5 |
6 |
Response
7 |
8 | {JSON.stringify(responce, null, 2)}
9 |
10 |
11 | )
12 | }
13 |
14 | export default Responce
15 |
--------------------------------------------------------------------------------
/src/components/diagrams/Node.jsx:
--------------------------------------------------------------------------------
1 | import { Tag } from '@markdoc/markdoc'
2 |
3 | export function transformNodeTag(node, config) {
4 | const attributes = node.transformAttributes(config)
5 | const allChildren = node.transformChildren(config)
6 | const children = allChildren.filter((child) => child.name !== 'Node')
7 | const treeNodes = allChildren.filter((child) => child.name === 'Node')
8 | return new Tag(this.render, { ...attributes, children: treeNodes }, children)
9 | }
10 |
--------------------------------------------------------------------------------
/src/components/diagrams/index.js:
--------------------------------------------------------------------------------
1 | export * from './Diagram'
2 | export * from './Node'
3 |
--------------------------------------------------------------------------------
/src/components/diagrams/useDownloadImage.js:
--------------------------------------------------------------------------------
1 | import { getRectOfNodes, getTransformForBounds, useReactFlow } from 'reactflow'
2 | import { toPng } from 'html-to-image'
3 |
4 | export function useDownloadImage(
5 | ref,
6 | filename = 'diagram.png',
7 | imageWidth = 1024,
8 | imageHeight = 768
9 | ) {
10 | const { getNodes } = useReactFlow()
11 |
12 | const downloadDataUrl = (dataUrl) => {
13 | const a = document.createElement('a')
14 | a.setAttribute('download', filename)
15 | a.setAttribute('href', dataUrl)
16 | a.click()
17 | }
18 |
19 | const downloadImage = () => {
20 | if (!ref.current) return
21 | const viewport = ref.current.querySelector('.react-flow__viewport')
22 | const nodesBounds = getRectOfNodes(getNodes())
23 | const transform = getTransformForBounds(
24 | nodesBounds,
25 | imageWidth,
26 | imageHeight,
27 | 0.5,
28 | 2
29 | )
30 | const isDarkMode = document.querySelector('html').classList.contains('dark')
31 | toPng(viewport, {
32 | backgroundColor: isDarkMode ? '#1e293b' : '#f8fafc',
33 | width: imageWidth,
34 | height: imageHeight,
35 | style: {
36 | width: imageWidth,
37 | height: imageHeight,
38 | transform: `translate(${transform[0]}px, ${transform[1]}px) scale(${transform[2]})`,
39 | },
40 | }).then(downloadDataUrl)
41 | }
42 |
43 | return [downloadImage]
44 | }
45 |
--------------------------------------------------------------------------------
/src/components/diagrams/useFullscreen.js:
--------------------------------------------------------------------------------
1 | import { useCallback, useEffect, useState } from 'react'
2 | import { useReactFlow } from 'reactflow'
3 |
4 | export function useFullscreen() {
5 | const { fitView } = useReactFlow()
6 | const [fullscreen, setFullscreen] = useState(false)
7 | const toggleFullscreen = useCallback(() => {
8 | setFullscreen(!fullscreen)
9 | setTimeout(fitView, 20)
10 | }, [fullscreen, fitView])
11 |
12 | useEffect(() => {
13 | const handleEsc = (event) => {
14 | if (event.keyCode === 27 && fullscreen) {
15 | toggleFullscreen()
16 | }
17 | }
18 | window.addEventListener('keydown', handleEsc)
19 | return () => window.removeEventListener('keydown', handleEsc)
20 | }, [fullscreen, toggleFullscreen])
21 |
22 | return [fullscreen, toggleFullscreen]
23 | }
24 |
--------------------------------------------------------------------------------
/src/components/diagrams/useTransforms.js:
--------------------------------------------------------------------------------
1 | import { useEdgesState, useNodesState, useReactFlow } from 'reactflow'
2 | import * as whimsical from '@/components/diagrams/DiagramWhimsical'
3 |
4 | const hide = (els) =>
5 | els.map((x) => ({ ...x, style: { ...x.style, opacity: 0 } }))
6 |
7 | export function useTransforms(initialNodes, initialEdges, type) {
8 | const { fitView, getNode } = useReactFlow()
9 | const [nodes, setNodes] = useNodesState(hide(initialNodes))
10 | const [edges, setEdges] = useEdgesState(hide(initialEdges))
11 |
12 | const onInit = () => {
13 | setTimeout(() => {
14 | let newNodes = initialNodes
15 | let newEdges = initialEdges
16 |
17 | switch (type) {
18 | case 'whimsical':
19 | newNodes = whimsical.transformNodes(newNodes, getNode)
20 | newEdges = whimsical.transformEdges(newEdges)
21 | break
22 | }
23 |
24 | setNodes(newNodes)
25 | setEdges(newEdges)
26 | setTimeout(fitView, 20)
27 | }, 20)
28 | }
29 |
30 | return [nodes, edges, onInit]
31 | }
32 |
--------------------------------------------------------------------------------
/src/components/diagrams/utils.jsx:
--------------------------------------------------------------------------------
1 | export function LabelOrContent({ data }) {
2 | if (data.label) return <>{data.label}>
3 | return (
4 | <>
5 | {data.content.map((child, index) => ({
6 | ...child,
7 | key: index.toString(36),
8 | }))}
9 | >
10 | )
11 | }
12 |
13 | export function hasLabelOrContent(data) {
14 | return data.content?.length > 0 || data.label
15 | }
16 |
--------------------------------------------------------------------------------
/src/components/helperComponents/badgesList.jsx:
--------------------------------------------------------------------------------
1 | export const badgesList = ({ badges }) => {
2 | const packageList = badges.map((badge, index) => {
3 | return (
4 |
7 | )
8 | })
9 |
10 | return (
11 |
12 |
{type}
13 |
14 | {packageList}
15 | {/* {JSON.stringify(installationPackages, null, 2)} */}
16 |
17 |
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/src/components/icons/TrafficLightsIcon.jsx:
--------------------------------------------------------------------------------
1 | export function TrafficLightsIcon(props) {
2 | return (
3 |
8 | )
9 | }
10 |
--------------------------------------------------------------------------------
/src/components/icons/dual-tone/InstallationIcon.jsx:
--------------------------------------------------------------------------------
1 | import { DarkMode, Gradient, LightMode } from '@/components/icons/dual-tone'
2 |
3 | export function InstallationIcon({ id, color }) {
4 | return (
5 | <>
6 |
7 |
12 |
17 |
18 |
19 |
20 |
28 |
29 |
30 |
38 |
39 | >
40 | )
41 | }
42 |
--------------------------------------------------------------------------------
/src/components/icons/index.jsx:
--------------------------------------------------------------------------------
1 | import * as solidIcons20 from '@heroicons/react/20/solid'
2 | import * as outlineIcons24 from '@heroicons/react/24/outline'
3 | import clsx from 'clsx'
4 |
5 | import { CSharpIcon } from './languages/CSharpIcon'
6 | import { CurlIcon } from './languages/CurlIcon'
7 | import { GoIcon } from './languages/GoIcon'
8 | import { JavaIcon } from './languages/JavaIcon'
9 | import { JavaScriptIcon } from './languages/JavaScriptIcon'
10 | import { KotlinIcon } from './languages/KotlinIcon'
11 | import { PhpIcon } from './languages/PhpIcon'
12 | import { PythonIcon } from './languages/PythonIcon'
13 | import { RubyIcon } from './languages/RubyIcon'
14 | import { RustIcon } from './languages/RustIcon'
15 | import { ShellIcon } from './languages/ShellIcon'
16 | import { SwiftIcon } from './languages/SwiftIcon'
17 | // import { TypescriptIcon } from './languages/TypescriptIcon'
18 |
19 | const customIcons = {
20 | CSharpIcon,
21 | CurlIcon,
22 | GoIcon,
23 | JavaIcon,
24 | JavaScriptIcon,
25 | KotlinIcon,
26 | PhpIcon,
27 | PythonIcon,
28 | RubyIcon,
29 | RustIcon,
30 | ShellIcon,
31 | SwiftIcon,
32 | // TypescriptIcon,
33 | }
34 |
35 | export function Icon({ icon, className, ...props }) {
36 | const isSolid = icon.startsWith('Solid')
37 | const icons = isSolid ? solidIcons20 : outlineIcons24
38 | const trimmedIcon = icon.replace(/^(Solid|Outline)/, '')
39 | const IconComponent =
40 | icons[trimmedIcon] ??
41 | icons[trimmedIcon + 'Icon'] ??
42 | customIcons[trimmedIcon + 'Icon'] ??
43 | customIcons[trimmedIcon] ??
44 | icons['ExclamationCircleIcon']
45 | const defaultSize = isSolid ? 'h-5 w-5' : 'h-6 w-6'
46 |
47 | return (
48 |
52 | )
53 | }
54 |
--------------------------------------------------------------------------------
/src/components/icons/languages/CSharpIcon.jsx:
--------------------------------------------------------------------------------
1 | export function CSharpIcon(props) {
2 | return (
3 |
11 | )
12 | }
13 |
--------------------------------------------------------------------------------
/src/components/icons/languages/KotlinIcon.jsx:
--------------------------------------------------------------------------------
1 | export function KotlinIcon(props) {
2 | return (
3 |
13 | )
14 | }
15 |
--------------------------------------------------------------------------------
/src/components/icons/languages/PythonIcon.jsx:
--------------------------------------------------------------------------------
1 | export function PythonIcon(props) {
2 | return (
3 |
13 | )
14 | }
15 |
--------------------------------------------------------------------------------
/src/components/icons/languages/TypescriptIcon.jsx:
--------------------------------------------------------------------------------
1 | export function TypescriptIcon(props) {
2 | return (
3 |
13 | )
14 | }
15 |
--------------------------------------------------------------------------------
/src/components/icons/spinner.jsx:
--------------------------------------------------------------------------------
1 | const Spinner = ({className, style}) => {
2 | return
3 | }
4 |
5 | export default Spinner
6 |
--------------------------------------------------------------------------------
/src/components/products/Badge.jsx:
--------------------------------------------------------------------------------
1 | const Badge = ({ type }) => {
2 |
3 | const colorMap = {
4 | 'new': 'bg-green-100 text-green-800',
5 | 'updated': 'bg-yellow-100 text-yellow-800',
6 | };
7 |
8 | return (
9 |
10 | {type}
11 |
12 | )
13 | };
14 |
15 | export default Badge;
--------------------------------------------------------------------------------
/src/components/products/CopyToClipboard.jsx:
--------------------------------------------------------------------------------
1 | const { ClipboardIcon } = require('@heroicons/react/24/outline')
2 |
3 | const CopyToClipboardButton = ({ text }) => {
4 | const copyCodeToClipboard = () => {
5 | navigator.clipboard.writeText(text.trimEnd())
6 | }
7 |
8 | return (
9 | copyCodeToClipboard()}
12 | />
13 | )
14 | }
15 |
16 | export default CopyToClipboardButton
17 |
--------------------------------------------------------------------------------
/src/components/products/Grid.jsx:
--------------------------------------------------------------------------------
1 | import Link from 'next/link';
2 | import { IconWithName } from './IconWithName';
3 | import { products as allProducts } from './index';
4 |
5 | export function Grid({
6 | onClick,
7 | withoutFallback,
8 | menuItem,
9 | numCols,
10 | ...props
11 | }) {
12 | const products = allProducts.filter(
13 | (product) => menuItem === product.navigationMenuCatergory
14 | )
15 |
16 | let className = `relative grid sm:grid-cols-2 grid-cols-1`
17 |
18 | return (
19 |
20 | {products.map((product) => (
21 | -
22 |
27 | {IconWithName({ product, description: true })}
28 |
29 |
30 | ))}
31 |
32 | )
33 | }
34 |
35 | export function MarkdocGrid() {
36 | return (
37 |
38 |
39 |
40 | )
41 | }
42 |
--------------------------------------------------------------------------------
/src/components/products/GridAllProducts.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Grid } from './Grid';
3 | import { productCategories } from './index';
4 |
5 | export function MarkdocGrid() {
6 | return (
7 |
8 | {productCategories.map((item, index) => {
9 |
10 | return (
11 |
12 |
13 | {productCategories[index]}
14 |
15 |
21 |
22 | )
23 | })}
24 |
25 | )
26 | }
27 |
--------------------------------------------------------------------------------
/src/components/products/IconWithName.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | export const categoryToColor = new Map([
4 | ['MPL', '#BEF264'],
5 | ['Aura', '#F0ABFC'],
6 | ['Dev Tools', '#7DEDFC'],
7 | ])
8 |
9 | export function IconWithName({ product, description, ...props }) {
10 | return (
11 |
12 | {React.cloneElement(product.icon, {
13 | color: categoryToColor.get(product.navigationMenuCatergory),
14 | className: 'h-8 w-8 shrink-0',
15 | })}
16 |
17 |
18 | {product.name}
19 |
20 | {description && (
21 |
22 | {product.headline}
23 |
24 | )}
25 |
26 |
27 | )
28 | }
29 |
30 | export function Logo({ product, className, ...props }) {
31 | const LogoComponent = product.logo
32 | return
33 | }
34 |
--------------------------------------------------------------------------------
/src/components/products/MobileAppGrid.jsx:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx'
2 | import { products as allProducts } from './index'
3 | import Link from 'next/link'
4 | import { Grid } from './Grid'
5 | import { IconWithName } from './IconWithName'
6 |
7 | export function MobileAppGrid({
8 | onClick,
9 | withoutFallback,
10 | className,
11 | menuItem,
12 | ...props
13 | }) {
14 | const products = allProducts
15 |
16 | const hub = products.find((product) => product.name === 'Metaplex')
17 |
18 | return (
19 |
20 | -
21 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | {products
33 | .filter((product) => product.name != 'Metaplex')
34 | .map((product) => (
35 |
-
36 |
41 |
42 |
43 |
44 | ))}
45 |
46 |
47 | )
48 | }
49 |
50 | export function MarkdocGrid() {
51 | return (
52 |
53 |
54 |
55 | )
56 | }
57 |
--------------------------------------------------------------------------------
/src/components/products/Sections.jsx:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx'
2 | import Link from 'next/link'
3 | import { Icon } from '@/components/icons'
4 |
5 | export function Sections({ sections, activeSectionId, className, props }) {
6 | return (
7 |
8 | {sections.map((section) => (
9 |
22 |
31 | {section.title}
32 |
33 | ))}
34 |
35 | )
36 | }
37 |
--------------------------------------------------------------------------------
/src/components/products/SwitcherDialog.jsx:
--------------------------------------------------------------------------------
1 | import { Dialog } from '@headlessui/react'
2 | import { useState } from 'react'
3 | import { MobileAppGrid } from './MobileAppGrid'
4 |
5 | export function SwitcherDialog({ children, props }) {
6 | let [isOpen, setIsOpen] = useState(false)
7 |
8 | return (
9 | <>
10 | {children({ isOpen, setIsOpen })}
11 |
47 | >
48 | )
49 | }
50 |
--------------------------------------------------------------------------------
/src/components/products/SwitcherPopover.jsx:
--------------------------------------------------------------------------------
1 | import { Grid } from '@/components/products/Grid'
2 | import { Popover, Transition } from '@headlessui/react'
3 |
4 | export function SwitcherPopover({ children, menuItem, ...props }) {
5 | return (
6 |
7 | {children}
8 | {/* */}
16 |
17 | {({ close }) => (
18 |
27 | )}
28 |
29 | {/* */}
30 |
31 | )
32 | }
33 |
--------------------------------------------------------------------------------
/src/components/products/amman/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 | import { HeroCode } from '@/components/HeroCode'
3 |
4 | export function Hero({ page }) {
5 | return (
6 |
7 |
8 |
9 | )
10 | }
11 |
--------------------------------------------------------------------------------
/src/components/products/amman/index.js:
--------------------------------------------------------------------------------
1 | import {
2 | documentationSection
3 | } from '@/shared/sections'
4 | import { ServerIcon } from '@heroicons/react/24/solid'
5 | import { Hero } from './Hero'
6 |
7 | export const amman = {
8 | name: 'Amman',
9 | headline: 'Local Validator Toolkit',
10 | description:
11 | 'A local validator toolkit for testing Solana programs and applications.',
12 | path: 'amman',
13 | navigationMenuCatergory: 'Dev Tools',
14 | icon: ,
15 | github: 'https://github.com/metaplex-foundation/amman',
16 | className: 'accent-sky',
17 | heroes: [{ path: '/amman', component: Hero }],
18 | sections: [
19 | {
20 | ...documentationSection('amman'),
21 | navigation: [
22 | {
23 | title: 'Introduction',
24 | links: [
25 | { title: 'Overview', href: '/amman' },
26 | { title: 'Getting Started', href: '/amman/getting-started' },
27 | { title: 'CLI Commands', href: '/amman/cli-commands' },
28 | { title: 'Configuration', href: '/amman/configuration' },
29 | { title: 'Pre-made Configs', href: '/amman/pre-made-configs' },
30 | ],
31 | },
32 | ],
33 | },
34 | ],
35 | }
36 |
--------------------------------------------------------------------------------
/src/components/products/aura/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero';
2 | import { HeroCode } from '@/components/HeroCode';
3 |
4 | const codeProps = {
5 | tabs: [
6 | { name: 'getAsset', isActive: true },
7 | ],
8 | language: 'json',
9 | code: `{
10 | "jsonrpc": "2.0",
11 | "result": {
12 | "interface": "MplCoreAsset",
13 | "id": "5avjMVza8SuMhgTfzEGNWJskDELMCQk9juAAc8zeQoNa",
14 | "content": {
15 | "$schema": "https://schema.metaplex.com/nft1.0.json",
16 | "json_uri": "https://arweave.net/2xl-wNjCDAnCEtPbtUZRlXypSP6boMVTt5On8F7NPoc",
17 | `,
18 | }
19 |
20 | export function Hero({ page }) {
21 | return (
22 |
23 |
24 |
25 | )
26 | }
27 |
--------------------------------------------------------------------------------
/src/components/products/candyMachine/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero';
2 | import { HeroScreenshot } from '@/components/HeroScreenshot';
3 |
4 | export function Hero({ page }) {
5 | return (
6 |
11 |
17 |
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/src/components/products/cli/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero';
2 | import { HeroCode } from '@/components/HeroCode';
3 |
4 | const codeProps = {
5 | tabs: [
6 | { name: 'MPLX CLI', isActive: true },
7 | ],
8 | language: 'shell',
9 | code: `
10 | mplx toolbox token create --wizard
11 | `,
12 | }
13 |
14 | export function Hero({ page }) {
15 | return (
16 |
17 |
18 |
19 | )
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/products/core/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 | import { HeroCode } from '@/components/HeroCode'
3 |
4 | const codeProps = {
5 | tabs: [
6 | { name: 'metadata.rs', isActive: true },
7 | { name: 'off-chain-metadata.json', isActive: false },
8 | ],
9 | language: 'rust',
10 | code: `pub struct Asset {
11 | pub key: Key,
12 | pub owner: Pubkey,
13 | pub update_authority: UpdateAuthority,
14 | pub name: String,
15 | pub uri: String,
16 | }`,
17 | }
18 |
19 | export function Hero({ page }) {
20 | return (
21 |
22 |
23 |
24 | )
25 | }
26 |
--------------------------------------------------------------------------------
/src/components/products/coreCandyMachine/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 | import { HeroScreenshot } from '@/components/HeroScreenshot'
3 |
4 | export function Hero({ page }) {
5 | return (
6 |
11 |
17 |
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/src/components/products/das-api/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 | import { HeroCode } from '@/components/HeroCode'
3 |
4 | export function Hero({ page }) {
5 | return (
6 |
7 |
8 |
9 | )
10 | }
11 |
--------------------------------------------------------------------------------
/src/components/products/fusion/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 |
3 | export function Hero({ page }) {
4 | return
5 | }
6 |
--------------------------------------------------------------------------------
/src/components/products/fusion/index.js:
--------------------------------------------------------------------------------
1 | import {
2 | documentationSection
3 | } from '@/shared/sections';
4 | import { CircleStackIcon } from '@heroicons/react/24/solid';
5 | import { Hero } from './Hero';
6 |
7 | export const fusion = {
8 | name: 'Fusion',
9 | headline: 'NFTs inside NFTs',
10 | description: 'Create composable NFTs.',
11 | navigationMenuCatergory: 'MPL',
12 | path: 'fusion',
13 | icon: ,
14 | github: 'https://github.com/metaplex-foundation/mpl-trifle',
15 | className: 'accent-amber',
16 | heroes: [{ path: '/fusion', component: Hero }],
17 | sections: [
18 | {
19 | ...documentationSection('fusion'),
20 | navigation: [
21 | {
22 | title: 'Introduction',
23 | links: [
24 | { title: 'Overview', href: '/fusion' },
25 | { title: 'Getting Started', href: '/fusion/getting-started' },
26 | ],
27 | },
28 | {
29 | title: 'Features',
30 | links: [
31 | { title: 'Constraint Types', href: '/fusion/constraint-types' },
32 | { title: 'Transfer Effects', href: '/fusion/transfer-effects' },
33 | ],
34 | },
35 | ],
36 | },
37 | ],
38 | }
39 |
--------------------------------------------------------------------------------
/src/components/products/global/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 | import CoreBanner from '@/images/core-banner.jpg'
3 | import Link from 'next/link'
4 |
5 | export function Hero({ page }) {
6 | return (
7 |
14 |
15 |
16 | )
17 | }
18 |
--------------------------------------------------------------------------------
/src/components/products/global/Logo.jsx:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx'
2 |
3 | export function Logo({ className, ...props }) {
4 | return (
5 |
17 | )
18 | }
19 |
--------------------------------------------------------------------------------
/src/components/products/guides/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 | import { HeroCode } from '@/components/HeroCode'
3 | import HoloCode from "../../../images/holo-code.jpg"
4 |
5 | const codeProps = {
6 | tabs: [
7 | { name: 'metadata.rs', isActive: true },
8 | { name: 'offchain-metadata.json', isActive: false },
9 | ],
10 | language: 'rust',
11 | code: `pub struct Asset {
12 | pub key: Key,
13 | pub owner: Pubkey,
14 | pub update_authority: UpdateAuthority,
15 | pub name: String,
16 | pub uri: String,
17 | }`,
18 | }
19 |
20 | export function Hero({ page }) {
21 | return (
22 |
23 | {/*
*/}
24 | {/* */}
25 |
26 | )
27 | }
28 |
--------------------------------------------------------------------------------
/src/components/products/hydra/index.js:
--------------------------------------------------------------------------------
1 | import {
2 | documentationSection,
3 | referencesSection
4 | } from '@/shared/sections'
5 | import { ArrowsPointingOutIcon } from '@heroicons/react/24/solid'
6 | import { Hero } from './Hero'
7 |
8 | export const hydra = {
9 | name: 'Hydra',
10 | headline: 'Fanout wallets',
11 | description: 'Create shared wallets, split between multiple shareholders.',
12 | path: 'hydra',
13 | navigationMenuCatergory: 'MPL',
14 | icon: ,
15 | github: 'https://github.com/metaplex-foundation/mpl-hydra',
16 | className: 'accent-amber',
17 | heroes: [{ path: '/hydra', component: Hero }],
18 | sections: [
19 | {
20 | ...documentationSection('hydra'),
21 | navigation: [
22 | {
23 | title: 'Introduction',
24 | links: [
25 | { title: 'Overview', href: '/hydra' },
26 | { title: 'Quick Start', href: '/hydra/quick-start' },
27 | ],
28 | },
29 | ],
30 | },
31 | {
32 | ...referencesSection('hydra'),
33 | href: `https://mpl-hydra.typedoc.metaplex.com/`,
34 | target: '_blank',
35 | },
36 | ],
37 | }
38 |
--------------------------------------------------------------------------------
/src/components/products/index.js:
--------------------------------------------------------------------------------
1 | import { amman } from './amman';
2 | import { aura } from './aura';
3 | import { bubblegum } from './bubblegum';
4 | import { bubblegumv2 } from './bubblegum-v2';
5 | import { candyMachine } from './candyMachine';
6 | import { cli } from './cli';
7 | import { core } from './core';
8 | import { coreCandyMachine } from './coreCandyMachine';
9 | import { das } from './das-api';
10 | import { fusion } from './fusion';
11 | import { global } from './global';
12 | import { guides } from './guides';
13 | import { hydra } from './hydra';
14 | import { inscription } from './inscription';
15 | import { legacyDocumentation } from './legacyDocumentation';
16 | import { mplHybrid } from './mpl-hybrid';
17 | import { sugar } from './sugar';
18 | import { tokenAuthRules } from './tokenAuthRules';
19 | import { tokenMetadata } from './tokenMetadata';
20 | import { umi } from './umi';
21 |
22 | export const productCategories = [
23 | // 'Aura',
24 | 'MPL',
25 | 'Dev Tools'
26 | ]
27 |
28 | export const products = [
29 | global,
30 | tokenMetadata,
31 | tokenAuthRules,
32 | bubblegum,
33 | bubblegumv2,
34 | candyMachine,
35 | fusion,
36 | hydra,
37 | inscription,
38 | umi,
39 | amman,
40 | das,
41 | core,
42 | coreCandyMachine,
43 | legacyDocumentation,
44 | sugar,
45 | mplHybrid,
46 | guides,
47 | aura,
48 | cli
49 | ].sort((a, b) => a.name.localeCompare(b.name))
50 |
--------------------------------------------------------------------------------
/src/components/products/inscription/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 |
3 | export function Hero({ page }) {
4 | return
5 | }
6 |
--------------------------------------------------------------------------------
/src/components/products/legacyDocumentation/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 | import { HeroCode } from '@/components/HeroCode'
3 |
4 | export function Hero({ page }) {
5 | return (
6 | <>>
7 | )
8 | }
9 |
--------------------------------------------------------------------------------
/src/components/products/mpl-hybrid/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero';
2 | import { HeroCode } from '@/components/HeroCode';
3 |
4 | const codeProps = {
5 | tabs: [
6 | { name: 'captureV1.js', isActive: true },
7 | ],
8 | language: 'javascript',
9 | code: `const captureTx = await captureV1(umi, {
10 | owner: umi.identity,
11 | escrow: escrowAddress,
12 | asset: escrowAssets[0].publicKey,
13 | collection: COLLECTION,
14 | feeProjectAccount: FEE_WALLET,
15 | token: TOKEN,
16 | }).sendAndConfirm(umi);`,
17 | }
18 |
19 | export function Hero({ page }) {
20 | return (
21 |
22 |
23 |
24 | )
25 | }
26 |
27 |
--------------------------------------------------------------------------------
/src/components/products/sugar/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 | import { HeroScreenshot } from '@/components/HeroScreenshot'
3 |
4 | export function Hero({ page }) {
5 | return (
6 |
11 |
17 |
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/src/components/products/sugar/index.js:
--------------------------------------------------------------------------------
1 | import { CommandLineIcon } from '@heroicons/react/24/solid';
2 | import { Hero } from './Hero';
3 |
4 | export const sugar = {
5 | name: 'Sugar',
6 | headline: 'Create Candy Machines easily',
7 | description: 'Create Candy Machines easily',
8 | navigationMenuCatergory: 'Dev Tools',
9 | path: 'candy-machine/sugar',
10 | icon: ,
11 | github: 'https://github.com/metaplex-foundation/sugar',
12 | className: 'accent-sky',
13 | heroes: [{ path: '/candy-machine/sugar', component: Hero }],
14 | sections: [
15 | ],
16 | }
17 |
--------------------------------------------------------------------------------
/src/components/products/tokenAuthRules/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero';
2 |
3 | export function Hero({ page }) {
4 | return
5 | }
6 |
--------------------------------------------------------------------------------
/src/components/products/tokenMetadata/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 | import { HeroCode } from '@/components/HeroCode'
3 |
4 | const codeProps = {
5 | tabs: [
6 | { name: 'metadata.rs', isActive: true },
7 | { name: 'off-chain-metadata.json', isActive: false },
8 | ],
9 | language: 'rust',
10 | code: `pub struct Metadata {
11 | pub key: Key,
12 | pub update_authority: Pubkey,
13 | pub mint: Pubkey,
14 | pub data: Data,
15 | pub primary_sale_happened: bool,
16 | pub is_mutable: bool,
17 | // ...
18 | }`,
19 | }
20 |
21 | export function Hero({ page }) {
22 | return (
23 |
27 |
28 |
29 | )
30 | }
31 |
--------------------------------------------------------------------------------
/src/components/products/umi/Hero.jsx:
--------------------------------------------------------------------------------
1 | import { Hero as BaseHero } from '@/components/Hero'
2 |
3 | export function Hero({ page }) {
4 | return
5 | }
6 |
--------------------------------------------------------------------------------
/src/images/blur-cyan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/src/images/blur-cyan.png
--------------------------------------------------------------------------------
/src/images/blur-indigo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/src/images/blur-indigo.png
--------------------------------------------------------------------------------
/src/images/core-banner.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/src/images/core-banner.jpg
--------------------------------------------------------------------------------
/src/images/holo-code.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/src/images/holo-code.jpg
--------------------------------------------------------------------------------
/src/images/logos/discord-mark-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/src/images/logos/discord-mark-white.png
--------------------------------------------------------------------------------
/src/images/logos/github-mark-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/src/images/logos/github-mark-white.png
--------------------------------------------------------------------------------
/src/images/logos/github-mark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/src/images/logos/github-mark.png
--------------------------------------------------------------------------------
/src/images/logos/x-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/metaplex-foundation/developer-hub/80ace8d9f8359296fb8ef0d0a64fd33c25db5fc5/src/images/logos/x-black.png
--------------------------------------------------------------------------------
/src/lib/api/aura/das/getAssetProofBatch.js:
--------------------------------------------------------------------------------
1 | const getAssetProofBatch = {
2 | description:
3 | 'Get the proof of a compressed Digital Asset NFT (cNFT) by its ID',
4 | method: 'getAssetProofBatch',
5 | params: [
6 | {
7 | type: 'array',
8 | description: 'Public keys of the assets you want to fetch proofs for',
9 | name: 'ids',
10 | value: [],
11 | required: true,
12 | placeHolder: 'Asset Public Key',
13 | },
14 | ],
15 | }
16 |
17 | export default getAssetProofBatch
18 |
--------------------------------------------------------------------------------
/src/lib/api/aura/das/getTokenAccounts.js:
--------------------------------------------------------------------------------
1 | const getTokenAccounts = {
2 | description: 'Returns the token accounts for a given set of addresses',
3 | method: 'getTokenAccounts',
4 | params: [
5 | {
6 | name: 'mint',
7 | type: 'string',
8 | description: 'Public key of the mint to retrieve',
9 | placeholder: 'Public key of the mint',
10 | },
11 | {
12 | name: 'owner',
13 | type: 'string',
14 | description: 'Owner public key of the token accounts to revtrieve',
15 | placeholder: 'Owner public key',
16 | },
17 | {
18 | name: 'limit',
19 | type: 'number',
20 | description: 'Number of assets to return',
21 | },
22 | {
23 | name: 'page',
24 | type: 'number',
25 | description: 'The index of the "page" to retrieve.',
26 | },
27 | {
28 | name: 'cursor',
29 | type: 'string',
30 | description: 'pagination cursor',
31 | },
32 | {
33 | name: 'before',
34 | type: 'string',
35 | description: 'Retrieve assets before the specified ID',
36 | },
37 | {
38 | name: 'after',
39 | type: 'string',
40 | description: 'Retrieve assets after the specified ID',
41 | },
42 | {
43 | name: 'options',
44 | type: 'object',
45 | value: {
46 | showZeroBalance: {
47 | type: 'boolean',
48 | description: 'Show zero balance accounts',
49 | }
50 | }
51 | }
52 | ],
53 | }
54 |
55 | export default getTokenAccounts
56 |
--------------------------------------------------------------------------------
/src/lib/api/aura/methods.js:
--------------------------------------------------------------------------------
1 | import getAssetsByAuthority from './das/getAssestByAuthority'
2 | import getAsset from './das/getAsset'
3 | import getAssetBatch from './das/getAssetBatch'
4 | import getAssetProof from './das/getAssetProof'
5 | import getAssetProofBatch from './das/getAssetProofBatch'
6 | import getAssetsByCreator from './das/getAssetsByCreator'
7 | import getAssetsByGroup from './das/getAssetsByGroup'
8 | import getAssetsByOwner from './das/getAssetsByOwner'
9 | import getSignaturesForAsset from './das/getSignaturesForAsset'
10 | import getTokenAccounts from './das/getTokenAccounts'
11 | import searchAssets from './das/searchAssest'
12 |
13 |
14 | import testApiMethod from './template'
15 |
16 | const apiMethods = {
17 | testApiMethod: testApiMethod,
18 | getAsset: getAsset,
19 | getAssetProof: getAssetProof,
20 | getAssetsByAuthority: getAssetsByAuthority,
21 | getAssetsByCreator: getAssetsByCreator,
22 | getAssetsByGroup: getAssetsByGroup,
23 | getAssetsByOwner: getAssetsByOwner,
24 | getAssetBatch: getAssetBatch,
25 | getAssetProofBatch: getAssetProofBatch,
26 | searchAssets: searchAssets,
27 | getSignaturesForAsset: getSignaturesForAsset,
28 | getTokenAccounts: getTokenAccounts,
29 | }
30 | export default apiMethods
31 |
--------------------------------------------------------------------------------
/src/lib/api/aura/template.js:
--------------------------------------------------------------------------------
1 | // Mock API object
2 |
3 | const testApiMethod = {
4 | method: 'template',
5 | params: [
6 | {
7 | type: 'string',
8 | description: 'Name of the person',
9 | name: 'name',
10 | value: 'John Doe',
11 | placeholder: 'John Doe',
12 | availableValues: ['John Doe', 'Jane Doe'],
13 | optional: true,
14 | },
15 | { type: 'number', name: 'age', value: 30, placeholder: 30, optional: true },
16 | { type: 'boolean', name: 'isStudent', value: false },
17 | {
18 | type: 'array',
19 | name: 'hobbies',
20 | value: [],
21 | placeholder: ['reading', 'coding', 'hiking'],
22 | },
23 | {
24 | type: 'object',
25 | name: 'address',
26 | value: {
27 | city: {
28 | type: 'string',
29 | value: 'Metropolis',
30 | placeholder: 'Metropolis',
31 | },
32 | street: {
33 | type: 'string',
34 | value: 'Main Street',
35 | placeholder: 'Main Street',
36 | },
37 | zip: { type: 'number', value: 54321, placeholder: 54321 },
38 | },
39 | },
40 | {
41 | type: 'string',
42 | name: 'dateOfBirth',
43 | value: '1992-05-14',
44 | placeholder: '1992-05-14',
45 | },
46 | {
47 | type: 'file',
48 | name: 'profilePicture',
49 | value: 'base64_encoded_string',
50 | placeholder: 'base64_encoded_string',
51 | },
52 | ],
53 | }
54 |
55 | export default testApiMethod
56 |
--------------------------------------------------------------------------------
/src/lib/api/renderRequestBody.js:
--------------------------------------------------------------------------------
1 | const renderRequestBody = (params) => {
2 | const renderParam = (param) => {
3 | switch (param.type) {
4 | case 'object':
5 | return Object.entries(param.value).reduce((acc, [key, value]) => {
6 | acc[key] = renderParam(value)
7 | return acc
8 | }, {})
9 | case 'array':
10 | return param.value.map((item) => renderParam(item))
11 | default:
12 | // Return the value for primitive types
13 | return param.value
14 | }
15 | }
16 |
17 | return params.reduce((acc, param) => {
18 | acc[param.name] = renderParam(param)
19 | return acc
20 | }, {})
21 | }
22 |
23 | export default renderRequestBody
24 |
--------------------------------------------------------------------------------
/src/lib/api/template.js:
--------------------------------------------------------------------------------
1 | // Mock API object
2 |
3 | const templateApiMethod = {
4 | method: 'templateApiMethod',
5 | params: [
6 | {
7 | type: 'string',
8 | name: 'name',
9 | value: 'John Doe',
10 | availableValues: ['John Doe', 'Jane Doe'],
11 | optional: true,
12 | },
13 | { type: 'number', name: 'age', value: 30 },
14 | { type: 'boolean', name: 'isStudent', value: false },
15 | {
16 | type: 'array',
17 | name: 'hobbies',
18 | value: ['reading', 'coding', 'hiking'],
19 | },
20 | {
21 | type: 'object',
22 | name: 'address',
23 | value: {
24 | city: { type: 'string', value: 'Metropolis' },
25 | street: { type: 'string', value: 'Main Street' },
26 | zip: { type: 'number', value: 54321 },
27 | },
28 | },
29 | { type: 'null', name: 'middleName', value: null },
30 | { type: 'string', name: 'dateOfBirth', value: '1992-05-14' },
31 | { type: 'file', name: 'profilePicture', value: 'base64_encoded_string' },
32 | ],
33 | }
34 |
35 | export default templateApiMethod
36 |
--------------------------------------------------------------------------------
/src/pages/404.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Page Not Found
3 | metaTitle: Page Not Found | Metaplex Developer Hub
4 | description: We couldn't find this page in the Metaplex Developer Hub.
5 | ---
6 |
7 | We couldn't find this page in the Metaplex Developer Hub.
8 |
9 | Select a product below to get started.
10 |
11 | {% all-product-grid /%}
12 |
--------------------------------------------------------------------------------
/src/pages/amman/cli-commands.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: CLI Commands
3 | metaTitle: CLI Commands | Amman
4 | description: CLI Commands of the Metaplex Amman local validator toolkit.
5 | ---
6 |
7 | ```sh
8 | amman [command]
9 |
10 | Commands:
11 | amman start Launches a solana-test-validator and the amman relay and/or
12 | mock storage if so configured
13 | amman stop Stops the relay and storage and kills the running solana
14 | test validator
15 | amman logs Launches 'solana logs' and pipes them through a prettifier
16 | amman airdrop Airdrops provided Sol to the payer
17 | amman label Adds labels for accounts or transactions to amman
18 | amman account Retrieves account information for a PublicKey or a label or
19 | shows all labeled accounts
20 | amman run Executes the provided command after expanding all address
21 | labels
22 |
23 | Options:
24 | --help Show help [boolean]
25 | --version Show version number [boolean]
26 | ```
27 |
28 | ## Running Commands
29 |
30 | ```sh
31 | npx amman start
32 | ```
33 |
34 | If no `config.js` is provided _amman_ looks for an `.ammanrc.js` file in the current directory.
35 | If that isn't found either it uses a default config.
36 |
37 | If you added Amman into your package.json scripts you can respectively run Amman from your package installer of choice.
38 |
39 | ```sh
40 | // npm
41 | npm run amman:start
42 |
43 | // yarn
44 | yarn amman:start
45 |
46 | // pnpm
47 | pnpm run amman:start
48 | ```
49 |
--------------------------------------------------------------------------------
/src/pages/amman/getting-started.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Getting Started
3 | metaTitle: Getting Started | Amman
4 | description: Installation and setup of the Metaplex Amman local validator toolkit.
5 | ---
6 |
7 | ## Prerequisites.
8 |
9 | Before running Amman your system will need to have a few things installed on your system.
10 |
11 | - [Rust](https://www.rust-lang.org/tools/install)
12 | - [Solana CLI](https://docs.solanalabs.com/cli/install)
13 | - [NodeJs](https://nodejs.org/en/download)
14 |
15 | ## Installation
16 |
17 | Once you have initiated a new or opened an existing project you can install Amman via a package manager.
18 |
19 | ```js
20 | npm i @metaplex-foundation/amman
21 | ```
22 |
23 | ## Add to Scripts (optional)
24 |
25 | For ease of use you may wish to add the execution of Amman to your package.json scripts.
26 |
27 | {% dialect-switcher title="package.json" %}
28 | {% dialect title="JavaScript" id="js" %}
29 |
30 | ```js
31 | "scripts": {
32 | ...
33 | "amman:start": "npx amman start"
34 | },
35 | ```
36 | {% /dialect %}
37 | {% /dialect-switcher %}
38 |
--------------------------------------------------------------------------------
/src/pages/amman/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Overview
3 | metaTitle: Overview | Amman
4 | description: Provides a high-level overview of Amman local validator.
5 | ---
6 |
7 | **A** **m** odern **man** datory toolbelt to help test solana SDK libraries and apps on a locally
8 | running validator. {% .lead %}
9 |
10 | {% quick-links %}
11 |
12 | {% quick-link title="Getting Started" icon="InboxArrowDown" href="/amman/getting-started" description="Find the language or library of your choice and get started essentials programs." /%}
13 |
14 | {% quick-link title="Configurations" icon="CodeBracketSquare" href="/amman/pre-made-configs" description="A set of ready made configurations for you to try and modify." /%}
15 |
16 | {% /quick-links %}
17 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/get-asset-batch.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Get Asset Batch
3 | metaTitle: Get Asset Batch Method | Aura API
4 | description: Learn about the Get Asset Batch Aura API Method.
5 | ---
6 |
7 | Fetch a batch of NFT Digital Assets from the Solana blockchain including NFTs, pNFTs, cNFTs.
8 |
9 | {% apiRenderer method="getAssetBatch" /%}
10 |
11 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/get-asset-proof-batch.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Get Asset Proof Batch
3 | metaTitle: Get Asset Proof Batch Method | Aura API
4 | description: Learn about the Get Asset Proof Batch Aura API Method.
5 | ---
6 |
7 | Fetch a batch of Compressed NFT Digital Asset (cNFT) Proofs Metaplex Aura DAS API.
8 |
9 | {% apiRenderer method="getAssetProofBatch" /%}
10 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/get-asset-proof.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Get Asset Proof
3 | metaTitle: Get Asset Proof Method | Aura API
4 | description: Learn about the GetAsset Aura API Method.
5 | ---
6 |
7 | Fetch the proof of a Compressed NFT Digital Asset (cNFT) with Aura DAS API.
8 |
9 | {% apiRenderer method="getAssetProof" /%}
10 |
11 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/get-asset.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Get Asset
3 | metaTitle: Get Asset Method | Aura API
4 | description: Learn about the Get Asset Aura API Method.
5 | ---
6 |
7 | Fetch an NFT Digital Asset from the Solana blockchain including NFTs, pNFTs, cNFTs.
8 |
9 | {% apiRenderer method="getAsset" /%}
10 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/get-assets-by-authority.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Get Assets by Authority
3 | metaTitle: Get Assets by Authority Method | Aura API
4 | description: Learn about the Get Assets by Authority Aura API Method.
5 | ---
6 |
7 | Returns the list of assets given an authority address.
8 |
9 | {% apiRenderer method="getAssetsByAuthority" /%}
10 |
11 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/get-assets-by-creator.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Get Assets by Creator
3 | metaTitle: Get Assets by Creator Method | Aura API
4 | description: Learn about the Get Assets by Creator Aura API Method.
5 | ---
6 |
7 | Returns a list of assets based on a given creator address.
8 |
9 | {% apiRenderer method="getAssetsByCreator" /%}
10 |
11 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/get-assets-by-group.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Get Assets by Group
3 | metaTitle: Get Assets by Group Method | Aura API
4 | description: Learn about the Get Assets by Group Aura API Method.
5 | ---
6 |
7 | Return the list of assets given a group (key, value) pair. For example this can be used to get all assets in a collection.
8 |
9 | {% apiRenderer method="getAssetsByGroup" /%}
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/get-assets-by-owner.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Get Assets by Owner
3 | metaTitle: Get Assets by Owner Method | Aura API
4 | description: Learn about the Get Assets by Owner Aura API Method.
5 | ---
6 |
7 | Return a list of assets owned by a particular public key.
8 |
9 | {% apiRenderer method="getAssetsByOwner" /%}
10 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/get-signatures-for-asset.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Get Signatures For Asset
3 | metaTitle: Get Signatures For Asset | Aura API
4 | description: Learn about the Get Signatures For Asset Aura API Method.
5 | ---
6 |
7 | Search and return a list of signatures associated with a Compressed NFT Digital Asset (cNFT).
8 |
9 | {% apiRenderer method="getSignaturesForAsset" /%}
10 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/get-token-accounts.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Get Token Accounts
3 | metaTitle: Get Token Accounts | Aura API
4 | description: Learn about the Get Token Accounts Aura API Method.
5 | ---
6 |
7 | Search and return a list of token accounts based on criteria.
8 |
9 | {% apiRenderer method="getTokenAccounts" /%}
10 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/das/search-assets.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Search Asset
3 | metaTitle: Search Asset Method | Aura API
4 | description: Learn about the Search Asset Aura API Method.
5 | ---
6 |
7 | Return the list of assets given a search criteria.
8 |
9 | {% apiRenderer method="searchAssets" /%}
10 |
--------------------------------------------------------------------------------
/src/pages/aura/api/v1/testApiMethod.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Test Api Method
3 | metaTitle: Test Api Method | Aura Api
4 | description: Learn how Batch Minting works.
5 | ---
6 |
7 |
8 | {% apiRenderer method="testApiMethod" /%}
--------------------------------------------------------------------------------
/src/pages/aura/blockchains/eclipse.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Aura on Eclipse SVM
3 | metaTitle: Aura on Eclipse SVM | Aura
4 | description: Learn about Metaplex Aura on the Eclipse SVM blockchain.
5 | ---
6 |
7 | {% callout title="Aura Endpoints" %}
8 |
9 | **You can test out Aura on the Eclipse SVM at the following nodes:**
10 | - **Devnet**: https://aura-eclipse-devnet.metaplex.com
11 | - **Mainnet**: https://aura-eclipse-mainnet.metaplex.com
12 |
13 | {% /callout %}
--------------------------------------------------------------------------------
/src/pages/aura/blockchains/solana.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Aura on Solana
3 | metaTitle: Aura on Solana | Aura
4 | description: Learn about Metaplex Aura on the Solana blockchain.
5 | ---
6 |
7 | {% callout title="Aura Endpoints" %}
8 |
9 | **You can test out Aura on Solana at the following nodes:**
10 | - **Devnet**: https://aura-devnet.metaplex.com
11 | - **Mainnet**: https://aura-mainnet.metaplex.com
12 |
13 | {% /callout %}
--------------------------------------------------------------------------------
/src/pages/aura/faq.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: FAQ
3 | metaTitle: FAQ | Aura
4 | description: Frequently asked questions about Aura
5 | ---
6 |
7 | ## How can I access the Aura gateway?
8 |
9 | The Aura gateway is currently disabled and undergoing a technical review in order to address certain errors and performance issues.
10 |
11 | ## What protocols does Aura support?
12 |
13 | Aura supports the following protocols with the latest DAS methods:
14 | - MPL Token Metadata (NFT/pNFT)
15 | - MPL Core (Core Assets/Core Collections)
16 | - MPL Bubblegum (cNFTs)
17 | - Fungible SPL Tokens
18 | - SPL Token22
19 |
--------------------------------------------------------------------------------
/src/pages/aura/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Overview
3 | metaTitle: Overview | Aura
4 | description: High level overview of Aura, an integrated network for digital assets.
5 | ---
6 |
7 | Metaplex Aura is an open source data network implementation that extends Solana and the Solana Virtual Machine (SVM).
8 |
9 | Decentralized applications struggle to compete with centralized alternatives because it can be difficult, costly and slow to read and display the current state of blockchain data. Aura solves these problems by complementing the SVM and MPL with a decentralized network of Aura nodes that performantly index asset data and provide real time data availability.
10 |
11 | ## Reading Solana data
12 |
13 | Users and developers will benefit from decentralized read access on the Solana network, ensuring that digital assets and media content are always accessible, even while compressed, without relying on a single point of failure.
14 |
15 | ## Reference Pages
16 |
17 | - [Reading Solana and SVM Data](/aura/reading-solana-and-svm-data): The Aura Network provides data availability and decentralized indexing for asset data, which can be queried using the [Metaplex Digital Asset Standard (DAS) API](/das-api).
--------------------------------------------------------------------------------
/src/pages/aura/reading-solana-and-svm-data.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Reading Solana and SVM Data
3 | metaTitle: Reading Solana and SVM Data | Aura
4 | description: Learn about Reading Solana and SVM data with Metaplex Aura.
5 | ---
6 |
7 | The Metaplex Aura data network provides developers performant, reliable and accurate read access to onchain state for Solana and other SVM based chains like Eclipse.
8 |
9 | Indexers and RPC providers often face substantial challenges in maintaining data consistency and performance. This is due to several issues:
10 |
11 | - **Data Consistency**: Solana nodes frequently fall out of sync, and the Geyser plugin may skip updates, especially during node resynchronization. This can lead to inconsistencies in the data provided by indexers.
12 | - **Rising Storage Costs**: As the volume of data continues to grow, maintaining and managing indices requires more storage and increases associated costs.
13 | - **User Experience**: Fragmented data availability can result in provider lock-in, forcing users to rely on multiple RPC providers to access all their digital assets across different protocols.
14 |
15 | ## Development Progress
16 |
17 | The development progress of Aura and its features can be found in our github repo [https://github.com/metaplex-foundation/aura/](https://github.com/metaplex-foundation/aura/)
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/pages/bubblegum-v2/sdk/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: MPL-Bubblegum SDKs
3 | metaTitle: SDKs | Bubblegum V2
4 | description: Learn to get started with the compressed NFT standard (cNFT) from Metaplex using the MPL-Bubblegum SDKs.
5 | ---
6 |
7 | Select the language / library you want to use below to get started with the new Metaplex Compressed NFT (cNFT) standard using MPL-Bubblegum.
8 |
9 | {% quick-links %}
10 |
11 | {% quick-link title="JavaScript" icon="JavaScript" href="/bubblegum-v2/sdk/javascript" description="Get started with our JavaScript library for MPL-Bubblegum based on the Umi framework." /%}
12 |
13 | {% quick-link title="Rust" icon="Rust" href="/bubblegum-v2/sdk/rust" description="Get started using our MPL-Bubblegum Rust crate." /%}
14 |
15 | {% /quick-links %}
16 |
--------------------------------------------------------------------------------
/src/pages/bubblegum/guides/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Guides
3 | metaTitle: Guides | Bubblegum
4 | description: A list of guides and tutorials for the Metaplex Bubblegum compressed NFTs program on the Solana blockchain.
5 | ---
6 |
7 | The following Guides for MPL Bubblegum are currently available:
8 |
9 | {% quick-links %}
10 |
11 | {% quick-link title="How to create a 1,000,000 NFT Collection on Solana" icon="CodeBracketSquare" href="/bubblegum/guides/javascript/how-to-create-1000000-nfts-on-solana" description="Learn how to create and mint cNFTs from Bubblegum trees" /%}
12 |
13 | {% quick-link title="How to Interact with cNFTs on Other SVMs" icon="CodeBracketSquare" href="/bubblegum/guides/javascript/how-to-interact-with-cnfts-on-other-svms" description="How to Interact with compressed NFTs, using the Metaplex Bubblegum program, on Solana Virtual Machine (SVM) environments other than Solana devnet and mainnet-beta." /%}
14 |
15 | {% /quick-links %}
--------------------------------------------------------------------------------
/src/pages/bubblegum/sdk/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: MPL-Bubblegum SDKs
3 | metaTitle: SDKs | Bubblegum
4 | description: Learn to get started with the compressed NFT standard (cNFT) from Metaplex using the MPL-Bubblegum SDKs.
5 | ---
6 |
7 | Select the language / library you want to use below to get started with the new Metaplex Compressed NFT (cNFT) standard using MPL-Bubblegum.
8 |
9 | {% quick-links %}
10 |
11 | {% quick-link title="JavaScript" icon="JavaScript" href="/bubblegum/sdk/javascript" description="Get started with our JavaScript library for MPL-Bubblegum based on the Umi framework." /%}
12 |
13 | {% quick-link title="Rust" icon="Rust" href="/bubblegum/sdk/rust" description="Get started using our MPL-Bubblegum Rust crate." /%}
14 |
15 | {% /quick-links %}
16 |
--------------------------------------------------------------------------------
/src/pages/candy-machine/getting-started/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Getting Started
3 | metaTitle: Getting Started | Candy Machine
4 | description: Get started with Candy Machines.
5 | ---
6 |
7 | Select the language / library you want to use below to get started with Candy Machines.
8 |
9 | {% quick-links %}
10 |
11 | {% quick-link title="JavaScript" icon="JavaScript" href="/candy-machine/getting-started/js" description="Get started with our JavaScript library based on the Umi framework." /%}
12 |
13 | {% quick-link title="Rust" icon="Rust" href="/candy-machine/getting-started/rust" description="Get started using our Rust crate." /%}
14 |
15 | {% quick-link title="Sugar" icon="SolidCommandLine" href="/candy-machine/sugar/getting-started" description="Get started using the command-line tool Sugar." /%}
16 |
17 | {% /quick-links %}
18 |
--------------------------------------------------------------------------------
/src/pages/candy-machine/getting-started/rust.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Getting Started using Rust
3 | metaTitle: Candy Machine - Getting Started - Rust SDK | Candy Machine
4 | description: Get started with Candy Machines using Rust
5 | ---
6 |
7 | If you are a Rust developer, you can also use a Rust crate to interact with the Candy Machine program. Since the program is written in Rust, this crate contains all the program's logic, including helper methods that prepare instructions for us.
8 |
9 | This can be helpful if you are developing a Rust client or if you want to make [CPI calls](https://solanacookbook.com/references/programs.html#how-to-do-cross-program-invocation) to the Candy Machine program within your program.
10 |
11 | Since candy machines are composed of two programs, you will need to install two libraries.
12 |
13 | - **Candy Machine Core**
14 | - [GitHub Repository](https://github.com/metaplex-foundation/mpl-candy-machine/tree/main/programs/candy-machine-core)
15 | - [Crate Page](https://crates.io/crates/mpl-candy-machine-core)
16 | - [API References](https://docs.rs/mpl-candy-machine-core/0.1.0/mpl_candy_machine_core/)
17 | - **Candy Guard**
18 | - [GitHub Repository](https://github.com/metaplex-foundation/mpl-candy-machine/tree/main/programs/candy-guard)
19 | - [Crate Page](https://crates.io/crates/mpl-candy-guard)
20 | - [API References](https://docs.rs/mpl-candy-guard/0.1.0/mpl_candy_guard/)
21 |
--------------------------------------------------------------------------------
/src/pages/candy-machine/guides/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Guides for Metaplex Candy Machine
3 | metaTitle: Guides for Metaplex Candy Machine | Candy Machine
4 | description: A list of guides for the Metaplex Candy Machine for creating NFT collections on Solana.
5 | ---
6 |
7 | {% quick-links %}
8 | {% quick-link title="Airdrop example - Mint NFTs to Another Wallet" icon="CodeBracketSquare" href="/candy-machine/guides/airdrop-mint-to-another-wallet" description="Learn how to Airdrop NFT using Sugar CLI or Typescript" /%}
9 | {% quick-link title="Create an NFT Collection on Solana using Candy Machine" icon="CodeBracketSquare" href="/candy-machine/guides/create-an-nft-collection-on-solana-with-candy-machine" description="Learn how to launch an NFT collection on Solana using Metaplex Candy Machine and the Sugar CLI" /%}
10 | {% /quick-links %}
--------------------------------------------------------------------------------
/src/pages/candy-machine/references/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: API References
3 | metaTitle: API References | Candy Machine
4 | description: References and code snippets for Metaplex's Candy Machine product.
5 | ---
6 |
7 | - 📦 JavaScript:
8 | * [Candy Machine](https://mpl-candy-machine.typedoc.metaplex.com/)
9 | - 🦀 Rust programs:
10 | * [Candy Machine Core](https://docs.rs/mpl-candy-machine-core/0.1.0/mpl_candy_machine_core/)
11 | * [Candy Guard](https://docs.rs/mpl-candy-guard/0.1.0/mpl_candy_guard/)
12 |
--------------------------------------------------------------------------------
/src/pages/candy-machine/sugar/commands/bundlr.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: bundlr
3 | metaTitle: bundlr | Sugar
4 | description: bundlr command.
5 | ---
6 |
7 | When you use Bundlr as your upload method, Sugar automatically funds your account on the Bundlr Network to cover the storage costs. Once the upload is completed, there could be leftover funds in the account.
8 |
9 | You can verify your balance on the Bundlr Network with the following command:
10 |
11 | ```
12 | sugar bundlr balance
13 | ```
14 |
15 | This will retrieve the balance for the current keypair. You can specify an alternative keypair using the option `--keypair`. The remaining balance (if there is any) can be withdrawn:
16 |
17 | ```
18 | sugar bundlr withdraw
19 | ```
20 |
21 | At the end of the withdrawal, the funds available on the Bundlr Network will be transferred to your Solana address.
--------------------------------------------------------------------------------
/src/pages/candy-machine/sugar/commands/collection.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: collection
3 | metaTitle: collection | Sugar
4 | description: collection command.
5 | ---
6 |
7 | You can use the `collection`` commands to manually set the collection NFT of your Candy Machine. You can only modify the collection before any NFTs have been minted from it.
8 |
9 | You can set a pre-existing collection NFT by running:
10 |
11 | ```
12 | sugar collection set
13 | ```
14 |
15 | where `` is the public key of the collection NFT mint account.
--------------------------------------------------------------------------------
/src/pages/candy-machine/sugar/commands/config.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: config
3 | metaTitle: config | Sugar
4 | description: config command.
5 | ---
6 |
7 | The `config` command allows you manage your Candy Machine configuration. By default, Sugar looks for a `config.json` file in the current directory to load the Candy Machine configuration – the configuration file name can be specified with a `-c` or `--config` option on every command that requires it.
8 |
9 | You can either create this file manually, following these [instructions](/candy-machine/sugar/configuration), or use the config create command:
10 |
11 | ```
12 | sugar config create
13 | ```
14 |
15 | Executing the command starts an interactive process consisting in a sequence of prompts to gather information about all configuration options. At the end of it, a configuration file is saved (default to config.json) or its content is displayed on screen. To specify a custom file name, use the option `-c`:
16 |
17 | ```
18 | sugar config create -c my-config.json
19 | ```
20 |
21 | Once your Candy Machine is deployed, any changes to the configuration file must be set to the Candy Machine account using the `update` sub-command:
22 |
23 | ```
24 | sugar config update
25 | ```
26 |
27 | You can update the Candu Machine authority (the public key that controls the Candy Machine) using the `-n` option:
28 |
29 | ```
30 | sugar config update -n
31 | ```
32 |
33 | You can also change the token standard of the assets minted through the Candy Machine by using the `set` sub-command. This command supports changing the type of asset to either `NFT`s or `pNFT`s using the `-t` option. It also allows you to specify a rule set for minted pNFTs.
34 |
35 | ```
36 | sugar config set -t "pnft" --rule-set
37 | ```
38 |
--------------------------------------------------------------------------------
/src/pages/candy-machine/sugar/commands/deploy.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: deploy
3 | metaTitle: deploy | Sugar
4 | description: deploy command.
5 | ---
6 |
7 | Once all assets are uploaded and the cache file is successfully created, you are ready to deploy your items to Solana:
8 |
9 | ```
10 | sugar deploy
11 | ```
12 |
13 | The deploy command will write the information of your cache file to the Candy Machine account onchain. This effectively creates the Candy Machine and displays its onchain ID (Public Key) — use this ID to query its information onchain using an [explorer](https://explorer.solana.com). You can specify the path for the configuration file with the `-c` option (default `config.json`) and the name of the cache file with the option `--cache` (default `cache.json``) in case you are not using the default names.
--------------------------------------------------------------------------------
/src/pages/candy-machine/sugar/commands/freeze.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: freeze
3 | metaTitle: freeze | Sugar
4 | description: freeze command.
5 | ---
6 |
7 | When the Candy Machine has the freeze guard enabled, the `freeze` command can be used to manage its different stages.
8 |
9 | After enabling the freeze guard on the default guards or an individual group, it needs to be initialized before minting can start. To initialize the freeze guard, use the `initialize` sub-command:
10 |
11 | ```
12 | sugar freeze initialize --period
13 | ```
14 |
15 | where `--period` determines the interval in seconds that minted assets will be frozen. After this period, holders can thaw their assets.
16 |
17 | If the freeze Guard is not in the `default` group `--label