From 5b4e11547d48059dd7b2a32068437e222f38c4c3 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Tue, 7 Jul 2026 00:58:18 +0530 Subject: [PATCH 1/9] docs: add Ephemeral SPL Token section and remove stale spl-api docs --- api-reference/spl-api/checked-transfer.mdx | 4 - .../create-ephemeral-ata-permission.mdx | 4 - .../delegate-ephemeral-ata-permission.mdx | 4 - .../spl-api/delegate-ephemeral-ata.mdx | 4 - api-reference/spl-api/deposit-spl-tokens.mdx | 4 - api-reference/spl-api/get-config.mdx | 3 - api-reference/spl-api/initialize-ata.mdx | 4 - .../spl-api/initialize-ephemeral-ata.mdx | 4 - .../spl-api/initialize-global-vault.mdx | 4 - api-reference/spl-api/introduction-per.mdx | 101 -- .../reset-ephemeral-ata-permission.mdx | 4 - .../undelegate-ephemeral-ata-permission.mdx | 4 - .../spl-api/undelegate-ephemeral-ata.mdx | 4 - api-reference/spl-api/withdraw-spl-tokens.mdx | 4 - cn/api-reference/spl-api/checked-transfer.mdx | 4 - .../create-ephemeral-ata-permission.mdx | 4 - .../delegate-ephemeral-ata-permission.mdx | 4 - .../spl-api/delegate-ephemeral-ata.mdx | 4 - .../spl-api/deposit-spl-tokens.mdx | 4 - cn/api-reference/spl-api/get-config.mdx | 3 - cn/api-reference/spl-api/initialize-ata.mdx | 4 - .../spl-api/initialize-ephemeral-ata.mdx | 4 - .../spl-api/initialize-global-vault.mdx | 4 - cn/api-reference/spl-api/introduction-per.mdx | 101 -- .../reset-ephemeral-ata-permission.mdx | 4 - .../undelegate-ephemeral-ata-permission.mdx | 4 - .../spl-api/undelegate-ephemeral-ata.mdx | 4 - .../spl-api/withdraw-spl-tokens.mdx | 4 - docs.json | 142 +- jp/api-reference/spl-api/checked-transfer.mdx | 4 - .../create-ephemeral-ata-permission.mdx | 4 - .../delegate-ephemeral-ata-permission.mdx | 4 - .../spl-api/delegate-ephemeral-ata.mdx | 4 - .../spl-api/deposit-spl-tokens.mdx | 4 - jp/api-reference/spl-api/get-config.mdx | 3 - jp/api-reference/spl-api/initialize-ata.mdx | 4 - .../spl-api/initialize-ephemeral-ata.mdx | 4 - .../spl-api/initialize-global-vault.mdx | 4 - jp/api-reference/spl-api/introduction-per.mdx | 101 -- .../reset-ephemeral-ata-permission.mdx | 4 - .../undelegate-ephemeral-ata-permission.mdx | 4 - .../spl-api/undelegate-ephemeral-ata.mdx | 4 - .../spl-api/withdraw-spl-tokens.mdx | 4 - ko/api-reference/spl-api/checked-transfer.mdx | 4 - .../create-ephemeral-ata-permission.mdx | 4 - .../delegate-ephemeral-ata-permission.mdx | 4 - .../spl-api/delegate-ephemeral-ata.mdx | 4 - .../spl-api/deposit-spl-tokens.mdx | 4 - ko/api-reference/spl-api/get-config.mdx | 3 - ko/api-reference/spl-api/initialize-ata.mdx | 4 - .../spl-api/initialize-ephemeral-ata.mdx | 4 - .../spl-api/initialize-global-vault.mdx | 4 - ko/api-reference/spl-api/introduction-per.mdx | 101 -- .../reset-ephemeral-ata-permission.mdx | 4 - .../undelegate-ephemeral-ata-permission.mdx | 4 - .../spl-api/undelegate-ephemeral-ata.mdx | 4 - .../spl-api/withdraw-spl-tokens.mdx | 4 - .../api-reference/balance.mdx | 4 + .../api-reference/challenge.mdx | 4 + .../api-reference/deposit.mdx | 4 + .../api-reference/health.mdx | 4 + .../api-reference/initialize-mint.mdx | 4 + .../api-reference/introduction.mdx | 117 ++ .../api-reference/is-mint-initialized.mdx | 4 + .../api-reference/login.mdx | 4 + .../ephemeral-spl-token/api-reference/mcp.mdx | 4 + .../openapi/balance.openapi.json | 0 .../openapi/challenge.openapi.json | 0 .../openapi/deposit.openapi.json | 3 +- .../openapi/health.openapi.json | 0 .../openapi/initialize-mint.openapi.json | 0 .../openapi/is-mint-initialized.openapi.json | 0 .../api-reference}/openapi/login.openapi.json | 0 .../api-reference}/openapi/mcp.openapi.json | 0 .../openapi/private-balance.openapi.json | 0 .../api-reference}/openapi/quote.openapi.json | 0 .../openapi/stealth-pool.openapi.json | 170 +++ .../api-reference}/openapi/swap.openapi.json | 0 .../openapi/transaction-send.openapi.json | 123 ++ .../transfer-queue-ensure-crank.openapi.json | 77 + .../openapi/transfer.openapi.json | 25 +- .../undelegate-ephemeral-ata.openapi.json | 95 ++ .../openapi/withdraw.openapi.json | 0 .../api-reference/private-balance.mdx | 4 + .../api-reference/quote.mdx | 4 + .../api-reference/stealth-pool-status.mdx | 4 + .../api-reference/stealth-pool.mdx | 4 + .../api-reference/swap.mdx | 4 + .../api-reference/transaction-send.mdx | 4 + .../transfer-queue-ensure-crank.mdx | 4 + .../api-reference/transfer.mdx | 4 + .../undelegate-ephemeral-ata.mdx | 4 + .../api-reference/withdraw.mdx | 4 + pages/ephemeral-spl-token/overview.mdx | 120 ++ .../ephemeral-spl-token/private-payments.mdx | 171 +++ pages/ephemeral-spl-token/quickstart.mdx | 120 ++ .../smart-contract-integration.mdx | 155 ++ .../additional-information/pricing.mdx | 2 +- .../api-reference/per/balance.mdx | 4 - .../api-reference/per/challenge.mdx | 4 - .../api-reference/per/deposit.mdx | 4 - .../api-reference/per/health.mdx | 4 - .../api-reference/per/initialize-mint.mdx | 4 - .../api-reference/per/introduction.mdx | 144 +- .../api-reference/per/is-mint-initialized.mdx | 4 - .../api-reference/per/login.mdx | 4 - .../api-reference/per/mcp.mdx | 4 - .../per/openapi/privacy-openapi.json | 1271 ----------------- .../api-reference/per/private-balance.mdx | 4 - .../api-reference/per/quote.mdx | 4 - .../api-reference/per/swap.mdx | 4 - .../api-reference/per/transfer.mdx | 4 - .../api-reference/per/withdraw.mdx | 4 - .../ephemeral-spl-private-payments.mdx | 256 ---- pages/templates/private-payments.mdx | 2 +- snippets/product-cards.mdx | 8 +- snippets/quick-access-spl.mdx | 22 + snippets/spl-tokens-code/delegate.mdx | 16 + snippets/spl-tokens-code/program.mdx | 24 + snippets/spl-tokens-code/sc-commit.mdx | 11 + snippets/spl-tokens-code/sc-create-eata.mdx | 11 + snippets/spl-tokens-code/sc-delegate.mdx | 24 + snippets/spl-tokens-code/sc-ephemeral.mdx | 12 + snippets/spl-tokens-code/sc-non-custody.mdx | 9 + snippets/spl-tokens-code/sc-post-commit.mdx | 9 + snippets/spl-tokens-code/sc-transfer.mdx | 15 + snippets/spl-tokens-code/transfer.mdx | 19 + snippets/spl-tokens-code/undelegate.mdx | 12 + snippets/spl-tokens-code/withdraw.mdx | 11 + 129 files changed, 1582 insertions(+), 2346 deletions(-) delete mode 100644 api-reference/spl-api/checked-transfer.mdx delete mode 100644 api-reference/spl-api/create-ephemeral-ata-permission.mdx delete mode 100644 api-reference/spl-api/delegate-ephemeral-ata-permission.mdx delete mode 100644 api-reference/spl-api/delegate-ephemeral-ata.mdx delete mode 100644 api-reference/spl-api/deposit-spl-tokens.mdx delete mode 100644 api-reference/spl-api/get-config.mdx delete mode 100644 api-reference/spl-api/initialize-ata.mdx delete mode 100644 api-reference/spl-api/initialize-ephemeral-ata.mdx delete mode 100644 api-reference/spl-api/initialize-global-vault.mdx delete mode 100644 api-reference/spl-api/introduction-per.mdx delete mode 100644 api-reference/spl-api/reset-ephemeral-ata-permission.mdx delete mode 100644 api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx delete mode 100644 api-reference/spl-api/undelegate-ephemeral-ata.mdx delete mode 100644 api-reference/spl-api/withdraw-spl-tokens.mdx delete mode 100644 cn/api-reference/spl-api/checked-transfer.mdx delete mode 100644 cn/api-reference/spl-api/create-ephemeral-ata-permission.mdx delete mode 100644 cn/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx delete mode 100644 cn/api-reference/spl-api/delegate-ephemeral-ata.mdx delete mode 100644 cn/api-reference/spl-api/deposit-spl-tokens.mdx delete mode 100644 cn/api-reference/spl-api/get-config.mdx delete mode 100644 cn/api-reference/spl-api/initialize-ata.mdx delete mode 100644 cn/api-reference/spl-api/initialize-ephemeral-ata.mdx delete mode 100644 cn/api-reference/spl-api/initialize-global-vault.mdx delete mode 100644 cn/api-reference/spl-api/introduction-per.mdx delete mode 100644 cn/api-reference/spl-api/reset-ephemeral-ata-permission.mdx delete mode 100644 cn/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx delete mode 100644 cn/api-reference/spl-api/undelegate-ephemeral-ata.mdx delete mode 100644 cn/api-reference/spl-api/withdraw-spl-tokens.mdx delete mode 100644 jp/api-reference/spl-api/checked-transfer.mdx delete mode 100644 jp/api-reference/spl-api/create-ephemeral-ata-permission.mdx delete mode 100644 jp/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx delete mode 100644 jp/api-reference/spl-api/delegate-ephemeral-ata.mdx delete mode 100644 jp/api-reference/spl-api/deposit-spl-tokens.mdx delete mode 100644 jp/api-reference/spl-api/get-config.mdx delete mode 100644 jp/api-reference/spl-api/initialize-ata.mdx delete mode 100644 jp/api-reference/spl-api/initialize-ephemeral-ata.mdx delete mode 100644 jp/api-reference/spl-api/initialize-global-vault.mdx delete mode 100644 jp/api-reference/spl-api/introduction-per.mdx delete mode 100644 jp/api-reference/spl-api/reset-ephemeral-ata-permission.mdx delete mode 100644 jp/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx delete mode 100644 jp/api-reference/spl-api/undelegate-ephemeral-ata.mdx delete mode 100644 jp/api-reference/spl-api/withdraw-spl-tokens.mdx delete mode 100644 ko/api-reference/spl-api/checked-transfer.mdx delete mode 100644 ko/api-reference/spl-api/create-ephemeral-ata-permission.mdx delete mode 100644 ko/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx delete mode 100644 ko/api-reference/spl-api/delegate-ephemeral-ata.mdx delete mode 100644 ko/api-reference/spl-api/deposit-spl-tokens.mdx delete mode 100644 ko/api-reference/spl-api/get-config.mdx delete mode 100644 ko/api-reference/spl-api/initialize-ata.mdx delete mode 100644 ko/api-reference/spl-api/initialize-ephemeral-ata.mdx delete mode 100644 ko/api-reference/spl-api/initialize-global-vault.mdx delete mode 100644 ko/api-reference/spl-api/introduction-per.mdx delete mode 100644 ko/api-reference/spl-api/reset-ephemeral-ata-permission.mdx delete mode 100644 ko/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx delete mode 100644 ko/api-reference/spl-api/undelegate-ephemeral-ata.mdx delete mode 100644 ko/api-reference/spl-api/withdraw-spl-tokens.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/balance.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/challenge.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/deposit.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/health.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/initialize-mint.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/introduction.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/is-mint-initialized.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/login.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/mcp.mdx rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/balance.openapi.json (100%) rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/challenge.openapi.json (100%) rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/deposit.openapi.json (96%) rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/health.openapi.json (100%) rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/initialize-mint.openapi.json (100%) rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/is-mint-initialized.openapi.json (100%) rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/login.openapi.json (100%) rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/mcp.openapi.json (100%) rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/private-balance.openapi.json (100%) rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/quote.openapi.json (100%) create mode 100644 pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/swap.openapi.json (100%) create mode 100644 pages/ephemeral-spl-token/api-reference/openapi/transaction-send.openapi.json create mode 100644 pages/ephemeral-spl-token/api-reference/openapi/transfer-queue-ensure-crank.openapi.json rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/transfer.openapi.json (83%) create mode 100644 pages/ephemeral-spl-token/api-reference/openapi/undelegate-ephemeral-ata.openapi.json rename pages/{private-ephemeral-rollups-pers/api-reference/per => ephemeral-spl-token/api-reference}/openapi/withdraw.openapi.json (100%) create mode 100644 pages/ephemeral-spl-token/api-reference/private-balance.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/quote.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/stealth-pool-status.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/stealth-pool.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/swap.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/transaction-send.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/transfer.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata.mdx create mode 100644 pages/ephemeral-spl-token/api-reference/withdraw.mdx create mode 100644 pages/ephemeral-spl-token/overview.mdx create mode 100644 pages/ephemeral-spl-token/private-payments.mdx create mode 100644 pages/ephemeral-spl-token/quickstart.mdx create mode 100644 pages/ephemeral-spl-token/smart-contract-integration.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/balance.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/challenge.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/deposit.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/health.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/initialize-mint.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/is-mint-initialized.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/login.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/mcp.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/private-balance.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/quote.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/swap.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/transfer.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/api-reference/per/withdraw.mdx delete mode 100644 pages/private-ephemeral-rollups-pers/how-to-guide/ephemeral-spl-private-payments.mdx create mode 100644 snippets/quick-access-spl.mdx create mode 100644 snippets/spl-tokens-code/delegate.mdx create mode 100644 snippets/spl-tokens-code/program.mdx create mode 100644 snippets/spl-tokens-code/sc-commit.mdx create mode 100644 snippets/spl-tokens-code/sc-create-eata.mdx create mode 100644 snippets/spl-tokens-code/sc-delegate.mdx create mode 100644 snippets/spl-tokens-code/sc-ephemeral.mdx create mode 100644 snippets/spl-tokens-code/sc-non-custody.mdx create mode 100644 snippets/spl-tokens-code/sc-post-commit.mdx create mode 100644 snippets/spl-tokens-code/sc-transfer.mdx create mode 100644 snippets/spl-tokens-code/transfer.mdx create mode 100644 snippets/spl-tokens-code/undelegate.mdx create mode 100644 snippets/spl-tokens-code/withdraw.mdx diff --git a/api-reference/spl-api/checked-transfer.mdx b/api-reference/spl-api/checked-transfer.mdx deleted file mode 100644 index 86f8e51..0000000 --- a/api-reference/spl-api/checked-transfer.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Checked Transfer for SPL Tokens" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/checked-transfer ---- diff --git a/api-reference/spl-api/create-ephemeral-ata-permission.mdx b/api-reference/spl-api/create-ephemeral-ata-permission.mdx deleted file mode 100644 index 89f0a18..0000000 --- a/api-reference/spl-api/create-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Create Ephemeral ATA Permission" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/create-ephemeral-ata-permission ---- diff --git a/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx b/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx deleted file mode 100644 index e7ae127..0000000 --- a/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Delegate Ephemeral ATA Permission" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/delegate-ephemeral-ata-permission ---- diff --git a/api-reference/spl-api/delegate-ephemeral-ata.mdx b/api-reference/spl-api/delegate-ephemeral-ata.mdx deleted file mode 100644 index 2eca82a..0000000 --- a/api-reference/spl-api/delegate-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Delegate Ephemeral ATA" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/delegate-ephemeral-ata ---- diff --git a/api-reference/spl-api/deposit-spl-tokens.mdx b/api-reference/spl-api/deposit-spl-tokens.mdx deleted file mode 100644 index 72f4577..0000000 --- a/api-reference/spl-api/deposit-spl-tokens.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Deposit SPL Tokens" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/deposit-spl-tokens ---- diff --git a/api-reference/spl-api/get-config.mdx b/api-reference/spl-api/get-config.mdx deleted file mode 100644 index 085d62d..0000000 --- a/api-reference/spl-api/get-config.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json GET /config ---- diff --git a/api-reference/spl-api/initialize-ata.mdx b/api-reference/spl-api/initialize-ata.mdx deleted file mode 100644 index 7bd8608..0000000 --- a/api-reference/spl-api/initialize-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Initialize ATA" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-ata ---- diff --git a/api-reference/spl-api/initialize-ephemeral-ata.mdx b/api-reference/spl-api/initialize-ephemeral-ata.mdx deleted file mode 100644 index 55ebebe..0000000 --- a/api-reference/spl-api/initialize-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Initialize Ephemeral ATA" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-ephemeral-ata ---- diff --git a/api-reference/spl-api/initialize-global-vault.mdx b/api-reference/spl-api/initialize-global-vault.mdx deleted file mode 100644 index fc89713..0000000 --- a/api-reference/spl-api/initialize-global-vault.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Initialize Global Vault" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-global-vault ---- diff --git a/api-reference/spl-api/introduction-per.mdx b/api-reference/spl-api/introduction-per.mdx deleted file mode 100644 index 09ea9f8..0000000 --- a/api-reference/spl-api/introduction-per.mdx +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: "Introduction" -description: "Private Ephemeral SPL Token API Documentation" ---- - -## Overview - -The Private Ephemeral SPL Token API allows you to build transactions with SPL tokens on MagicBlock's Ephemeral Rollup. This API provides endpoints to manage ephemeral token accounts, deposits, withdrawals, and delegation operations. - -### Health & Configuration - -- [**Root**](/api-reference/spl-api/root) - Check API health -- [**Get Config**](/api-reference/spl-api/get-config) - Retrieve API configuration settings - -### Setup & Initialization - -- [**Initialize Global Vault**](/api-reference/spl-api/initialize-global-vault) - Set up the global vault for a token mint -- [**Initialize ATA for Global Vault**](/api-reference/spl-api/initialize-ata) - Initialize a global vault token account - -### Token Operations - -- [**Initialize ATA**](/api-reference/spl-api/initialize-ata) - Initialize a token account required for sender and receiver -- [**Initialize Ephemeral ATA**](/api-reference/spl-api/initialize-ephemeral-ata) - Initialize an ephemeral token account required for sender and receiver -- [**Deposit SPL Tokens**](/api-reference/spl-api/deposit-spl-tokens) - Deposit tokens into an ephemeral account -- [**Delegate Ephemeral ATA**](/api-reference/spl-api/delegate-ephemeral-ata) - Delegate an ephemeral account to a Delegation Program -- [**Transfer SPL Tokens**](/api-reference/spl-api/transfer-ephemeral-ata) - Transfer tokens between accounts using SPL checked transfer (**Note:** Ephemeral ATA must be initialized and delegated before transfer) -- [**Undelegate Ephemeral ATA**](/api-reference/spl-api/undelegate-ephemeral-ata) - Remove delegation from an ephemeral account -- [**Withdraw SPL Tokens**](/api-reference/spl-api/withdraw-spl-tokens) - Withdraw tokens from an ephemeral account - -### Permission Management - -- [**Create Ephemeral ATA Permission**](/api-reference/spl-api/create-ephemeral-ata-permission) - Create a permission account for an ephemeral ATA -- [**Delegate Ephemeral ATA Permission**](/api-reference/spl-api/delegate-ephemeral-ata-permission) - Delegate an ephemeral ATA's permission to a Delegation Program to enforce access control -- [**Reset Ephemeral ATA Permission**](/api-reference/spl-api/reset-ephemeral-ata-permission) - Reset permission flags on an ephemeral ATA -- [**Undelegate Ephemeral ATA Permission**](/api-reference/spl-api/undelegate-ephemeral-ata-permission) - Undelegate an ephemeral ATA's permission before closing account - -## Private SPL Token Flow - -The typical flow for private token transfers involves the following steps: - -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ Step 1: Initialize Infrastructure (if not exist) │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Initialize Global Vault for token mint │ -│ • Initialize Global Vault ATA │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ Step 2: Initialize User Accounts (if not exist) │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Initialize Sender ATA │ -│ • Initialize Receiver ATA │ -│ • Initialize Sender Ephemeral ATA │ -│ • Initialize Receiver Ephemeral ATA │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ Step 3: Setup Permissions │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Create Permission(s) for Ephemeral ATA │ -│ • Delegate Permission(s) │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ Step 4: Deposit & Delegate │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Deposit SPL tokens to Global Vault │ -│ • Delegate Sender and Receiver Ephemeral ATA │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ Step 5: Private Transfer │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Transfer tokens between Ephemeral ATAs (Sender → Receiver) │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ Step 6: Undelegate & Withdraw │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Undelegate Ephemeral ATA │ -│ • Withdraw SPL tokens from Ephemeral ATA │ -└─────────────────────────────────────────────────────────────────────┘ -``` - -## Response Format - -### Transaction Responses (POST endpoints) - -All successful POST responses return a transaction object with the following structure: - -```json -{ - "transaction": "base64-encoded-transaction", - "message": "Transaction created successfully" -} -``` - -### Status Responses (GET endpoints) - -GET endpoints return configuration and status information specific to each endpoint. diff --git a/api-reference/spl-api/reset-ephemeral-ata-permission.mdx b/api-reference/spl-api/reset-ephemeral-ata-permission.mdx deleted file mode 100644 index 3201e31..0000000 --- a/api-reference/spl-api/reset-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Reset Ephemeral ATA Permission" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/reset-ephemeral-ata-permission ---- diff --git a/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx b/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx deleted file mode 100644 index f94a076..0000000 --- a/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Undelegate Ephemeral ATA Permission" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/undelegate-ephemeral-ata-permission ---- diff --git a/api-reference/spl-api/undelegate-ephemeral-ata.mdx b/api-reference/spl-api/undelegate-ephemeral-ata.mdx deleted file mode 100644 index dd03b09..0000000 --- a/api-reference/spl-api/undelegate-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Undelegate Ephemeral ATA" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/undelegate-ephemeral-ata ---- diff --git a/api-reference/spl-api/withdraw-spl-tokens.mdx b/api-reference/spl-api/withdraw-spl-tokens.mdx deleted file mode 100644 index a8c84ac..0000000 --- a/api-reference/spl-api/withdraw-spl-tokens.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Withdraw SPL Tokens" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/withdraw-spl-tokens ---- diff --git a/cn/api-reference/spl-api/checked-transfer.mdx b/cn/api-reference/spl-api/checked-transfer.mdx deleted file mode 100644 index 7097b6b..0000000 --- a/cn/api-reference/spl-api/checked-transfer.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "SPL Tokens 校验转账" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/checked-transfer ---- diff --git a/cn/api-reference/spl-api/create-ephemeral-ata-permission.mdx b/cn/api-reference/spl-api/create-ephemeral-ata-permission.mdx deleted file mode 100644 index 3d815b7..0000000 --- a/cn/api-reference/spl-api/create-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "创建 Ephemeral ATA 权限" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/create-ephemeral-ata-permission ---- diff --git a/cn/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx b/cn/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx deleted file mode 100644 index 2bcdca5..0000000 --- a/cn/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "委托 Ephemeral ATA 权限" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/delegate-ephemeral-ata-permission ---- diff --git a/cn/api-reference/spl-api/delegate-ephemeral-ata.mdx b/cn/api-reference/spl-api/delegate-ephemeral-ata.mdx deleted file mode 100644 index e6a6cc0..0000000 --- a/cn/api-reference/spl-api/delegate-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "委托 Ephemeral ATA" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/delegate-ephemeral-ata ---- diff --git a/cn/api-reference/spl-api/deposit-spl-tokens.mdx b/cn/api-reference/spl-api/deposit-spl-tokens.mdx deleted file mode 100644 index ed21557..0000000 --- a/cn/api-reference/spl-api/deposit-spl-tokens.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "存入 SPL Tokens" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/deposit-spl-tokens ---- diff --git a/cn/api-reference/spl-api/get-config.mdx b/cn/api-reference/spl-api/get-config.mdx deleted file mode 100644 index 085d62d..0000000 --- a/cn/api-reference/spl-api/get-config.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json GET /config ---- diff --git a/cn/api-reference/spl-api/initialize-ata.mdx b/cn/api-reference/spl-api/initialize-ata.mdx deleted file mode 100644 index 7da1e7a..0000000 --- a/cn/api-reference/spl-api/initialize-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "初始化 ATA" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-ata ---- diff --git a/cn/api-reference/spl-api/initialize-ephemeral-ata.mdx b/cn/api-reference/spl-api/initialize-ephemeral-ata.mdx deleted file mode 100644 index 5d8f9ce..0000000 --- a/cn/api-reference/spl-api/initialize-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "初始化 Ephemeral ATA" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-ephemeral-ata ---- diff --git a/cn/api-reference/spl-api/initialize-global-vault.mdx b/cn/api-reference/spl-api/initialize-global-vault.mdx deleted file mode 100644 index a848403..0000000 --- a/cn/api-reference/spl-api/initialize-global-vault.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "初始化全局金库" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-global-vault ---- diff --git a/cn/api-reference/spl-api/introduction-per.mdx b/cn/api-reference/spl-api/introduction-per.mdx deleted file mode 100644 index c152186..0000000 --- a/cn/api-reference/spl-api/introduction-per.mdx +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: "介绍" -description: "Private Ephemeral SPL Token API 文档" ---- - -## 概览 - -Private Ephemeral SPL Token API 允许你在 MagicBlock 的 Ephemeral Rollup 上构建 SPL token 交易。这个 API 提供了一组端点,用于管理临时 token 账户、存款、提款和委托操作。 - -### 健康检查与配置 - -- [**Root**](/cn/api-reference/spl-api/root) - 检查 API 健康状态 -- [**Get Config**](/cn/api-reference/spl-api/get-config) - 获取 API 配置设置 - -### 设置与初始化 - -- [**Initialize Global Vault**](/cn/api-reference/spl-api/initialize-global-vault) - 为某个 token mint 设置全局金库 -- [**Initialize ATA for Global Vault**](/cn/api-reference/spl-api/initialize-ata) - 初始化全局金库 token 账户 - -### Token 操作 - -- [**Initialize ATA**](/cn/api-reference/spl-api/initialize-ata) - 初始化发送方和接收方所需的 token 账户 -- [**Initialize Ephemeral ATA**](/cn/api-reference/spl-api/initialize-ephemeral-ata) - 初始化发送方和接收方所需的临时 token 账户 -- [**Deposit SPL Tokens**](/cn/api-reference/spl-api/deposit-spl-tokens) - 将 token 存入临时账户 -- [**Delegate Ephemeral ATA**](/cn/api-reference/spl-api/delegate-ephemeral-ata) - 将临时账户委托给 Delegation Program -- [**Transfer SPL Tokens**](/cn/api-reference/spl-api/transfer-ephemeral-ata) - 使用 SPL checked transfer 在账户之间转移 token(**注意:** 转账前必须先初始化并委托 Ephemeral ATA) -- [**Undelegate Ephemeral ATA**](/cn/api-reference/spl-api/undelegate-ephemeral-ata) - 移除临时账户的委托 -- [**Withdraw SPL Tokens**](/cn/api-reference/spl-api/withdraw-spl-tokens) - 从临时账户提取 token - -### 权限管理 - -- [**Create Ephemeral ATA Permission**](/cn/api-reference/spl-api/create-ephemeral-ata-permission) - 为 Ephemeral ATA 创建权限账户 -- [**Delegate Ephemeral ATA Permission**](/cn/api-reference/spl-api/delegate-ephemeral-ata-permission) - 将 Ephemeral ATA 的权限委托给 Delegation Program,以强制执行访问控制 -- [**Reset Ephemeral ATA Permission**](/cn/api-reference/spl-api/reset-ephemeral-ata-permission) - 重置 Ephemeral ATA 上的权限标志 -- [**Undelegate Ephemeral ATA Permission**](/cn/api-reference/spl-api/undelegate-ephemeral-ata-permission) - 在关闭账户前取消 Ephemeral ATA 的权限委托 - -## Private SPL Token 流程 - -私密 token 转账的典型流程如下: - -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ 第 1 步:初始化基础设施(如果尚不存在) │ -├─────────────────────────────────────────────────────────────────────┤ -│ • 为 token mint 初始化 Global Vault │ -│ • 初始化 Global Vault ATA │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ 第 2 步:初始化用户账户(如果尚不存在) │ -├─────────────────────────────────────────────────────────────────────┤ -│ • 初始化发送方 ATA │ -│ • 初始化接收方 ATA │ -│ • 初始化发送方 Ephemeral ATA │ -│ • 初始化接收方 Ephemeral ATA │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ 第 3 步:设置权限 │ -├─────────────────────────────────────────────────────────────────────┤ -│ • 为 Ephemeral ATA 创建权限 │ -│ • 委托权限 │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ 第 4 步:存入并委托 │ -├─────────────────────────────────────────────────────────────────────┤ -│ • 将 SPL token 存入 Global Vault │ -│ • 委托发送方和接收方的 Ephemeral ATA │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ 第 5 步:私密转账 │ -├─────────────────────────────────────────────────────────────────────┤ -│ • 在 Ephemeral ATA 之间转移 token(发送方 → 接收方) │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ 第 6 步:取消委托并提取 │ -├─────────────────────────────────────────────────────────────────────┤ -│ • 取消 Ephemeral ATA 的委托 │ -│ • 从 Ephemeral ATA 中提取 SPL token │ -└─────────────────────────────────────────────────────────────────────┘ -``` - -## 响应格式 - -### 交易响应(POST 端点) - -所有成功的 POST 响应都会返回如下结构的交易对象: - -```json -{ - "transaction": "base64-encoded-transaction", - "message": "Transaction created successfully" -} -``` - -### 状态响应(GET 端点) - -GET 端点会返回对应端点的配置和状态信息。 diff --git a/cn/api-reference/spl-api/reset-ephemeral-ata-permission.mdx b/cn/api-reference/spl-api/reset-ephemeral-ata-permission.mdx deleted file mode 100644 index 439486d..0000000 --- a/cn/api-reference/spl-api/reset-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "重置 Ephemeral ATA 权限" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/reset-ephemeral-ata-permission ---- diff --git a/cn/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx b/cn/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx deleted file mode 100644 index d8c898f..0000000 --- a/cn/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "取消委托 Ephemeral ATA 权限" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/undelegate-ephemeral-ata-permission ---- diff --git a/cn/api-reference/spl-api/undelegate-ephemeral-ata.mdx b/cn/api-reference/spl-api/undelegate-ephemeral-ata.mdx deleted file mode 100644 index 2b03fa8..0000000 --- a/cn/api-reference/spl-api/undelegate-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "取消委托 Ephemeral ATA" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/undelegate-ephemeral-ata ---- diff --git a/cn/api-reference/spl-api/withdraw-spl-tokens.mdx b/cn/api-reference/spl-api/withdraw-spl-tokens.mdx deleted file mode 100644 index 7f8befa..0000000 --- a/cn/api-reference/spl-api/withdraw-spl-tokens.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "提取 SPL Tokens" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/withdraw-spl-tokens ---- diff --git a/docs.json b/docs.json index 68a5c98..f80ba38 100644 --- a/docs.json +++ b/docs.json @@ -27,9 +27,9 @@ { "source": "/cn/pages/overview/additional-information/solana-vrf", "destination": "/cn/pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf" }, { "source": "/jp/pages/overview/additional-information/solana-vrf", "destination": "/jp/pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf" }, { "source": "/ko/pages/overview/additional-information/solana-vrf", "destination": "/ko/pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf" }, - { "source": "/api-reference/per-api/getConfig", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/introduction" }, - { "source": "/api-reference/per-api/prepareWithdrawal", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/introduction" }, - { "source": "/api-reference/per-api/transferAmount", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/transfer" }, + { "source": "/api-reference/per-api/getConfig", "destination": "/pages/ephemeral-spl-token/api-reference/introduction" }, + { "source": "/api-reference/per-api/prepareWithdrawal", "destination": "/pages/ephemeral-spl-token/api-reference/introduction" }, + { "source": "/api-reference/per-api/transferAmount", "destination": "/pages/ephemeral-spl-token/api-reference/transfer" }, { "source": "/api-reference/er-api/introduction", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/introduction" }, { "source": "/api-reference/er-api/getRoutes", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getRoutes" }, { "source": "/api-reference/er-api/getIdentity", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getIdentity" }, @@ -38,26 +38,26 @@ { "source": "/api-reference/er-api/getAccountInfo", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getAccountInfo" }, { "source": "/api-reference/er-api/getDelegationStatus", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getDelegationStatus" }, { "source": "/api-reference/er-api/getPermission", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getPermission" }, - { "source": "/api-reference/per-api/introduction", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/introduction" }, - { "source": "/api-reference/per-api/health", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/health" }, - { "source": "/api-reference/per-api/deposit", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/deposit" }, - { "source": "/api-reference/per-api/transfer", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/transfer" }, - { "source": "/api-reference/per-api/withdraw", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/withdraw" }, - { "source": "/api-reference/per-api/initialize-mint", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/initialize-mint" }, - { "source": "/api-reference/per-api/balance", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/balance" }, - { "source": "/api-reference/per-api/private-balance", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/private-balance" }, - { "source": "/api-reference/per-api/is-mint-initialized", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/is-mint-initialized" }, - { "source": "/api-reference/per-api/mcp", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/mcp" }, - { "source": "/api-reference/per/introduction", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/introduction" }, - { "source": "/api-reference/per/health", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/health" }, - { "source": "/api-reference/per/deposit", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/deposit" }, - { "source": "/api-reference/per/transfer", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/transfer" }, - { "source": "/api-reference/per/withdraw", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/withdraw" }, - { "source": "/api-reference/per/initialize-mint", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/initialize-mint" }, - { "source": "/api-reference/per/balance", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/balance" }, - { "source": "/api-reference/per/private-balance", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/private-balance" }, - { "source": "/api-reference/per/is-mint-initialized", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/is-mint-initialized" }, - { "source": "/api-reference/per/mcp", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/mcp" }, + { "source": "/api-reference/per-api/introduction", "destination": "/pages/ephemeral-spl-token/api-reference/introduction" }, + { "source": "/api-reference/per-api/health", "destination": "/pages/ephemeral-spl-token/api-reference/health" }, + { "source": "/api-reference/per-api/deposit", "destination": "/pages/ephemeral-spl-token/api-reference/deposit" }, + { "source": "/api-reference/per-api/transfer", "destination": "/pages/ephemeral-spl-token/api-reference/transfer" }, + { "source": "/api-reference/per-api/withdraw", "destination": "/pages/ephemeral-spl-token/api-reference/withdraw" }, + { "source": "/api-reference/per-api/initialize-mint", "destination": "/pages/ephemeral-spl-token/api-reference/initialize-mint" }, + { "source": "/api-reference/per-api/balance", "destination": "/pages/ephemeral-spl-token/api-reference/balance" }, + { "source": "/api-reference/per-api/private-balance", "destination": "/pages/ephemeral-spl-token/api-reference/private-balance" }, + { "source": "/api-reference/per-api/is-mint-initialized", "destination": "/pages/ephemeral-spl-token/api-reference/is-mint-initialized" }, + { "source": "/api-reference/per-api/mcp", "destination": "/pages/ephemeral-spl-token/api-reference/mcp" }, + { "source": "/api-reference/per/introduction", "destination": "/pages/ephemeral-spl-token/api-reference/introduction" }, + { "source": "/api-reference/per/health", "destination": "/pages/ephemeral-spl-token/api-reference/health" }, + { "source": "/api-reference/per/deposit", "destination": "/pages/ephemeral-spl-token/api-reference/deposit" }, + { "source": "/api-reference/per/transfer", "destination": "/pages/ephemeral-spl-token/api-reference/transfer" }, + { "source": "/api-reference/per/withdraw", "destination": "/pages/ephemeral-spl-token/api-reference/withdraw" }, + { "source": "/api-reference/per/initialize-mint", "destination": "/pages/ephemeral-spl-token/api-reference/initialize-mint" }, + { "source": "/api-reference/per/balance", "destination": "/pages/ephemeral-spl-token/api-reference/balance" }, + { "source": "/api-reference/per/private-balance", "destination": "/pages/ephemeral-spl-token/api-reference/private-balance" }, + { "source": "/api-reference/per/is-mint-initialized", "destination": "/pages/ephemeral-spl-token/api-reference/is-mint-initialized" }, + { "source": "/api-reference/per/mcp", "destination": "/pages/ephemeral-spl-token/api-reference/mcp" }, { "source": "/pages/ephemeral-rollups-ers/api-reference/introduction", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/introduction" }, { "source": "/pages/ephemeral-rollups-ers/api-reference/getRoutes", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getRoutes" }, { "source": "/pages/ephemeral-rollups-ers/api-reference/getIdentity", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getIdentity" }, @@ -66,16 +66,16 @@ { "source": "/pages/ephemeral-rollups-ers/api-reference/getAccountInfo", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getAccountInfo" }, { "source": "/pages/ephemeral-rollups-ers/api-reference/getDelegationStatus", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getDelegationStatus" }, { "source": "/pages/ephemeral-rollups-ers/api-reference/getPermission", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getPermission" }, - { "source": "/pages/private-ephemeral-rollups-pers/api-reference/introduction", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/introduction" }, - { "source": "/pages/private-ephemeral-rollups-pers/api-reference/health", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/health" }, - { "source": "/pages/private-ephemeral-rollups-pers/api-reference/deposit", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/deposit" }, - { "source": "/pages/private-ephemeral-rollups-pers/api-reference/transfer", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/transfer" }, - { "source": "/pages/private-ephemeral-rollups-pers/api-reference/withdraw", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/withdraw" }, - { "source": "/pages/private-ephemeral-rollups-pers/api-reference/initialize-mint", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/initialize-mint" }, - { "source": "/pages/private-ephemeral-rollups-pers/api-reference/balance", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/balance" }, - { "source": "/pages/private-ephemeral-rollups-pers/api-reference/private-balance", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/private-balance" }, - { "source": "/pages/private-ephemeral-rollups-pers/api-reference/is-mint-initialized", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/is-mint-initialized" }, - { "source": "/pages/private-ephemeral-rollups-pers/api-reference/mcp", "destination": "/pages/private-ephemeral-rollups-pers/api-reference/per/mcp" }, + { "source": "/pages/private-ephemeral-rollups-pers/api-reference/introduction", "destination": "/pages/ephemeral-spl-token/api-reference/introduction" }, + { "source": "/pages/private-ephemeral-rollups-pers/api-reference/health", "destination": "/pages/ephemeral-spl-token/api-reference/health" }, + { "source": "/pages/private-ephemeral-rollups-pers/api-reference/deposit", "destination": "/pages/ephemeral-spl-token/api-reference/deposit" }, + { "source": "/pages/private-ephemeral-rollups-pers/api-reference/transfer", "destination": "/pages/ephemeral-spl-token/api-reference/transfer" }, + { "source": "/pages/private-ephemeral-rollups-pers/api-reference/withdraw", "destination": "/pages/ephemeral-spl-token/api-reference/withdraw" }, + { "source": "/pages/private-ephemeral-rollups-pers/api-reference/initialize-mint", "destination": "/pages/ephemeral-spl-token/api-reference/initialize-mint" }, + { "source": "/pages/private-ephemeral-rollups-pers/api-reference/balance", "destination": "/pages/ephemeral-spl-token/api-reference/balance" }, + { "source": "/pages/private-ephemeral-rollups-pers/api-reference/private-balance", "destination": "/pages/ephemeral-spl-token/api-reference/private-balance" }, + { "source": "/pages/private-ephemeral-rollups-pers/api-reference/is-mint-initialized", "destination": "/pages/ephemeral-spl-token/api-reference/is-mint-initialized" }, + { "source": "/pages/private-ephemeral-rollups-pers/api-reference/mcp", "destination": "/pages/ephemeral-spl-token/api-reference/mcp" }, { "source": "/api-reference/rpc-api/introduction", "destination": "/pages/ephemeral-rollups-ers/api-reference/rpc/introduction" }, { "source": "/api-reference/rpc-api/getAccountInfo", "destination": "/pages/ephemeral-rollups-ers/api-reference/rpc/getAccountInfo" }, { "source": "/api-reference/rpc-api/getBalance", "destination": "/pages/ephemeral-rollups-ers/api-reference/rpc/getBalance" }, @@ -305,22 +305,68 @@ ] }, { - "group": "Private Payments API", + "group": "Private Payments", "pages": [ - "pages/private-ephemeral-rollups-pers/api-reference/per/introduction", - "pages/private-ephemeral-rollups-pers/api-reference/per/health", - "pages/private-ephemeral-rollups-pers/api-reference/per/challenge", - "pages/private-ephemeral-rollups-pers/api-reference/per/login", - "pages/private-ephemeral-rollups-pers/api-reference/per/deposit", - "pages/private-ephemeral-rollups-pers/api-reference/per/transfer", - "pages/private-ephemeral-rollups-pers/api-reference/per/withdraw", - "pages/private-ephemeral-rollups-pers/api-reference/per/initialize-mint", - "pages/private-ephemeral-rollups-pers/api-reference/per/balance", - "pages/private-ephemeral-rollups-pers/api-reference/per/private-balance", - "pages/private-ephemeral-rollups-pers/api-reference/per/is-mint-initialized", - "pages/private-ephemeral-rollups-pers/api-reference/per/quote", - "pages/private-ephemeral-rollups-pers/api-reference/per/swap", - "pages/private-ephemeral-rollups-pers/api-reference/per/mcp" + "pages/private-ephemeral-rollups-pers/api-reference/per/introduction" + ] + } + ] + }, + { + "tab": "Ephemeral SPL Token", + "icon": "coins", + "groups": [ + { + "group": "How-to-Guide", + "pages": [ + "pages/ephemeral-spl-token/quickstart", + "pages/ephemeral-spl-token/smart-contract-integration", + "pages/ephemeral-spl-token/private-payments" + ] + }, + { + "group": "Reference Material", + "pages": [ + "pages/ephemeral-spl-token/overview" + ] + }, + { + "group": "API Reference", + "pages": [ + "pages/ephemeral-spl-token/api-reference/introduction", + { + "group": "Core Token API", + "pages": [ + "pages/ephemeral-spl-token/api-reference/deposit", + "pages/ephemeral-spl-token/api-reference/transfer", + "pages/ephemeral-spl-token/api-reference/withdraw", + "pages/ephemeral-spl-token/api-reference/balance", + "pages/ephemeral-spl-token/api-reference/initialize-mint", + "pages/ephemeral-spl-token/api-reference/is-mint-initialized", + "pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata", + "pages/ephemeral-spl-token/api-reference/transaction-send" + ] + }, + { + "group": "Private Payments", + "pages": [ + "pages/ephemeral-spl-token/api-reference/challenge", + "pages/ephemeral-spl-token/api-reference/login", + "pages/ephemeral-spl-token/api-reference/private-balance", + "pages/ephemeral-spl-token/api-reference/stealth-pool", + "pages/ephemeral-spl-token/api-reference/stealth-pool-status", + "pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank" + ] + }, + { + "group": "Swap", + "pages": [ + "pages/ephemeral-spl-token/api-reference/quote", + "pages/ephemeral-spl-token/api-reference/swap" + ] + }, + "pages/ephemeral-spl-token/api-reference/health", + "pages/ephemeral-spl-token/api-reference/mcp" ] } ] diff --git a/jp/api-reference/spl-api/checked-transfer.mdx b/jp/api-reference/spl-api/checked-transfer.mdx deleted file mode 100644 index 3cf17fd..0000000 --- a/jp/api-reference/spl-api/checked-transfer.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "SPL Tokens の Checked Transfer" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/checked-transfer ---- diff --git a/jp/api-reference/spl-api/create-ephemeral-ata-permission.mdx b/jp/api-reference/spl-api/create-ephemeral-ata-permission.mdx deleted file mode 100644 index 2d9976b..0000000 --- a/jp/api-reference/spl-api/create-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 権限を作成する" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/create-ephemeral-ata-permission ---- diff --git a/jp/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx b/jp/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx deleted file mode 100644 index f549b57..0000000 --- a/jp/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 権限を委任する" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/delegate-ephemeral-ata-permission ---- diff --git a/jp/api-reference/spl-api/delegate-ephemeral-ata.mdx b/jp/api-reference/spl-api/delegate-ephemeral-ata.mdx deleted file mode 100644 index b283cbe..0000000 --- a/jp/api-reference/spl-api/delegate-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA を委任する" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/delegate-ephemeral-ata ---- diff --git a/jp/api-reference/spl-api/deposit-spl-tokens.mdx b/jp/api-reference/spl-api/deposit-spl-tokens.mdx deleted file mode 100644 index 4c3bfb3..0000000 --- a/jp/api-reference/spl-api/deposit-spl-tokens.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "SPL Tokens を入金する" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/deposit-spl-tokens ---- diff --git a/jp/api-reference/spl-api/get-config.mdx b/jp/api-reference/spl-api/get-config.mdx deleted file mode 100644 index 085d62d..0000000 --- a/jp/api-reference/spl-api/get-config.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json GET /config ---- diff --git a/jp/api-reference/spl-api/initialize-ata.mdx b/jp/api-reference/spl-api/initialize-ata.mdx deleted file mode 100644 index 368b9ff..0000000 --- a/jp/api-reference/spl-api/initialize-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "ATA を初期化する" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-ata ---- diff --git a/jp/api-reference/spl-api/initialize-ephemeral-ata.mdx b/jp/api-reference/spl-api/initialize-ephemeral-ata.mdx deleted file mode 100644 index c2785c8..0000000 --- a/jp/api-reference/spl-api/initialize-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA を初期化する" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-ephemeral-ata ---- diff --git a/jp/api-reference/spl-api/initialize-global-vault.mdx b/jp/api-reference/spl-api/initialize-global-vault.mdx deleted file mode 100644 index e831655..0000000 --- a/jp/api-reference/spl-api/initialize-global-vault.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "グローバル Vault を初期化する" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-global-vault ---- diff --git a/jp/api-reference/spl-api/introduction-per.mdx b/jp/api-reference/spl-api/introduction-per.mdx deleted file mode 100644 index 6f14ef1..0000000 --- a/jp/api-reference/spl-api/introduction-per.mdx +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: "紹介" -description: "Private Ephemeral SPL Token API ドキュメント" ---- - -## 概要 - -Private Ephemeral SPL Token API を使うと、MagicBlock の Ephemeral Rollup 上で SPL token トランザクションを構築できます。この API は、ephemeral token アカウント、入金、出金、委任操作を管理するためのエンドポイントを提供します。 - -### ヘルスチェックと設定 - -- [**Root**](/jp/api-reference/spl-api/root) - API のヘルス状態を確認する -- [**Get Config**](/jp/api-reference/spl-api/get-config) - API の設定情報を取得する - -### セットアップと初期化 - -- [**Initialize Global Vault**](/jp/api-reference/spl-api/initialize-global-vault) - token mint 用の Global Vault を設定する -- [**Initialize ATA for Global Vault**](/jp/api-reference/spl-api/initialize-ata) - Global Vault の token アカウントを初期化する - -### Token 操作 - -- [**Initialize ATA**](/jp/api-reference/spl-api/initialize-ata) - 送信者と受信者に必要な token アカウントを初期化する -- [**Initialize Ephemeral ATA**](/jp/api-reference/spl-api/initialize-ephemeral-ata) - 送信者と受信者に必要な ephemeral token アカウントを初期化する -- [**Deposit SPL Tokens**](/jp/api-reference/spl-api/deposit-spl-tokens) - token を ephemeral アカウントへ入金する -- [**Delegate Ephemeral ATA**](/jp/api-reference/spl-api/delegate-ephemeral-ata) - ephemeral アカウントを Delegation Program に委任する -- [**Transfer SPL Tokens**](/jp/api-reference/spl-api/transfer-ephemeral-ata) - SPL checked transfer を使ってアカウント間で token を転送する(**注意:** 転送前に Ephemeral ATA を初期化し、委任しておく必要があります) -- [**Undelegate Ephemeral ATA**](/jp/api-reference/spl-api/undelegate-ephemeral-ata) - ephemeral アカウントの委任を解除する -- [**Withdraw SPL Tokens**](/jp/api-reference/spl-api/withdraw-spl-tokens) - ephemeral アカウントから token を引き出す - -### 権限管理 - -- [**Create Ephemeral ATA Permission**](/jp/api-reference/spl-api/create-ephemeral-ata-permission) - ephemeral ATA 用の権限アカウントを作成する -- [**Delegate Ephemeral ATA Permission**](/jp/api-reference/spl-api/delegate-ephemeral-ata-permission) - アクセス制御を適用するため、ephemeral ATA の権限を Delegation Program に委任する -- [**Reset Ephemeral ATA Permission**](/jp/api-reference/spl-api/reset-ephemeral-ata-permission) - ephemeral ATA 上の権限フラグをリセットする -- [**Undelegate Ephemeral ATA Permission**](/jp/api-reference/spl-api/undelegate-ephemeral-ata-permission) - アカウントを閉じる前に ephemeral ATA の権限委任を解除する - -## Private SPL Token の流れ - -プライベート token 転送の一般的な流れは次のとおりです。 - -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ ステップ 1: 基盤を初期化する(未作成の場合) │ -├─────────────────────────────────────────────────────────────────────┤ -│ • token mint 用の Global Vault を初期化する │ -│ • Global Vault ATA を初期化する │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ ステップ 2: ユーザーアカウントを初期化する(未作成の場合) │ -├─────────────────────────────────────────────────────────────────────┤ -│ • 送信者 ATA を初期化する │ -│ • 受信者 ATA を初期化する │ -│ • 送信者 Ephemeral ATA を初期化する │ -│ • 受信者 Ephemeral ATA を初期化する │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ ステップ 3: 権限を設定する │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Ephemeral ATA 用の権限を作成する │ -│ • 権限を委任する │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ ステップ 4: 入金して委任する │ -├─────────────────────────────────────────────────────────────────────┤ -│ • SPL token を Global Vault に入金する │ -│ • 送信者と受信者の Ephemeral ATA を委任する │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ ステップ 5: プライベート転送 │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Ephemeral ATA 間で token を転送する(送信者 → 受信者) │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ ステップ 6: 委任解除して引き出す │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Ephemeral ATA の委任を解除する │ -│ • Ephemeral ATA から SPL token を引き出す │ -└─────────────────────────────────────────────────────────────────────┘ -``` - -## レスポンス形式 - -### トランザクションレスポンス(POST エンドポイント) - -成功した POST レスポンスはすべて、次の構造のトランザクションオブジェクトを返します。 - -```json -{ - "transaction": "base64-encoded-transaction", - "message": "Transaction created successfully" -} -``` - -### ステータスレスポンス(GET エンドポイント) - -GET エンドポイントは、それぞれのエンドポイント固有の設定情報と状態情報を返します。 diff --git a/jp/api-reference/spl-api/reset-ephemeral-ata-permission.mdx b/jp/api-reference/spl-api/reset-ephemeral-ata-permission.mdx deleted file mode 100644 index 0c01914..0000000 --- a/jp/api-reference/spl-api/reset-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 権限をリセットする" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/reset-ephemeral-ata-permission ---- diff --git a/jp/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx b/jp/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx deleted file mode 100644 index 5b49b3b..0000000 --- a/jp/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 権限の委任を解除する" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/undelegate-ephemeral-ata-permission ---- diff --git a/jp/api-reference/spl-api/undelegate-ephemeral-ata.mdx b/jp/api-reference/spl-api/undelegate-ephemeral-ata.mdx deleted file mode 100644 index 692c432..0000000 --- a/jp/api-reference/spl-api/undelegate-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA の委任を解除する" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/undelegate-ephemeral-ata ---- diff --git a/jp/api-reference/spl-api/withdraw-spl-tokens.mdx b/jp/api-reference/spl-api/withdraw-spl-tokens.mdx deleted file mode 100644 index 30277d6..0000000 --- a/jp/api-reference/spl-api/withdraw-spl-tokens.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "SPL Tokens を出金する" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/withdraw-spl-tokens ---- diff --git a/ko/api-reference/spl-api/checked-transfer.mdx b/ko/api-reference/spl-api/checked-transfer.mdx deleted file mode 100644 index cc6c25c..0000000 --- a/ko/api-reference/spl-api/checked-transfer.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "SPL Tokens 확인 전송" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/checked-transfer ---- diff --git a/ko/api-reference/spl-api/create-ephemeral-ata-permission.mdx b/ko/api-reference/spl-api/create-ephemeral-ata-permission.mdx deleted file mode 100644 index 1c362a1..0000000 --- a/ko/api-reference/spl-api/create-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 권한 생성" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/create-ephemeral-ata-permission ---- diff --git a/ko/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx b/ko/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx deleted file mode 100644 index 79c774c..0000000 --- a/ko/api-reference/spl-api/delegate-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 권한 위임" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/delegate-ephemeral-ata-permission ---- diff --git a/ko/api-reference/spl-api/delegate-ephemeral-ata.mdx b/ko/api-reference/spl-api/delegate-ephemeral-ata.mdx deleted file mode 100644 index 56d45a6..0000000 --- a/ko/api-reference/spl-api/delegate-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 위임" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/delegate-ephemeral-ata ---- diff --git a/ko/api-reference/spl-api/deposit-spl-tokens.mdx b/ko/api-reference/spl-api/deposit-spl-tokens.mdx deleted file mode 100644 index 08824a5..0000000 --- a/ko/api-reference/spl-api/deposit-spl-tokens.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "SPL Tokens 예치" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/deposit-spl-tokens ---- diff --git a/ko/api-reference/spl-api/get-config.mdx b/ko/api-reference/spl-api/get-config.mdx deleted file mode 100644 index 085d62d..0000000 --- a/ko/api-reference/spl-api/get-config.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json GET /config ---- diff --git a/ko/api-reference/spl-api/initialize-ata.mdx b/ko/api-reference/spl-api/initialize-ata.mdx deleted file mode 100644 index 1efe1c2..0000000 --- a/ko/api-reference/spl-api/initialize-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "ATA 초기화" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-ata ---- diff --git a/ko/api-reference/spl-api/initialize-ephemeral-ata.mdx b/ko/api-reference/spl-api/initialize-ephemeral-ata.mdx deleted file mode 100644 index ec81279..0000000 --- a/ko/api-reference/spl-api/initialize-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 초기화" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-ephemeral-ata ---- diff --git a/ko/api-reference/spl-api/initialize-global-vault.mdx b/ko/api-reference/spl-api/initialize-global-vault.mdx deleted file mode 100644 index 4df4ab6..0000000 --- a/ko/api-reference/spl-api/initialize-global-vault.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "전역 Vault 초기화" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/initialize-global-vault ---- diff --git a/ko/api-reference/spl-api/introduction-per.mdx b/ko/api-reference/spl-api/introduction-per.mdx deleted file mode 100644 index 2e48ade..0000000 --- a/ko/api-reference/spl-api/introduction-per.mdx +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: "소개" -description: "Private Ephemeral SPL Token API 문서" ---- - -## 개요 - -Private Ephemeral SPL Token API를 사용하면 MagicBlock의 Ephemeral Rollup에서 SPL token 트랜잭션을 구성할 수 있습니다. 이 API는 ephemeral token 계정, 예치, 출금, 위임 작업을 관리하기 위한 엔드포인트를 제공합니다. - -### 상태 확인 및 설정 - -- [**Root**](/ko/api-reference/spl-api/root) - API 상태 확인 -- [**Get Config**](/ko/api-reference/spl-api/get-config) - API 설정 정보 조회 - -### 설정 및 초기화 - -- [**Initialize Global Vault**](/ko/api-reference/spl-api/initialize-global-vault) - token mint용 Global Vault 설정 -- [**Initialize ATA for Global Vault**](/ko/api-reference/spl-api/initialize-ata) - Global Vault token 계정 초기화 - -### Token 작업 - -- [**Initialize ATA**](/ko/api-reference/spl-api/initialize-ata) - 송신자와 수신자에게 필요한 token 계정 초기화 -- [**Initialize Ephemeral ATA**](/ko/api-reference/spl-api/initialize-ephemeral-ata) - 송신자와 수신자에게 필요한 ephemeral token 계정 초기화 -- [**Deposit SPL Tokens**](/ko/api-reference/spl-api/deposit-spl-tokens) - token을 ephemeral 계정에 예치 -- [**Delegate Ephemeral ATA**](/ko/api-reference/spl-api/delegate-ephemeral-ata) - ephemeral 계정을 Delegation Program에 위임 -- [**Transfer SPL Tokens**](/ko/api-reference/spl-api/transfer-ephemeral-ata) - SPL checked transfer로 계정 간 token 전송 (**참고:** 전송 전에 Ephemeral ATA를 초기화하고 위임해야 함) -- [**Undelegate Ephemeral ATA**](/ko/api-reference/spl-api/undelegate-ephemeral-ata) - ephemeral 계정의 위임 제거 -- [**Withdraw SPL Tokens**](/ko/api-reference/spl-api/withdraw-spl-tokens) - ephemeral 계정에서 token 출금 - -### 권한 관리 - -- [**Create Ephemeral ATA Permission**](/ko/api-reference/spl-api/create-ephemeral-ata-permission) - ephemeral ATA용 권한 계정 생성 -- [**Delegate Ephemeral ATA Permission**](/ko/api-reference/spl-api/delegate-ephemeral-ata-permission) - 접근 제어를 강제하기 위해 ephemeral ATA의 권한을 Delegation Program에 위임 -- [**Reset Ephemeral ATA Permission**](/ko/api-reference/spl-api/reset-ephemeral-ata-permission) - ephemeral ATA의 권한 플래그 초기화 -- [**Undelegate Ephemeral ATA Permission**](/ko/api-reference/spl-api/undelegate-ephemeral-ata-permission) - 계정을 닫기 전에 ephemeral ATA의 권한 위임 해제 - -## Private SPL Token 흐름 - -비공개 token 전송의 일반적인 흐름은 다음과 같습니다. - -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ 1단계: 인프라 초기화(없다면) │ -├─────────────────────────────────────────────────────────────────────┤ -│ • token mint용 Global Vault 초기화 │ -│ • Global Vault ATA 초기화 │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ 2단계: 사용자 계정 초기화(없다면) │ -├─────────────────────────────────────────────────────────────────────┤ -│ • 송신자 ATA 초기화 │ -│ • 수신자 ATA 초기화 │ -│ • 송신자 Ephemeral ATA 초기화 │ -│ • 수신자 Ephemeral ATA 초기화 │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ 3단계: 권한 설정 │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Ephemeral ATA용 권한 생성 │ -│ • 권한 위임 │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ 4단계: 예치 및 위임 │ -├─────────────────────────────────────────────────────────────────────┤ -│ • SPL token을 Global Vault에 예치 │ -│ • 송신자와 수신자의 Ephemeral ATA 위임 │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ 5단계: 비공개 전송 │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Ephemeral ATA 간 token 전송(송신자 → 수신자) │ -└─────────────────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────────────────┐ -│ 6단계: 위임 해제 및 출금 │ -├─────────────────────────────────────────────────────────────────────┤ -│ • Ephemeral ATA 위임 해제 │ -│ • Ephemeral ATA에서 SPL token 출금 │ -└─────────────────────────────────────────────────────────────────────┘ -``` - -## 응답 형식 - -### 트랜잭션 응답(POST 엔드포인트) - -성공한 모든 POST 응답은 다음 구조의 트랜잭션 객체를 반환합니다. - -```json -{ - "transaction": "base64-encoded-transaction", - "message": "Transaction created successfully" -} -``` - -### 상태 응답(GET 엔드포인트) - -GET 엔드포인트는 각 엔드포인트별 설정 및 상태 정보를 반환합니다. diff --git a/ko/api-reference/spl-api/reset-ephemeral-ata-permission.mdx b/ko/api-reference/spl-api/reset-ephemeral-ata-permission.mdx deleted file mode 100644 index bc97e56..0000000 --- a/ko/api-reference/spl-api/reset-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 권한 재설정" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/reset-ephemeral-ata-permission ---- diff --git a/ko/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx b/ko/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx deleted file mode 100644 index b87b978..0000000 --- a/ko/api-reference/spl-api/undelegate-ephemeral-ata-permission.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 권한 위임 해제" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/undelegate-ephemeral-ata-permission ---- diff --git a/ko/api-reference/spl-api/undelegate-ephemeral-ata.mdx b/ko/api-reference/spl-api/undelegate-ephemeral-ata.mdx deleted file mode 100644 index 207cd96..0000000 --- a/ko/api-reference/spl-api/undelegate-ephemeral-ata.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Ephemeral ATA 위임 해제" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/undelegate-ephemeral-ata ---- diff --git a/ko/api-reference/spl-api/withdraw-spl-tokens.mdx b/ko/api-reference/spl-api/withdraw-spl-tokens.mdx deleted file mode 100644 index 8cb41fe..0000000 --- a/ko/api-reference/spl-api/withdraw-spl-tokens.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "SPL Tokens 출금" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json POST /tx/withdraw-spl-tokens ---- diff --git a/pages/ephemeral-spl-token/api-reference/balance.mdx b/pages/ephemeral-spl-token/api-reference/balance.mdx new file mode 100644 index 0000000..caf36a4 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/balance.mdx @@ -0,0 +1,4 @@ +--- +title: "Balance" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/balance.openapi.json GET /v1/spl/balance +--- diff --git a/pages/ephemeral-spl-token/api-reference/challenge.mdx b/pages/ephemeral-spl-token/api-reference/challenge.mdx new file mode 100644 index 0000000..ab9fbd0 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/challenge.mdx @@ -0,0 +1,4 @@ +--- +title: "Challenge" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/challenge.openapi.json GET /v1/spl/challenge +--- diff --git a/pages/ephemeral-spl-token/api-reference/deposit.mdx b/pages/ephemeral-spl-token/api-reference/deposit.mdx new file mode 100644 index 0000000..dda979b --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/deposit.mdx @@ -0,0 +1,4 @@ +--- +title: "Deposit SPL Tokens" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/deposit.openapi.json POST /v1/spl/deposit +--- diff --git a/pages/ephemeral-spl-token/api-reference/health.mdx b/pages/ephemeral-spl-token/api-reference/health.mdx new file mode 100644 index 0000000..be5ea7b --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/health.mdx @@ -0,0 +1,4 @@ +--- +title: "Health" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/health.openapi.json GET /health +--- diff --git a/pages/ephemeral-spl-token/api-reference/initialize-mint.mdx b/pages/ephemeral-spl-token/api-reference/initialize-mint.mdx new file mode 100644 index 0000000..3fbca6e --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/initialize-mint.mdx @@ -0,0 +1,4 @@ +--- +title: "Initialize Mint" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/initialize-mint.openapi.json POST /v1/spl/initialize-mint +--- diff --git a/pages/ephemeral-spl-token/api-reference/introduction.mdx b/pages/ephemeral-spl-token/api-reference/introduction.mdx new file mode 100644 index 0000000..5e483f3 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/introduction.mdx @@ -0,0 +1,117 @@ +--- +title: "Introduction" +description: "Ephemeral SPL Token API documentation" +--- + +import PrivatePaymentApiCard from "/snippets/private-payment-api-card.mdx"; + + + + The on-chain Ephemeral SPL Token program + + + + + +## Overview + +The Ephemeral SPL Token API builds unsigned SPL token transactions for deposits, transfers, withdrawals, swaps, and mint initialization across Solana and MagicBlock ephemeral rollups. It also exposes balance queries, mint-initialization status, stealth pools, and a wallet challenge/login flow that issues bearer tokens for reading private data. The canonical public reference is available at [payments.magicblock.app/reference](https://payments.magicblock.app/reference). + +### Meta + +- [**Health**](/pages/ephemeral-spl-token/api-reference/health) - Check API health and availability +- [**Send Transaction**](/pages/ephemeral-spl-token/api-reference/transaction-send) - Submit a signed transaction to the base layer or ephemeral RPC + +### Auth + +- [**Challenge**](/pages/ephemeral-spl-token/api-reference/challenge) - Generate a challenge string for the wallet to sign +- [**Login**](/pages/ephemeral-spl-token/api-reference/login) - Exchange a signed challenge for a bearer token + +### SPL + +- [**Deposit SPL Tokens**](/pages/ephemeral-spl-token/api-reference/deposit) - Build an unsigned deposit transaction from Solana into an ephemeral rollup +- [**Transfer SPL Tokens**](/pages/ephemeral-spl-token/api-reference/transfer) - Build an unsigned public or private SPL transfer +- [**Withdraw SPL Tokens**](/pages/ephemeral-spl-token/api-reference/withdraw) - Build an unsigned withdrawal transaction back to Solana +- [**Undelegate Ephemeral ATA**](/pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata) - Build an unsigned transaction that undelegates a wallet's eATA for a mint +- [**Initialize Mint**](/pages/ephemeral-spl-token/api-reference/initialize-mint) - Build an unsigned transaction that initializes a validator-scoped transfer queue for a mint +- [**Ensure Transfer Queue Crank**](/pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank) - Verify a mint's transfer queue and force one crank attempt +- [**Balance**](/pages/ephemeral-spl-token/api-reference/balance) - Get the base-chain SPL token balance for an address +- [**Private Balance**](/pages/ephemeral-spl-token/api-reference/private-balance) - Get the ephemeral-rollup SPL token balance for an address (auth required) +- [**Is Mint Initialized**](/pages/ephemeral-spl-token/api-reference/is-mint-initialized) - Check whether a mint has a validator-scoped transfer queue on the ephemeral RPC + +### Stealth Pools + +- [**Create Stealth Pool**](/pages/ephemeral-spl-token/api-reference/stealth-pool) - Map a handle to destination keys for private transfers (auth required) +- [**Get Stealth Pool Status**](/pages/ephemeral-spl-token/api-reference/stealth-pool-status) - Check whether a handle's stealth pool exists + +### Swap + +- [**Swap Quote**](/pages/ephemeral-spl-token/api-reference/quote) - Get a swap quote between two SPL mints +- [**Swap**](/pages/ephemeral-spl-token/api-reference/swap) - Build an unsigned swap transaction (public pass-through or private with scheduled transfer) + +### MCP + +- [**MCP**](/pages/ephemeral-spl-token/api-reference/mcp) - Access the stateless Streamable HTTP MCP endpoint + +``` +┌────────────────────────────────────────────┐ +│ 1. Deposit │ +├────────────────────────────────────────────┤ +│ • Build an unsigned deposit transaction │ +│ • Solana base balance → ephemeral rollup │ +└────────────────────────────────────────────┘ + ↓ +┌────────────────────────────────────────────┐ +│ 2. Transfer / Swap │ +├────────────────────────────────────────────┤ +│ • Build SPL transfer or swap │ +│ • base/ephemeral → base/ephemeral │ +│ • public or private (delayed + split) │ +└────────────────────────────────────────────┘ + ↓ +┌────────────────────────────────────────────┐ +│ 3. Withdraw │ +├────────────────────────────────────────────┤ +│ • Build an unsigned withdrawal │ +│ • ephemeral rollup → Solana base balance │ +└────────────────────────────────────────────┘ +``` + +## Auth Flow + +Endpoints that read private data inside the Private Ephemeral Rollup require a bearer token: + +1. `GET /v1/spl/challenge?pubkey=` returns a `challenge` string +2. The wallet signs the challenge +3. `POST /v1/spl/login` with `{ pubkey, challenge, signature }` returns a `token` +4. Pass `Authorization: Bearer ` on `/v1/spl/private-balance` (required) and on `/v1/spl/transfer` requests that need to connect to the Private Ephemeral Rollup (optional) + +## Response Format + +Successful transaction-building endpoints return an unsigned transaction payload: + +```json +{ + "kind": "deposit", + "version": "legacy", + "transactionBase64": "base64-encoded-transaction", + "sendTo": "base", + "recentBlockhash": "blockhash", + "lastValidBlockHeight": 284512337, + "instructionCount": 3, + "requiredSigners": ["3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE"] +} +``` + +The expected client flow is: + +1. Call the API +2. Decode `transactionBase64` +3. Optionally adjust the transaction if the client needs to +4. Sign with the required wallet(s) +5. Send to the RPC indicated by `sendTo` (`"base"` or `"ephemeral"`) diff --git a/pages/ephemeral-spl-token/api-reference/is-mint-initialized.mdx b/pages/ephemeral-spl-token/api-reference/is-mint-initialized.mdx new file mode 100644 index 0000000..c3c83a9 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/is-mint-initialized.mdx @@ -0,0 +1,4 @@ +--- +title: "Is Mint Initialized" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/is-mint-initialized.openapi.json GET /v1/spl/is-mint-initialized +--- diff --git a/pages/ephemeral-spl-token/api-reference/login.mdx b/pages/ephemeral-spl-token/api-reference/login.mdx new file mode 100644 index 0000000..8fd1301 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/login.mdx @@ -0,0 +1,4 @@ +--- +title: "Login" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/login.openapi.json POST /v1/spl/login +--- diff --git a/pages/ephemeral-spl-token/api-reference/mcp.mdx b/pages/ephemeral-spl-token/api-reference/mcp.mdx new file mode 100644 index 0000000..9a11480 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/mcp.mdx @@ -0,0 +1,4 @@ +--- +title: "MCP" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/mcp.openapi.json POST /mcp +--- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/balance.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/balance.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/balance.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/balance.openapi.json diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/challenge.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/challenge.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/challenge.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/challenge.openapi.json diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/deposit.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/deposit.openapi.json similarity index 96% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/deposit.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/deposit.openapi.json index 8a5d1e3..ccb8824 100644 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/deposit.openapi.json +++ b/pages/ephemeral-spl-token/api-reference/openapi/deposit.openapi.json @@ -54,7 +54,8 @@ "initIfMissing": { "type": "boolean", "description": "Optional. Initialize the transfer queue if missing." }, "initVaultIfMissing": { "type": "boolean", "description": "Optional. Initialize the vault if missing." }, "initAtasIfMissing": { "type": "boolean", "description": "Optional. Initialize associated token accounts if missing." }, - "idempotent": { "type": "boolean", "description": "Optional. When `true`, the API uses idempotent variants for any preparatory init instructions." } + "idempotent": { "type": "boolean", "description": "Optional. When `true`, the API uses idempotent variants for any preparatory init instructions." }, + "private": { "type": "boolean", "description": "Optional. Defaults to `true`. When `true`, the deposited balance is kept private." } }, "required": ["owner", "amount"], "example": { diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/health.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/health.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/health.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/health.openapi.json diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/initialize-mint.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/initialize-mint.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/initialize-mint.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/initialize-mint.openapi.json diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/is-mint-initialized.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/is-mint-initialized.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/is-mint-initialized.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/is-mint-initialized.openapi.json diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/login.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/login.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/login.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/login.openapi.json diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/mcp.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/mcp.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/mcp.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/mcp.openapi.json diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/private-balance.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/private-balance.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/private-balance.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/private-balance.openapi.json diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/quote.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/quote.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/quote.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/quote.openapi.json diff --git a/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json new file mode 100644 index 0000000..b772a12 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json @@ -0,0 +1,170 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Private Payments API", + "version": "0.1.0", + "description": "Create and look up stealth pools that map a human-readable handle to one or more destination keys for private transfers." + }, + "servers": [ + { + "url": "https://payments.magicblock.app", + "description": "Mainnet - Private Payments API" + } + ], + "paths": { + "/v1/spl/stealth-pool": { + "post": { + "summary": "Create Stealth Pool", + "description": "Build unsigned stealth-pool setup and ER update transactions that map a handle to 1-10 destination owner keys. Requires an `Authorization: Bearer ` header from the `/v1/spl/login` flow. Once initialized, the handle can be used as the `to` value of a private `/v1/spl/transfer`.", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "description": "Required. `Bearer ` obtained from the `/v1/spl/login` flow.", + "schema": { "type": "string", "example": "Bearer 1234567890" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "payer": { + "type": "string", + "example": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE" + }, + "authority": { + "type": "string", + "example": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", + "description": "Authority allowed to manage the pool." + }, + "handle": { + "type": "string", + "minLength": 1, + "example": "john.doe@magicblock.id", + "description": "Human-readable handle, up to 255 UTF-8 bytes. Stored as its exact bytes — NOT trimmed, lowercased, or normalized, so `John.Doe@…` is a different handle than `john.doe@…`." + }, + "destinations": { + "type": "array", + "items": { "type": "string" }, + "minItems": 1, + "maxItems": 10, + "description": "1-10 destination owner pubkeys (owners, not token accounts).", + "example": ["Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L"] + }, + "splitAcrossKeys": { + "type": "boolean", + "description": "Optional. When `true`, split payments may resolve independently across the destination keys." + }, + "validator": { + "type": "string", + "example": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57", + "description": "Optional. Validator identity to receive the delegated pool." + }, + "cluster": { + "anyOf": [ + { "type": "string", "enum": ["mainnet", "devnet", "mainnet-private", "devnet-private"] }, + { "type": "string" } + ], + "example": "mainnet", + "description": "Optional. Cluster selector or custom http(s) RPC URL." + } + }, + "required": ["payer", "authority", "handle", "destinations"], + "example": { + "payer": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", + "authority": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", + "handle": "john.doe@magicblock.id", + "destinations": ["Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L"], + "splitAcrossKeys": false + } + } + } + } + }, + "responses": { + "200": { + "description": "Unsigned setup and ER update transactions", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "kind": { "type": "string", "enum": ["stealthPool"] }, + "version": { "type": "string", "enum": ["legacy", "v0"] }, + "transactionBase64": { "type": "string", "description": "The ER update transaction." }, + "sendTo": { "type": "string", "enum": ["base", "ephemeral"] }, + "sendRpcEndpoint": { "type": "string", "format": "uri" }, + "recentBlockhash": { "type": "string" }, + "lastValidBlockHeight": { "type": "integer" }, + "instructionCount": { "type": "integer", "minimum": 0 }, + "requiredSigners": { "type": "array", "items": { "type": "string" } }, + "stealthPool": { "type": "string", "description": "Derived stealth-pool PDA." }, + "setupTransaction": { + "type": "object", + "description": "The base-chain setup transaction (same field set as the top-level transaction).", + "properties": { + "transactionBase64": { "type": "string" }, + "sendTo": { "type": "string", "enum": ["base", "ephemeral"] }, + "recentBlockhash": { "type": "string" }, + "lastValidBlockHeight": { "type": "integer" }, + "instructionCount": { "type": "integer", "minimum": 0 }, + "requiredSigners": { "type": "array", "items": { "type": "string" } } + } + } + }, + "required": ["kind", "version", "transactionBase64", "sendTo", "recentBlockhash", "lastValidBlockHeight", "instructionCount", "requiredSigners", "stealthPool", "setupTransaction"] + } + } + } + }, + "400": { "description": "Build error" }, + "422": { "description": "Validation error" } + } + }, + "get": { + "summary": "Get Stealth Pool Status", + "description": "Derive a stealth-pool PDA from an exact handle and report whether the base account exists. Does not return the destination keys.", + "parameters": [ + { + "name": "handle", + "in": "query", + "required": true, + "description": "The exact handle (up to 255 UTF-8 bytes). Must match the stored bytes exactly.", + "schema": { "type": "string", "example": "john.doe@magicblock.id" } + }, + { + "name": "cluster", + "in": "query", + "required": false, + "description": "Optional. Cluster selector or custom http(s) RPC URL.", + "schema": { "type": "string", "example": "mainnet" } + } + ], + "responses": { + "200": { + "description": "Stealth pool status", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "stealthPool": { "type": "string", "description": "Derived stealth-pool PDA." }, + "exists": { "type": "boolean", "description": "Whether the base account exists." } + }, + "required": ["stealthPool", "exists"] + }, + "example": { "stealthPool": "9xQeWv...PDA", "exists": true } + } + } + }, + "400": { "description": "Query error" }, + "422": { "description": "Validation error" } + } + } + } + } +} diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/swap.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/swap.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/swap.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/swap.openapi.json diff --git a/pages/ephemeral-spl-token/api-reference/openapi/transaction-send.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/transaction-send.openapi.json new file mode 100644 index 0000000..f49f274 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/openapi/transaction-send.openapi.json @@ -0,0 +1,123 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Private Payments API", + "version": "0.1.0", + "description": "Submit a signed transaction produced by the build endpoints to the correct base-layer or ephemeral RPC." + }, + "servers": [ + { + "url": "https://payments.magicblock.app", + "description": "Mainnet - Private Payments API" + } + ], + "paths": { + "/v1/transaction/send": { + "post": { + "summary": "Send Transaction", + "description": "Submit a signed, serialized transaction. Use the `sendTo` value returned by a build endpoint (deposit / transfer / withdraw / stealth-pool) to route the transaction to the base layer or the ephemeral RPC. Accepts an optional `Authorization: Bearer ` header for ephemeral submissions that require it.", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "description": "Optional. `Bearer ` obtained from the `/v1/spl/login` flow, required for some ephemeral submissions.", + "schema": { "type": "string", "example": "Bearer 1234567890" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "transactionBase64": { + "type": "string", + "minLength": 1, + "description": "The signed, serialized transaction encoded as base64." + }, + "sendTo": { + "type": "string", + "enum": ["base", "ephemeral"], + "description": "Where to submit. Use the `sendTo` value returned by the build endpoint." + }, + "sendRpcEndpoint": { + "type": "string", + "format": "uri", + "description": "Optional. Explicit ephemeral RPC endpoint. Only valid when `sendTo` is `ephemeral`." + }, + "cluster": { + "anyOf": [ + { "type": "string", "enum": ["mainnet", "devnet"] }, + { "type": "string" } + ], + "example": "mainnet", + "description": "Optional. Cluster selector or custom http(s) RPC URL." + }, + "confirm": { + "type": "boolean", + "description": "Optional. Defaults to `false`. When `true`, the API confirms the transaction and requires `recentBlockhash` and `lastValidBlockHeight`." + }, + "recentBlockhash": { + "type": "string", + "description": "Required when `confirm` is `true`." + }, + "lastValidBlockHeight": { + "type": "integer", + "minimum": 0, + "description": "Required when `confirm` is `true`." + }, + "skipPreflight": { + "type": "boolean", + "description": "Optional. Skip preflight checks on submission." + }, + "maxRetries": { + "type": "integer", + "minimum": 0, + "description": "Optional. Maximum number of send retries." + } + }, + "required": ["transactionBase64", "sendTo"], + "example": { + "transactionBase64": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "sendTo": "base", + "confirm": false + } + } + } + } + }, + "responses": { + "200": { + "description": "Submission result", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "signature": { "type": "string" }, + "sendTo": { "type": "string", "enum": ["base", "ephemeral"] }, + "confirmed": { "type": "boolean" }, + "confirmationRpcEndpoint": { "type": "string", "format": "uri" }, + "confirmationRequiresAuthToken": { "type": "boolean" } + }, + "required": ["signature", "sendTo", "confirmed", "confirmationRpcEndpoint", "confirmationRequiresAuthToken"] + }, + "example": { + "signature": "5x8...abc", + "sendTo": "base", + "confirmed": true, + "confirmationRpcEndpoint": "https://api.mainnet-beta.solana.com", + "confirmationRequiresAuthToken": false + } + } + } + }, + "400": { "description": "Send error" }, + "422": { "description": "Validation error" } + } + } + } + } +} diff --git a/pages/ephemeral-spl-token/api-reference/openapi/transfer-queue-ensure-crank.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/transfer-queue-ensure-crank.openapi.json new file mode 100644 index 0000000..3208de3 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/openapi/transfer-queue-ensure-crank.openapi.json @@ -0,0 +1,77 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Private Payments API", + "version": "0.1.0", + "description": "Verify the validator-scoped transfer queue for a mint and force one crank attempt." + }, + "servers": [ + { + "url": "https://payments.magicblock.app", + "description": "Mainnet - Private Payments API" + } + ], + "paths": { + "/v1/spl/transfer-queue/ensure-crank": { + "post": { + "summary": "Ensure Transfer Queue Crank", + "description": "After setup confirmation, verify that the validator-scoped transfer queue exists for a mint and force one crank attempt. Used to make sure queued private transfers make progress.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "mint": { + "type": "string", + "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" + }, + "cluster": { + "anyOf": [ + { "type": "string", "enum": ["mainnet", "devnet"] }, + { "type": "string" } + ], + "example": "mainnet", + "description": "Optional. Cluster selector or custom http(s) RPC URL." + }, + "validator": { + "type": "string", + "example": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57", + "description": "Optional. Defaults to the selected ephemeral RPC identity resolved via `getIdentity`." + } + }, + "required": ["mint"], + "example": { + "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "validator": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57" + } + } + } + } + }, + "responses": { + "200": { + "description": "Forced transfer queue crank result", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "mint": { "type": "string" }, + "validator": { "type": "string" }, + "transferQueue": { "type": "string" }, + "crankSignature": { "type": "string" } + }, + "required": ["mint", "validator", "transferQueue", "crankSignature"] + } + } + } + }, + "400": { "description": "Crank error" }, + "422": { "description": "Validation error" } + } + } + } + } +} diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/transfer.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/transfer.openapi.json similarity index 83% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/transfer.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/transfer.openapi.json index c9b7a32..da62c4a 100644 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/transfer.openapi.json +++ b/pages/ephemeral-spl-token/api-reference/openapi/transfer.openapi.json @@ -42,7 +42,7 @@ }, "to": { "type": "string", - "description": "Recipient wallet pubkey.", + "description": "Recipient wallet pubkey, or an initialized stealth handle (e.g. `alice@magicblock.id`). When a non-pubkey handle is provided it is resolved via its stealth pool and requires `visibility: private`, `fromBalance: base`, `toBalance: base`.", "example": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L" }, "cluster": { @@ -67,17 +67,21 @@ "visibility": { "type": "string", "enum": ["public", "private"], - "description": "Use `public` for a transparent SPL transfer or `private` to route through the Private Ephemeral Rollup." + "description": "Optional. Defaults to `private`. Use `public` for a transparent SPL transfer or `private` to route through the Private Ephemeral Rollup." }, "fromBalance": { "type": "string", "enum": ["base", "ephemeral"], - "description": "Where the sender's balance is held. Drives which RPC the API uses for blockhash and where the client should submit." + "description": "Optional. Defaults to `base`. Where the sender's balance is held. Drives which RPC the API uses for blockhash and where the client should submit." }, "toBalance": { "type": "string", "enum": ["base", "ephemeral"], - "description": "Where the recipient should receive the funds." + "description": "Optional. Defaults to `base`. Where the recipient should receive the funds." + }, + "exactOut": { + "type": "boolean", + "description": "Optional. When `true`, treats `amount` as the exact amount the recipient should receive (relevant when fees are deducted)." }, "validator": { "type": "string", @@ -127,7 +131,7 @@ "description": "Optional. Defaults to `false`. When `true`, skips lookup-table compilation and returns a legacy transaction. Private `base -> base` transfers may otherwise return a v0 transaction when a useful lookup table is configured." } }, - "required": ["from", "to", "mint", "amount", "visibility", "fromBalance", "toBalance"], + "required": ["from", "to", "mint", "amount"], "example": { "from": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", "to": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L", @@ -162,11 +166,20 @@ "version": { "type": "string", "enum": ["legacy", "v0"] }, "transactionBase64": { "type": "string" }, "sendTo": { "type": "string", "enum": ["base", "ephemeral"] }, + "from": { "type": "string", "enum": ["base", "ephemeral"], "description": "Mirrors the request `fromBalance`." }, "recentBlockhash": { "type": "string" }, "lastValidBlockHeight": { "type": "integer" }, "instructionCount": { "type": "integer", "minimum": 0 }, "requiredSigners": { "type": "array", "items": { "type": "string" } }, - "validator": { "type": "string" } + "validator": { "type": "string" }, + "fees": { + "type": "object", + "description": "Fees applied to the transfer, in base units.", + "properties": { + "lamports": { "type": "string" }, + "tokens": { "type": "string" } + } + } }, "required": ["kind", "version", "transactionBase64", "sendTo", "recentBlockhash", "lastValidBlockHeight", "instructionCount", "requiredSigners"] } diff --git a/pages/ephemeral-spl-token/api-reference/openapi/undelegate-ephemeral-ata.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/undelegate-ephemeral-ata.openapi.json new file mode 100644 index 0000000..9029ece --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/openapi/undelegate-ephemeral-ata.openapi.json @@ -0,0 +1,95 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Private Payments API", + "version": "0.1.0", + "description": "Build an unsigned ephemeral-rollup transaction that undelegates a wallet's ephemeral ATA for a mint." + }, + "servers": [ + { + "url": "https://payments.magicblock.app", + "description": "Mainnet - Private Payments API" + } + ], + "paths": { + "/v1/spl/undelegate-ephemeral-ata": { + "post": { + "summary": "Undelegate Ephemeral ATA", + "description": "Build an unsigned ephemeral-rollup transaction that undelegates a wallet's ephemeral ATA (eATA) for a mint, committing its balance back toward the base layer. Accepts an optional `Authorization: Bearer ` header.", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "description": "Optional. `Bearer ` from the `/v1/spl/login` flow.", + "schema": { "type": "string", "example": "Bearer 1234567890" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "payer": { + "type": "string", + "example": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE" + }, + "mint": { + "type": "string", + "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "description": "SPL mint for the eATA to undelegate." + }, + "cluster": { + "anyOf": [ + { "type": "string", "enum": ["mainnet", "devnet"] }, + { "type": "string" } + ], + "example": "mainnet", + "description": "Optional. Cluster selector or custom http(s) RPC URL." + } + }, + "required": ["payer", "mint"], + "example": { + "payer": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", + "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" + } + } + } + } + }, + "responses": { + "200": { + "description": "Unsigned serialized transaction", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "kind": { "type": "string", "enum": ["undelegateEphemeralAta"] }, + "version": { "type": "string", "enum": ["legacy", "v0"] }, + "transactionBase64": { "type": "string" }, + "sendTo": { "type": "string", "enum": ["base", "ephemeral"] }, + "sendRpcEndpoint": { + "type": "string", + "format": "uri", + "description": "Exact ephemeral RPC endpoint where the signed undelegation transaction should be submitted." + }, + "recentBlockhash": { "type": "string" }, + "lastValidBlockHeight": { "type": "integer" }, + "instructionCount": { "type": "integer", "minimum": 0 }, + "requiredSigners": { "type": "array", "items": { "type": "string" } } + }, + "required": ["kind", "version", "transactionBase64", "sendTo", "sendRpcEndpoint", "recentBlockhash", "lastValidBlockHeight", "instructionCount", "requiredSigners"] + } + } + } + }, + "400": { "description": "Build error" }, + "422": { "description": "Validation error" } + } + } + } + } +} diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/withdraw.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/withdraw.openapi.json similarity index 100% rename from pages/private-ephemeral-rollups-pers/api-reference/per/openapi/withdraw.openapi.json rename to pages/ephemeral-spl-token/api-reference/openapi/withdraw.openapi.json diff --git a/pages/ephemeral-spl-token/api-reference/private-balance.mdx b/pages/ephemeral-spl-token/api-reference/private-balance.mdx new file mode 100644 index 0000000..681ea51 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/private-balance.mdx @@ -0,0 +1,4 @@ +--- +title: "Private Balance" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/private-balance.openapi.json GET /v1/spl/private-balance +--- diff --git a/pages/ephemeral-spl-token/api-reference/quote.mdx b/pages/ephemeral-spl-token/api-reference/quote.mdx new file mode 100644 index 0000000..53adef8 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/quote.mdx @@ -0,0 +1,4 @@ +--- +title: "Swap Quote" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/quote.openapi.json GET /v1/swap/quote +--- diff --git a/pages/ephemeral-spl-token/api-reference/stealth-pool-status.mdx b/pages/ephemeral-spl-token/api-reference/stealth-pool-status.mdx new file mode 100644 index 0000000..0d3d276 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/stealth-pool-status.mdx @@ -0,0 +1,4 @@ +--- +title: "Get Stealth Pool Status" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json GET /v1/spl/stealth-pool +--- diff --git a/pages/ephemeral-spl-token/api-reference/stealth-pool.mdx b/pages/ephemeral-spl-token/api-reference/stealth-pool.mdx new file mode 100644 index 0000000..a4250e4 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/stealth-pool.mdx @@ -0,0 +1,4 @@ +--- +title: "Create Stealth Pool" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json POST /v1/spl/stealth-pool +--- diff --git a/pages/ephemeral-spl-token/api-reference/swap.mdx b/pages/ephemeral-spl-token/api-reference/swap.mdx new file mode 100644 index 0000000..1d9c637 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/swap.mdx @@ -0,0 +1,4 @@ +--- +title: "Swap" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/swap.openapi.json POST /v1/swap/swap +--- diff --git a/pages/ephemeral-spl-token/api-reference/transaction-send.mdx b/pages/ephemeral-spl-token/api-reference/transaction-send.mdx new file mode 100644 index 0000000..b4965ae --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/transaction-send.mdx @@ -0,0 +1,4 @@ +--- +title: "Send Transaction" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/transaction-send.openapi.json POST /v1/transaction/send +--- diff --git a/pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank.mdx b/pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank.mdx new file mode 100644 index 0000000..ffadcc9 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank.mdx @@ -0,0 +1,4 @@ +--- +title: "Ensure Transfer Queue Crank" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/transfer-queue-ensure-crank.openapi.json POST /v1/spl/transfer-queue/ensure-crank +--- diff --git a/pages/ephemeral-spl-token/api-reference/transfer.mdx b/pages/ephemeral-spl-token/api-reference/transfer.mdx new file mode 100644 index 0000000..16e7375 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/transfer.mdx @@ -0,0 +1,4 @@ +--- +title: "Transfer SPL Tokens" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/transfer.openapi.json POST /v1/spl/transfer +--- diff --git a/pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata.mdx b/pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata.mdx new file mode 100644 index 0000000..c1d9423 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata.mdx @@ -0,0 +1,4 @@ +--- +title: "Undelegate Ephemeral ATA" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/undelegate-ephemeral-ata.openapi.json POST /v1/spl/undelegate-ephemeral-ata +--- diff --git a/pages/ephemeral-spl-token/api-reference/withdraw.mdx b/pages/ephemeral-spl-token/api-reference/withdraw.mdx new file mode 100644 index 0000000..398b299 --- /dev/null +++ b/pages/ephemeral-spl-token/api-reference/withdraw.mdx @@ -0,0 +1,4 @@ +--- +title: "Withdraw SPL Tokens" +openapi: /pages/ephemeral-spl-token/api-reference/openapi/withdraw.openapi.json POST /v1/spl/withdraw +--- diff --git a/pages/ephemeral-spl-token/overview.mdx b/pages/ephemeral-spl-token/overview.mdx new file mode 100644 index 0000000..e0c7f13 --- /dev/null +++ b/pages/ephemeral-spl-token/overview.mdx @@ -0,0 +1,120 @@ +--- +title: "Ephemeral SPL Tokens" +description: "Move SPL tokens at Ephemeral Rollup speed — the ephemeral token account model, the global vault, delegation, and how private payments build on top." +--- + +--- + +## Overview + +**Ephemeral SPL Tokens** let you hold and move SPL tokens inside a MagicBlock Ephemeral Rollup (ER) +with the same low latency as any other delegated state, then settle back to Solana's base layer. They +are the token primitive behind MagicBlock's **private payments** — but the primitive itself is general: +a transfer can be **public or private**. + +Everything is powered by the on-chain **Ephemeral SPL Token program** +(`SPLxh1LVZzEkX99H6rqYizhytLWPZVV296zyYDPagv2`), which implements +[MIMD 0013](https://github.com/magicblock-labs/magicblock-validator/discussions/550). + + + + On-chain program + hosted API. `SPLxh1LV…` + + + Delegate a token account, transfer on the ER, withdraw — end to end. + + + +--- + +## The model + +A normal SPL token account lives on Solana's base layer. To move tokens at ER speed, the Ephemeral SPL +Token program introduces two account types. + +### Ephemeral ATA (eATA) + +An **ephemeral ATA** is a program-owned PDA derived from `[owner, mint]` that holds a single `u64` +balance. It is **not** a real SPL token account — it is a lightweight balance record that can be +delegated to the ER and mutated there at high speed. + +### Global Vault + +The real tokens are custodied in a per-mint **Global Vault** — a PDA derived from `[mint]` that owns +the SPL token account backing **every** eATA of that mint. Depositing moves real tokens into the vault +and credits your eATA's `u64`; withdrawing does the reverse. + + + An eATA tracks a balance; the Global Vault holds the actual tokens. One vault backs all eATAs for a + given mint. + + +--- + +## Delegation lifecycle + +eATAs follow the standard Ephemeral Rollup lifecycle: + + + + Real tokens move into the mint's Global Vault, your eATA is credited, and the eATA is delegated to + a MagicBlock validator so it can be mutated inside the ER. + + + Transfer between eATAs inside the rollup at low latency. Transfers can be **public** or + **private** (`visibility`). + + + The eATA is committed and undelegated back to the base layer. + + + Tokens move out of the Global Vault back to a standard base-layer SPL token account. + + + +--- + +## Public vs. private + +The primitive supports both: + +- **Public** — a normal fast transfer between eATAs on the ER. +- **Private (Private Payments)** — the destination and settlement are shielded: private `visibility`, + encrypted/queued settlement, and **stealth handles** (a human-readable name such as + `alice@magicblock.id` that resolves to one or more destination keys). This is the use case behind + the [Private Payments guide](/pages/ephemeral-spl-token/private-payments). + +--- + +## Two ways to integrate + + + + Integrate directly in your own Anchor program and client with + `@magicblock-labs/ephemeral-rollups-sdk` — delegate a token account, transfer on the ER, withdraw. + + + Let the hosted API build unsigned transactions for deposit, transfer, withdraw, balances, swap, and + private payments. + + diff --git a/pages/ephemeral-spl-token/private-payments.mdx b/pages/ephemeral-spl-token/private-payments.mdx new file mode 100644 index 0000000..5ccb89f --- /dev/null +++ b/pages/ephemeral-spl-token/private-payments.mdx @@ -0,0 +1,171 @@ +--- +title: "Private Payments with Ephemeral SPL Tokens" +description: "Use ephemeral SPL tokens for private deposits, transfers, and withdrawals — private visibility, stealth handles, and queued settlement over the hosted API." +--- + +import QuickAccessSpl from "/snippets/quick-access-spl.mdx"; + +--- + + + +--- + +## Overview + +**Private Payments** are the privacy use case built on top of [Ephemeral SPL +Tokens](/pages/ephemeral-spl-token/overview). The same +deposit / transfer / withdraw primitive runs with **private visibility**, so the amount, destination, +and timing of a payment are shielded rather than broadcast publicly. + + + New to the primitive? Read the [Ephemeral SPL Tokens + overview](/pages/ephemeral-spl-token/overview) first — this guide + assumes the eATA / Global Vault / delegation model. + + +The easiest way to build private payments is the hosted **Ephemeral SPL Token API**, which returns +unsigned transactions you sign and submit. + + + + Endpoints for deposit, transfer, withdraw, balances, stealth pools, and auth. + + + The on-chain Ephemeral SPL Token program. + + + +--- + +## Privacy model + +Private payments rely on: + +- **Private visibility** — transfers execute inside the Ephemeral Rollup with `visibility: "private"`, + so the transfer is not broadcast publicly. +- **Stealth handles** — send to a human-readable name (e.g. `alice@magicblock.id`) instead of a raw + public key. The handle resolves to one or more destination keys via a **stealth pool**, breaking the + direct sender → recipient link on-chain. +- **Queued settlement** — private transfers can settle through the program's transfer queue rather than + a direct, immediately-linkable movement. + + + Privacy here reduces **linkability**, not total observability. Amounts and timing may still be + inferable at the network level. Threat-model your assumptions. + + +--- + +## Authentication + +Private reads and stealth-pool operations require a bearer token. Obtain one with the challenge/login +flow before calling protected endpoints: + + + + `GET /v1/spl/challenge` returns a message for the user to sign. + + + `POST /v1/spl/login` exchanges the signed challenge for a bearer token. + + + Send `Authorization: Bearer ` on `GET /v1/spl/private-balance` and + `POST /v1/spl/stealth-pool`. + + + +--- + +## Deposits + +Move tokens into the mint's Global Vault and credit the depositor's ephemeral ATA. + +- `POST /v1/spl/deposit` — builds the deposit transaction. Set `private: true` to keep the deposited + balance private. + +The response is an unsigned transaction plus a `sendTo` field (`base` or `ephemeral`). Sign it and +submit via [`POST /v1/transaction/send`](/pages/ephemeral-spl-token/api-reference/introduction) +or your own RPC. + +--- + +## Private transfers + +- `POST /v1/spl/transfer` with `visibility: "private"`. + +Two destination modes: + +| Destination | `to` value | Requirements | +| --- | --- | --- | +| Direct | recipient public key | `visibility: "private"` | +| Stealth handle | an initialized handle string | `visibility: "private"`, `fromBalance: "base"`, `toBalance: "base"` | + +To use a stealth handle, initialize it first: + +- `POST /v1/spl/stealth-pool` — map a handle (≤255 UTF-8 bytes; **not** normalized, so + `Alice@…` ≠ `alice@…`) to 1–10 destination owner keys, optionally splitting payments across them. +- `GET /v1/spl/stealth-pool?handle=…` — check whether a handle's pool exists. + + + Handles are stored as their exact UTF-8 bytes. `GET` returns only whether the pool exists — never the + destination keys. + + +--- + +## Withdrawals + +Move a balance back out of the Global Vault to a standard base-layer SPL token account. + +- `POST /v1/spl/withdraw` — builds the withdrawal transaction. + +Check balances any time: + +- `GET /v1/spl/balance` — public balance. +- `GET /v1/spl/private-balance` — private balance (requires the bearer token). + +--- + +## Developer notes + +- **Privacy is a spectrum.** Ephemeral SPL tokens reduce linkability; they do not hide amounts, timing, + or protect against network-level analysis. +- **Handles aren't normalized.** Casing/whitespace matter — display and store handles consistently. +- **Match the flow.** Stealth-handle transfers require `visibility: "private"`, `fromBalance: "base"`, + `toBalance: "base"` (these are also the omitted-field defaults). +- **Sign then send.** Builder endpoints return unsigned transactions; submit them with + `POST /v1/transaction/send` and honor the returned `sendTo`. + +--- + +## Next steps + + + + The primitive behind private payments. + + + The on-chain/SDK integration path. + + diff --git a/pages/ephemeral-spl-token/quickstart.mdx b/pages/ephemeral-spl-token/quickstart.mdx new file mode 100644 index 0000000..65ad14e --- /dev/null +++ b/pages/ephemeral-spl-token/quickstart.mdx @@ -0,0 +1,120 @@ +--- +title: "Ephemeral SPL Token Quickstart" +description: "Delegate an SPL token account to an Ephemeral Rollup, transfer on the ER, and withdraw back to the base layer — with the ephemeral-rollups-sdk." +--- + +import Software from "/snippets/software.mdx"; +import SolanaResources from "/snippets/solana-resources.mdx"; +import ProductCards from "/snippets/product-cards.mdx"; +import QuickAccessSpl from "/snippets/quick-access-spl.mdx"; + +import DelegateCode from "/snippets/spl-tokens-code/delegate.mdx"; +import TransferCode from "/snippets/spl-tokens-code/transfer.mdx"; +import UndelegateCode from "/snippets/spl-tokens-code/undelegate.mdx"; +import WithdrawCode from "/snippets/spl-tokens-code/withdraw.mdx"; +import ProgramCode from "/snippets/spl-tokens-code/program.mdx"; + +--- + + + + + Snippets target `@magicblock-labs/ephemeral-rollups-sdk` **v0.14.3** with the legacy-vault path. The + idempotent-shuttle path targets v0.15.3 — keep the same path across `delegateSpl` / `undelegateIx` / + `withdrawSpl` within one lifecycle. + + +--- + +## Step-By-Step Guide + +Move SPL tokens through the full lifecycle against the Ephemeral SPL Token program +`SPLxh1LVZzEkX99H6rqYizhytLWPZVV296zyYDPagv2` — delegate, transact on the ER, then settle back to +Solana: + + + Delegate the token account}> + Delegate an owner's balance to a validator on the base layer. The first delegation for a mint + creates the shared Global Vault. + + Transfer on the ER}> + Move tokens between eATAs inside the rollup — public or private. + + Undelegate & commit}> + Undelegate on the ER and wait for the commit back to base. + + Withdraw to base}> + Move the balance out of the Global Vault to a base-layer token account. + + + +--- + +## Ephemeral SPL Token Example + + + +Install the SDK: + +```bash +yarn add @magicblock-labs/ephemeral-rollups-sdk@0.14.3 +``` + +### Code Snippets + + + + `delegateSpl` delegates an owner's balance to a validator. The first delegation for a mint creates + the shared Global Vault (`initVaultIfMissing: true`); later ones reuse it. Send on the **base + layer**, and fund the rent sponsor (`deriveRentPda()`) before delegating. + + + [⬆️ Back to Top](#code-snippets) + + + `transferSpl` moves tokens between eATAs inside the rollup. Send on the **ephemeral** provider. Set + `visibility: "private"` for a private payment or `"public"` for a normal fast transfer. + + + [⬆️ Back to Top](#code-snippets) + + + Undelegate each owner on the ER (one per transaction), then wait for the commit back to base with + `GetCommitmentSignature` before withdrawing. + + + [⬆️ Back to Top](#code-snippets) + + + `withdrawSpl` moves the balance out of the Global Vault back to the owner's base-layer ATA. + + + [⬆️ Back to Top](#code-snippets) + + + To route the ER-side transfer through your own program instead of the SDK helper, add the + `#[ephemeral]` attribute — the instruction is a plain SPL Token CPI. See + [Smart Contract Integration](/pages/ephemeral-spl-token/smart-contract-integration) for custody + and PDA-signed transfers. + + + [⬆️ Back to Top](#code-snippets) + + + + + **Run it locally:** `yarn` → `yarn build` → `yarn setup` (boots the local base + ER cluster; leave + running) → `yarn test:local` in a second terminal. + + +--- + + + +--- + +## MagicBlock Products + + + +--- diff --git a/pages/ephemeral-spl-token/smart-contract-integration.mdx b/pages/ephemeral-spl-token/smart-contract-integration.mdx new file mode 100644 index 0000000..63964d0 --- /dev/null +++ b/pages/ephemeral-spl-token/smart-contract-integration.mdx @@ -0,0 +1,155 @@ +--- +title: "Smart Contract Integration" +description: "Custody and move SPL tokens from your own Solana program on an Ephemeral Rollup — PDA-signed transfers, delegation, and commit/undelegate." +--- + +import Software from "/snippets/software.mdx"; +import SolanaResources from "/snippets/solana-resources.mdx"; + +import EphemeralCode from "/snippets/spl-tokens-code/sc-ephemeral.mdx"; +import CreateEataCode from "/snippets/spl-tokens-code/sc-create-eata.mdx"; +import DelegateEataCode from "/snippets/spl-tokens-code/sc-delegate.mdx"; +import PdaTransferCode from "/snippets/spl-tokens-code/sc-transfer.mdx"; +import CommitCode from "/snippets/spl-tokens-code/sc-commit.mdx"; +import NonCustodyCode from "/snippets/spl-tokens-code/sc-non-custody.mdx"; +import PostCommitCode from "/snippets/spl-tokens-code/sc-post-commit.mdx"; + +--- + +### Quick Access + + + + eATA custody end to end + + + Base-layer post-commit payouts + + + Non-custody transfers + + + +This guide is for on-chain programs — a DEX, AMM, prediction market, escrow, or game — that hold user +funds and move them at Ephemeral Rollup speed. The core pattern: a program-owned account, delegated to +the ER, with your program signing token transfers as a PDA. + + + Moving tokens from a client instead of on-chain? See the + [Quickstart](/pages/ephemeral-spl-token/quickstart). + + +### Two custody models + +| Model | You delegate… | Tokens move… | Use when | +| --- | --- | --- | --- | +| **eATA custody** | a program-owned **ephemeral ATA (eATA)** | **on the ER**, PDA-signed | you settle or pay out inside the rollup (e.g. a market fill) | +| **State PDA + post-commit payout** | only a **state PDA**; real ATAs stay on base | **on the base layer**, as a post-commit action | funds stay on L1 and settle on commit | + +The walkthrough below covers **eATA custody**, with the post-commit variant in the advanced snippets. + +--- + +## Step-By-Step Guide + +Give your program authority over an eATA, delegate it, move funds PDA-signed on the ER, then settle +back to Solana: + + + Make your program ER-aware}> + Add the `#[ephemeral]` attribute and import the SDK helpers. + + Create the custody PDA and eATA}> + Own an eATA under the Ephemeral SPL Token program from your custody PDA. + + Delegate the eATA}> + CPI into the Ephemeral SPL Token program to delegate it to the ER. + + Move tokens PDA-signed}> + Sign the transfer as the custody PDA inside the rollup. + + Commit & undelegate}> + Return the account to the base layer. + + + +--- + +## Custody Example + + + +### Code Snippets + + + + Wrap `#[program]` with `#[ephemeral]` and import the SDK helpers you need. + + + [⬆️ Back to Top](#code-snippets) + + + Your program owns a state PDA (for example, a `Pool`) that is the authority over the funds. Custody + on the ER uses an **ephemeral ATA (eATA)** owned by that PDA, derived from `[owner, mint]` under the + Ephemeral SPL Token program (`SPLxh1LVZzEkX99H6rqYizhytLWPZVV296zyYDPagv2`). + + + [⬆️ Back to Top](#code-snippets) + + + Delegate the eATA with a CPI to the Ephemeral SPL Token program (`DelegateEphemeralAta`, + discriminator `4`). + + + Delegating a plain PDA-owned ATA directly to the ER is not supported — token custody on the ER + goes through an eATA. To delegate program *state* (not a token account), use the SDK's + `#[delegate]` macro instead. + + + + [⬆️ Back to Top](#code-snippets) + + + With the eATA delegated, move tokens inside the rollup with an SPL Token CPI signed by the custody + PDA via `CpiContext::new_with_signer`. The signer seeds are `[POOL_SEED, bump]` — the program + authorizes the payout itself, with no user signature. + + + [⬆️ Back to Top](#code-snippets) + + + Commit the ER state and return the account to the base layer with `MagicIntentBundleBuilder`. + + + [⬆️ Back to Top](#code-snippets) + + + +--- + +### Advanced Code Snippets + + + + If your program doesn't custody funds — it moves tokens between two already-delegated accounts on a + user's behalf — no PDA signer is needed. The authority is the user's `Signer`, with a plain + `CpiContext::new`. + + + [⬆️ Back to Top](#advanced-code-snippets) + + + To keep real token accounts on the base layer and delegate only program state, schedule the payout + as a post-commit action that runs PDA-signed on the base layer right after a commit — using + `transfer_checked` (Token-2022 compatible) and committing with the action attached. + + + [⬆️ Back to Top](#advanced-code-snippets) + + + +--- + + + +--- diff --git a/pages/overview/additional-information/pricing.mdx b/pages/overview/additional-information/pricing.mdx index 0fa45c7..02c4dab 100644 --- a/pages/overview/additional-information/pricing.mdx +++ b/pages/overview/additional-information/pricing.mdx @@ -126,7 +126,7 @@ Private Payment API make it simple to send private stablecoin transfers on Solan Explore the Private Payments API endpoints diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/balance.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/balance.mdx deleted file mode 100644 index 35e7c10..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/balance.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Balance" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/balance.openapi.json GET /v1/spl/balance ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/challenge.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/challenge.mdx deleted file mode 100644 index 64a5627..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/challenge.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Challenge" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/challenge.openapi.json GET /v1/spl/challenge ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/deposit.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/deposit.mdx deleted file mode 100644 index a9f1b7d..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/deposit.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Deposit SPL Tokens" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/deposit.openapi.json POST /v1/spl/deposit ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/health.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/health.mdx deleted file mode 100644 index 20b92ae..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/health.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Health" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/health.openapi.json GET /health ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/initialize-mint.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/initialize-mint.mdx deleted file mode 100644 index f7fa4b8..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/initialize-mint.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Initialize Mint" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/initialize-mint.openapi.json POST /v1/spl/initialize-mint ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx index 70a97f5..156a8e0 100644 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx +++ b/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx @@ -1,109 +1,57 @@ --- -title: "Introduction" -description: "Private Payments API documentation" +title: "Private Payments" +description: "Private, compliant onchain payments on MagicBlock — powered by Ephemeral SPL Tokens." --- -import PrivatePaymentApiCard from "/snippets/private-payment-api-card.mdx"; +--- + +## Private Payments + +**Private Payments** let you add private, compliant onchain transfers to your app — shielded amounts, +destinations, and timing, with stealth handles and queued settlement. + +Private Payments are powered by **Ephemeral SPL Tokens**: the same fast token primitive used for public +transfers, run with private `visibility`. All of the documentation — concepts, the SDK quickstart, the +private-payments guide, and the full REST/MCP API — lives in the dedicated **Ephemeral SPL Token** +section. - Reference program for private SPL token flows + Private transfers, stealth handles, and queued settlement — end to end. + + + The token primitive behind private payments. + + + Deposit, transfer, withdraw, balances, stealth pools, swap, and auth. + + + Integrate ephemeral SPL tokens in your own program and client. - - -## Overview - -The Private Payments API builds unsigned SPL token transactions for deposits, transfers, withdrawals, swaps, and mint initialization across Solana and MagicBlock ephemeral rollups. It also exposes balance queries, mint-initialization status, and a wallet challenge/login flow that issues bearer tokens for reading private data. The canonical public reference is available at [payments.magicblock.app/reference](https://payments.magicblock.app/reference). - -### Meta - -- [**Health**](/pages/private-ephemeral-rollups-pers/api-reference/per/health) - Check API health and availability - -### Auth - -- [**Challenge**](/pages/private-ephemeral-rollups-pers/api-reference/per/challenge) - Generate a challenge string for the wallet to sign -- [**Login**](/pages/private-ephemeral-rollups-pers/api-reference/per/login) - Exchange a signed challenge for a bearer token - -### SPL - -- [**Deposit SPL Tokens**](/pages/private-ephemeral-rollups-pers/api-reference/per/deposit) - Build an unsigned deposit transaction from Solana into an ephemeral rollup -- [**Transfer SPL Tokens**](/pages/private-ephemeral-rollups-pers/api-reference/per/transfer) - Build an unsigned public or private SPL transfer -- [**Withdraw SPL Tokens**](/pages/private-ephemeral-rollups-pers/api-reference/per/withdraw) - Build an unsigned withdrawal transaction back to Solana -- [**Initialize Mint**](/pages/private-ephemeral-rollups-pers/api-reference/per/initialize-mint) - Build an unsigned transaction that initializes a validator-scoped transfer queue for a mint -- [**Balance**](/pages/private-ephemeral-rollups-pers/api-reference/per/balance) - Get the base-chain SPL token balance for an address -- [**Private Balance**](/pages/private-ephemeral-rollups-pers/api-reference/per/private-balance) - Get the ephemeral-rollup SPL token balance for an address (auth required) -- [**Is Mint Initialized**](/pages/private-ephemeral-rollups-pers/api-reference/per/is-mint-initialized) - Check whether a mint has a validator-scoped transfer queue on the ephemeral RPC - -### Swap - -- [**Swap Quote**](/pages/private-ephemeral-rollups-pers/api-reference/per/quote) - Get a swap quote between two SPL mints -- [**Swap**](/pages/private-ephemeral-rollups-pers/api-reference/per/swap) - Build an unsigned swap transaction (public pass-through or private with scheduled transfer) - -### MCP - -- [**MCP**](/pages/private-ephemeral-rollups-pers/api-reference/per/mcp) - Access the stateless Streamable HTTP MCP endpoint - -``` -┌────────────────────────────────────────────┐ -│ 1. Deposit │ -├────────────────────────────────────────────┤ -│ • Build an unsigned deposit transaction │ -│ • Solana base balance → ephemeral rollup │ -└────────────────────────────────────────────┘ - ↓ -┌────────────────────────────────────────────┐ -│ 2. Transfer / Swap │ -├────────────────────────────────────────────┤ -│ • Build SPL transfer or swap │ -│ • base/ephemeral → base/ephemeral │ -│ • public or private (delayed + split) │ -└────────────────────────────────────────────┘ - ↓ -┌────────────────────────────────────────────┐ -│ 3. Withdraw │ -├────────────────────────────────────────────┤ -│ • Build an unsigned withdrawal │ -│ • ephemeral rollup → Solana base balance │ -└────────────────────────────────────────────┘ -``` - -## Auth Flow - -Endpoints that read private data inside the Private Ephemeral Rollup require a bearer token: - -1. `GET /v1/spl/challenge?pubkey=` returns a `challenge` string -2. The wallet signs the challenge -3. `POST /v1/spl/login` with `{ pubkey, challenge, signature }` returns a `token` -4. Pass `Authorization: Bearer ` on `/v1/spl/private-balance` (required) and on `/v1/spl/transfer` requests that need to connect to the Private Ephemeral Rollup (optional) - -## Response Format - -Successful transaction-building endpoints return an unsigned transaction payload: - -```json -{ - "kind": "deposit", - "version": "legacy", - "transactionBase64": "base64-encoded-transaction", - "sendTo": "base", - "recentBlockhash": "blockhash", - "lastValidBlockHeight": 284512337, - "instructionCount": 3, - "requiredSigners": ["3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE"] -} -``` - -The expected client flow is: - -1. Call the API -2. Decode `transactionBase64` -3. Optionally adjust the transaction if the client needs to -4. Sign with the required wallet(s) -5. Send to the RPC indicated by `sendTo` (`"base"` or `"ephemeral"`) + + Looking for the full API? Head to the [**Ephemeral SPL + Token**](/pages/ephemeral-spl-token/api-reference/introduction) tab — it's the single source of truth + for every endpoint and guide. + diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/is-mint-initialized.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/is-mint-initialized.mdx deleted file mode 100644 index c37b240..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/is-mint-initialized.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Is Mint Initialized" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/is-mint-initialized.openapi.json GET /v1/spl/is-mint-initialized ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/login.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/login.mdx deleted file mode 100644 index da69c13..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/login.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Login" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/login.openapi.json POST /v1/spl/login ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/mcp.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/mcp.mdx deleted file mode 100644 index 906b138..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/mcp.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "MCP" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/mcp.openapi.json POST /mcp ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json b/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json deleted file mode 100644 index 2772a0d..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/openapi/privacy-openapi.json +++ /dev/null @@ -1,1271 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "Private Payments API", - "version": "0.1.0", - "description": "REST API for building private SPL token transactions on Solana and MagicBlock ephemeral rollups.\n\nDocumentation: https://docs.magicblock.gg/pages/private-ephemeral-rollups-pers/how-to-guide/quickstart" - }, - "servers": [ - { - "url": "https://payments.magicblock.app", - "description": "Mainnet - Private Payments API" - } - ], - "components": { - "schemas": { - "HealthResponse": { - "type": "object", - "properties": { - "status": { - "type": "string", - "enum": ["ok"] - } - }, - "required": ["status"] - }, - "UnsignedTransactionResponse": { - "type": "object", - "properties": { - "kind": { - "type": "string", - "enum": ["deposit", "withdraw", "transfer"] - }, - "version": { - "type": "string", - "enum": ["legacy", "v0"] - }, - "transactionBase64": { "type": "string" }, - "sendTo": { "$ref": "#/components/schemas/BalanceLocation" }, - "recentBlockhash": { "type": "string" }, - "lastValidBlockHeight": { "type": "integer" }, - "instructionCount": { "type": "integer", "minimum": 0 }, - "requiredSigners": { - "type": "array", - "items": { "type": "string", "example": "So11111111111111111111111111111111111111112" } - }, - "validator": { "type": "string", "example": "So11111111111111111111111111111111111111112" } - }, - "required": [ - "kind", - "version", - "transactionBase64", - "sendTo", - "recentBlockhash", - "lastValidBlockHeight", - "instructionCount", - "requiredSigners" - ] - }, - "BalanceLocation": { - "type": "string", - "enum": ["base", "ephemeral"] - }, - "ErrorResponse": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "details": {} - }, - "required": ["code", "message"] - } - }, - "required": ["error"] - }, - "ValidationErrorResponse": { - "type": "object", - "properties": { - "error": { - "type": "object", - "properties": { - "code": { "type": "string", "enum": ["VALIDATION_ERROR"] }, - "message": { "type": "string" }, - "issues": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { - "type": "array", - "items": { - "anyOf": [{ "type": "string" }, { "type": "number" }] - } - } - }, - "required": ["code", "message", "path"] - } - } - }, - "required": ["code", "message", "issues"] - } - }, - "required": ["error"] - }, - "DepositRequest": { - "type": "object", - "properties": { - "owner": { - "type": "string", - "example": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE" - }, - "cluster": { - "anyOf": [ - { "type": "string", "enum": ["mainnet", "devnet"] }, - { "type": "string" } - ], - "example": "mainnet", - "description": "Optional. Use `mainnet` for BASE_RPC_URL and EPHEMERAL_RPC_URL, `devnet` for BASE_DEVNET_RPC_URL and EPHEMERAL_DEVNET_RPC_URL, or provide a custom http(s) RPC URL to override the base RPC while keeping the configured ephemeral RPC." - }, - "mint": { - "type": "string", - "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "description": "Optional. Defaults to Solana USDC on mainnet: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. On devnet it defaults to devnet USDC: 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU." - }, - "amount": { - "type": "integer", - "minimum": 1, - "example": 1, - "description": "Base-unit amount as an integer JSON value with minimum 1." - }, - "validator": { - "type": "string", - "example": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57", - "description": "Optional. Defaults to the selected ephemeral RPC identity resolved via `getIdentity`." - }, - "initIfMissing": { "type": "boolean" }, - "initVaultIfMissing": { "type": "boolean" }, - "initAtasIfMissing": { "type": "boolean" }, - "idempotent": { "type": "boolean" } - }, - "required": ["owner", "amount"], - "example": { - "owner": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", - "amount": 1, - "initIfMissing": true, - "initVaultIfMissing": true, - "initAtasIfMissing": true, - "idempotent": true - } - }, - "WithdrawRequest": { - "type": "object", - "properties": { - "owner": { - "type": "string", - "example": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE" - }, - "cluster": { - "anyOf": [ - { "type": "string", "enum": ["mainnet", "devnet"] }, - { "type": "string" } - ], - "example": "mainnet", - "description": "Optional. Use `mainnet` for BASE_RPC_URL and EPHEMERAL_RPC_URL, `devnet` for BASE_DEVNET_RPC_URL and EPHEMERAL_DEVNET_RPC_URL, or provide a custom http(s) RPC URL to override the base RPC while keeping the configured ephemeral RPC." - }, - "mint": { - "type": "string", - "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "description": "SPL mint on Solana." - }, - "amount": { - "type": "integer", - "minimum": 1, - "example": 1000000, - "description": "Base-unit amount as an integer JSON value with minimum 1." - }, - "validator": { - "type": "string", - "example": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57", - "description": "Optional. Defaults to the selected ephemeral RPC identity resolved via `getIdentity`." - }, - "initIfMissing": { "type": "boolean" }, - "initAtasIfMissing": { "type": "boolean" }, - "escrowIndex": { "type": "integer", "minimum": 0 }, - "idempotent": { "type": "boolean" } - }, - "required": ["owner", "mint", "amount"], - "example": { - "owner": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", - "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "amount": 1000000, - "idempotent": true - } - }, - "InitializeMintResponse": { - "allOf": [ - { "$ref": "#/components/schemas/UnsignedTransactionResponse" }, - { - "type": "object", - "properties": { - "kind": { "type": "string", "enum": ["initializeMint"] }, - "transferQueue": { "type": "string", "example": "So11111111111111111111111111111111111111112" }, - "rentPda": { "type": "string", "example": "So11111111111111111111111111111111111111112" } - }, - "required": ["validator", "transferQueue", "rentPda"] - } - ] - }, - "InitializeMintRequest": { - "type": "object", - "properties": { - "payer": { - "type": "string", - "example": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE" - }, - "mint": { - "type": "string", - "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" - }, - "cluster": { - "anyOf": [ - { "type": "string", "enum": ["mainnet", "devnet"] }, - { "type": "string" } - ], - "example": "mainnet", - "description": "Optional. Use `mainnet` for BASE_RPC_URL and EPHEMERAL_RPC_URL, `devnet` for BASE_DEVNET_RPC_URL and EPHEMERAL_DEVNET_RPC_URL, or provide a custom http(s) RPC URL to override the base RPC while keeping the configured ephemeral RPC." - }, - "validator": { - "type": "string", - "example": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57", - "description": "Optional. Defaults to the selected ephemeral RPC identity resolved via `getIdentity`." - } - }, - "required": ["payer", "mint"], - "example": { - "payer": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", - "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "validator": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57" - } - }, - "TransferRequest": { - "type": "object", - "properties": { - "from": { "type": "string", "example": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE" }, - "to": { "type": "string", "example": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L" }, - "cluster": { - "anyOf": [ - { "type": "string", "enum": ["mainnet", "devnet"] }, - { "type": "string" } - ], - "example": "mainnet", - "description": "Optional. Use `mainnet` for BASE_RPC_URL and EPHEMERAL_RPC_URL, `devnet` for BASE_DEVNET_RPC_URL and EPHEMERAL_DEVNET_RPC_URL, or provide a custom http(s) RPC URL to override the base RPC while keeping the configured ephemeral RPC." - }, - "mint": { "type": "string", "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" }, - "amount": { - "type": "integer", - "minimum": 1, - "example": 1000000, - "description": "Base-unit amount as an integer JSON value with minimum 1." - }, - "visibility": { "$ref": "#/components/schemas/TransferVisibility" }, - "fromBalance": { "$ref": "#/components/schemas/BalanceLocation" }, - "toBalance": { "$ref": "#/components/schemas/BalanceLocation" }, - "validator": { - "type": "string", - "example": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57", - "description": "Optional. When this transfer route needs a validator and none is provided, the API resolves it from the selected ephemeral RPC via `getIdentity`." - }, - "initIfMissing": { "type": "boolean" }, - "initAtasIfMissing": { "type": "boolean" }, - "initVaultIfMissing": { "type": "boolean" }, - "memo": { - "type": "string", - "example": "Order #1042", - "description": "Optional. Appends a final Memo Program instruction with this UTF-8 message." - }, - "minDelayMs": { - "type": "string", - "pattern": "^\\d+$", - "example": "0", - "description": "Optional. Private transfer only. Defaults to 0." - }, - "maxDelayMs": { - "type": "string", - "pattern": "^\\d+$", - "example": "0", - "description": "Optional. Private transfer only. Defaults to 0 when omitted, or to minDelayMs when minDelayMs is set." - }, - "clientRefId": { - "type": "string", - "pattern": "^\\d+$", - "example": "42", - "description": "Optional. Private transfer only. Encrypted client reference ID that can be used to confirm a payment." - }, - "split": { - "type": "integer", - "exclusiveMinimum": 0, - "maximum": 15, - "example": 1, - "description": "Optional. Private transfer only. Defaults to 1. Must be between 1 and 15." - }, - "gasless": { - "type": "boolean", - "example": true, - "description": "Optional. When true, the API uses the configured sponsor as transaction fee payer and prepends a relay-fee token transfer to the sponsor ATA." - }, - "legacy": { - "type": "boolean", - "description": "Optional. Defaults to false. When true, skips lookup-table compilation and returns a legacy transaction." - } - }, - "required": ["from", "to", "mint", "amount", "visibility", "fromBalance", "toBalance"], - "example": { - "from": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", - "to": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L", - "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "amount": 1000000, - "visibility": "private", - "fromBalance": "base", - "toBalance": "base", - "initIfMissing": true, - "initAtasIfMissing": true, - "initVaultIfMissing": false, - "memo": "Order #1042", - "minDelayMs": "0", - "maxDelayMs": "0", - "clientRefId": "42", - "split": 1, - "gasless": true - } - }, - "TransferVisibility": { - "type": "string", - "enum": ["public", "private"] - }, - "BalanceResponse": { - "type": "object", - "properties": { - "address": { "type": "string", "example": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L" }, - "mint": { "type": "string", "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" }, - "ata": { "type": "string", "example": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE" }, - "location": { "$ref": "#/components/schemas/BalanceLocation" }, - "balance": { "type": "string" } - }, - "required": ["address", "mint", "ata", "location", "balance"] - }, - "MintInitializationResponse": { - "type": "object", - "properties": { - "mint": { "type": "string" }, - "validator": { "type": "string" }, - "transferQueue": { "type": "string" }, - "initialized": { "type": "boolean" } - }, - "required": ["mint", "validator", "transferQueue", "initialized"] - }, - "ChallengeResponse": { - "type": "object", - "properties": { - "challenge": { "type": "string", "example": "1234567890" } - }, - "required": ["challenge"] - }, - "LoginRequest": { - "type": "object", - "properties": { - "pubkey": { "type": "string", "example": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L" }, - "challenge": { "type": "string", "example": "1234567890" }, - "signature": { "type": "string", "example": "1234567890" }, - "cluster": { - "anyOf": [ - { "type": "string", "enum": ["mainnet", "devnet"] }, - { "type": "string" } - ], - "example": "mainnet" - }, - "mock": { "type": "boolean", "example": false } - }, - "required": ["pubkey", "challenge", "signature"] - }, - "LoginResponse": { - "type": "object", - "properties": { - "token": { "type": "string", "example": "1234567890" } - }, - "required": ["token"] - }, - "SwapMode": { "type": "string", "enum": ["ExactIn", "ExactOut"] }, - "InstructionVersion": { "type": "string", "enum": ["V1", "V2"] }, - "QuoteResponse": { - "type": "object", - "additionalProperties": true, - "properties": { - "inputMint": { "type": "string" }, - "inAmount": { "type": "string", "pattern": "^\\d+$" }, - "outputMint": { "type": "string" }, - "outAmount": { "type": "string", "pattern": "^\\d+$" }, - "otherAmountThreshold": { "type": "string", "pattern": "^\\d+$" }, - "swapMode": { "$ref": "#/components/schemas/SwapMode" }, - "slippageBps": { "type": "integer", "minimum": 0 }, - "priceImpactPct": { "type": "string" }, - "routePlan": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true, - "properties": { - "swapInfo": { "type": "object", "additionalProperties": true }, - "percent": { "type": "integer", "minimum": 0 }, - "bps": { "type": ["integer", "null"], "minimum": 0 } - } - } - }, - "instructionVersion": { "anyOf": [{ "$ref": "#/components/schemas/InstructionVersion" }, { "type": "null" }] }, - "platformFee": { "anyOf": [{ "type": "object", "additionalProperties": true }, { "type": "null" }] }, - "contextSlot": { "type": "integer", "minimum": 0 }, - "timeTaken": { "type": "number" } - }, - "required": ["inputMint", "inAmount", "outputMint", "outAmount", "otherAmountThreshold", "swapMode", "slippageBps", "priceImpactPct", "routePlan"] - }, - "SwapRequest": { - "type": "object", - "additionalProperties": true, - "properties": { - "userPublicKey": { "type": "string", "example": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE" }, - "quoteResponse": { "$ref": "#/components/schemas/QuoteResponse" }, - "payer": { "type": "string" }, - "wrapAndUnwrapSol": { "type": "boolean" }, - "useSharedAccounts": { "type": "boolean" }, - "feeAccount": { "type": "string" }, - "trackingAccount": { "type": "string" }, - "prioritizationFeeLamports": { - "anyOf": [ - { "type": "integer", "minimum": 0 }, - { "type": "object", "additionalProperties": true } - ] - }, - "asLegacyTransaction": { "type": "boolean" }, - "destinationTokenAccount": { "type": "string" }, - "nativeDestinationAccount": { "type": "string" }, - "dynamicComputeUnitLimit": { "type": "boolean" }, - "skipUserAccountsRpcCalls": { "type": "boolean" }, - "dynamicSlippage": { "type": "boolean" }, - "computeUnitPriceMicroLamports": { "type": "integer", "minimum": 0 }, - "blockhashSlotsToExpiry": { "type": "integer", "minimum": 0 }, - "positiveSlippage": { "type": "object", "additionalProperties": true }, - "visibility": { - "type": "string", - "enum": ["public", "private"], - "description": "`public` (default) proxies Jupiter/Metis as-is. `private` routes the output through a scheduled private transfer." - }, - "destination": { "type": "string", "description": "Required when `visibility=\"private\"`." }, - "minDelayMs": { "type": "string", "pattern": "^\\d+$", "description": "Required when `visibility=\"private\"`." }, - "maxDelayMs": { "type": "string", "pattern": "^\\d+$", "description": "Required when `visibility=\"private\"`. Max 600000." }, - "split": { "type": "integer", "minimum": 1, "maximum": 14, "description": "Required when `visibility=\"private\"`." }, - "clientRefId": { "type": "string", "pattern": "^\\d+$" }, - "validator": { "type": "string" } - }, - "required": ["userPublicKey", "quoteResponse"] - }, - "SwapResponse": { - "type": "object", - "additionalProperties": true, - "properties": { - "swapTransaction": { "type": "string" }, - "lastValidBlockHeight": { "type": "integer", "minimum": 0 }, - "prioritizationFeeLamports": { "type": "integer", "minimum": 0 }, - "privateTransfer": { - "type": "object", - "description": "Present only when `visibility=\"private\"`.", - "properties": { - "stashAta": { "type": "string" }, - "hydraCrankPda": { "type": "string" }, - "shuttleId": { "type": "integer", "minimum": 0 } - }, - "required": ["stashAta", "hydraCrankPda", "shuttleId"] - } - }, - "required": ["swapTransaction"] - }, - "McpResponse": { - "type": "object", - "properties": { - "jsonrpc": { "type": "string", "enum": ["2.0"] }, - "id": { - "anyOf": [{ "type": "string" }, { "type": "number" }, { "type": "null" }] - }, - "result": {}, - "error": { - "type": "object", - "properties": { - "code": { "type": "number" }, - "message": { "type": "string" } - }, - "required": ["code", "message"], - "additionalProperties": {} - } - }, - "required": ["jsonrpc"], - "additionalProperties": {}, - "example": { - "jsonrpc": "2.0", - "id": 3, - "result": { - "content": [ - { "type": "text", "text": "Built an unsigned SPL deposit transaction." } - ], - "structuredContent": { - "kind": "deposit", - "version": "legacy", - "transactionBase64": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIDKmcfsS5XfSOLaLlaBHJry50iH2Ufk2TMz4STC2fHzIcFKkerg3q2DD3Yn8TISmGeKoxSLz+BiP7iQ4pYqXYXsgu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8eS+smowIxqKDcCjw5liNXQkkCbBSDCBDFwtrgCKqoQ0DAgEBBAECAwQCAQEEAgIDBAIBAQQDAgME", - "sendTo": "base", - "recentBlockhash": "9A4VhP8M8fQZxP4h7rB6mP6eM8w2pJkYh7QdZk7V4r2x", - "lastValidBlockHeight": 284512337, - "instructionCount": 3, - "requiredSigners": ["3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE"], - "validator": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57" - } - } - } - } - }, - "parameters": {}, - "securitySchemes": { - "BearerAuth": { - "type": "http", - "scheme": "bearer", - "description": "Authentication token issued by `POST /v1/spl/login`." - } - } - }, - "paths": { - "/health": { - "get": { - "tags": ["Meta"], - "responses": { - "200": { - "description": "Health check", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/HealthResponse" } - } - } - } - } - } - }, - "/v1/spl/challenge": { - "get": { - "tags": ["Auth"], - "description": "Generate a challenge string for the wallet to sign.", - "parameters": [ - { - "name": "pubkey", - "in": "query", - "required": true, - "schema": { "type": "string", "example": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L" }, - "description": "The public key of the wallet that will read private data." - }, - { - "name": "cluster", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { "type": "string", "enum": ["mainnet", "devnet"] }, - { "type": "string" } - ], - "example": "mainnet" - } - }, - { - "name": "mock", - "in": "query", - "required": false, - "schema": { "type": "boolean", "example": false } - } - ], - "responses": { - "200": { - "description": "Challenge string", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ChallengeResponse" } - } - } - }, - "422": { - "description": "Validation error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - } - } - } - }, - "/v1/spl/login": { - "post": { - "tags": ["Auth"], - "description": "Login the wallet to the Private Ephemeral Rollup.", - "requestBody": { - "required": true, - "description": "Login request", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/LoginRequest" } - } - } - }, - "responses": { - "200": { - "description": "Authentication token", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/LoginResponse" } - } - } - }, - "403": { - "description": "Signature verification failed", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "422": { - "description": "Validation error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - } - } - } - }, - "/v1/spl/deposit": { - "post": { - "tags": ["SPL"], - "description": "Deposit SPL tokens from Solana into an ephemeral rollup.", - "requestBody": { - "required": true, - "description": "Deposit request", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/DepositRequest" } - } - } - }, - "responses": { - "200": { - "description": "Unsigned serialized transaction", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/UnsignedTransactionResponse" }, - "example": { - "kind": "deposit", - "version": "legacy", - "transactionBase64": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIDKmcfsS5XfSOLaLlaBHJry50iH2Ufk2TMz4STC2fHzIcFKkerg3q2DD3Yn8TISmGeKoxSLz+BiP7iQ4pYqXYXsgu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8eS+smowIxqKDcCjw5liNXQkkCbBSDCBDFwtrgCKqoQ0DAgEBBAECAwQCAQEEAgIDBAIBAQQDAgME", - "sendTo": "base", - "recentBlockhash": "9A4VhP8M8fQZxP4h7rB6mP6eM8w2pJkYh7QdZk7V4r2x", - "lastValidBlockHeight": 284512337, - "instructionCount": 3, - "requiredSigners": ["3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE"], - "validator": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57" - } - } - } - }, - "400": { - "description": "Build error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "422": { - "description": "Validation error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } - } - } - } - } - } - }, - "/v1/spl/withdraw": { - "post": { - "tags": ["SPL"], - "description": "Withdraw SPL tokens from an ephemeral rollup back to Solana.", - "requestBody": { - "required": true, - "description": "Withdraw request", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/WithdrawRequest" } - } - } - }, - "responses": { - "200": { - "description": "Unsigned serialized transaction", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/UnsignedTransactionResponse" }, - "example": { - "kind": "withdraw", - "version": "legacy", - "transactionBase64": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIDKmcfsS5XfSOLaLlaBHJry50iH2Ufk2TMz4STC2fHzIcFKkerg3q2DD3Yn8TISmGeKoxSLz+BiP7iQ4pYqXYXsgu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8AazZ0ixOauLjpxaRgDCv6MChaoMAZAJg8BnPbZl31jECAgEBBAECAwQCAQEEAgIDBA==", - "sendTo": "base", - "recentBlockhash": "7YH7nE6qj8vH3L9pR5uM2cD1xK4sT8wQ6bN3fJ2mP9z", - "lastValidBlockHeight": 284512451, - "instructionCount": 2, - "requiredSigners": ["3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE"], - "validator": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57" - } - } - } - }, - "400": { - "description": "Build error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "422": { - "description": "Validation error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } - } - } - } - } - } - }, - "/v1/spl/initialize-mint": { - "post": { - "tags": ["SPL"], - "description": "Build an unsigned base-chain transaction that initializes and delegates a validator-scoped transfer queue for a mint.", - "requestBody": { - "required": true, - "description": "Initialize mint request", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/InitializeMintRequest" } - } - } - }, - "responses": { - "200": { - "description": "Unsigned serialized transaction", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/InitializeMintResponse" }, - "example": { - "kind": "initializeMint", - "version": "legacy", - "transactionBase64": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIDKmcfsS5XfSOLaLlaBHJry50iH2Ufk2TMz4STC2fHzIcFKkerg3q2DD3Yn8TISmGeKoxSLz+BiP7iQ4pYqXYXsgu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8eS+smowIxqKDcCjw5liNXQkkCbBSDCBDFwtrgCKqoQ0DAgEBBAECAwQCAQEEAgIDBAIBAQQDAgME", - "sendTo": "base", - "recentBlockhash": "9A4VhP8M8fQZxP4h7rB6mP6eM8w2pJkYh7QdZk7V4r2x", - "lastValidBlockHeight": 284512337, - "instructionCount": 4, - "requiredSigners": ["3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE"], - "validator": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57", - "transferQueue": "BuBHLbaPmYmgvMiZ8uZb96RjBtmWzJY52u7Di5urNf6M", - "rentPda": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L" - } - } - } - }, - "400": { - "description": "Build error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "422": { - "description": "Validation error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } - } - } - } - } - } - }, - "/v1/spl/transfer": { - "post": { - "tags": ["SPL"], - "description": "Transfer SPL tokens publicly or privately through an ephemeral rollup. Pass an optional `Authorization: Bearer ` header for transfers that need to connect to the Private Ephemeral Rollup.", - "parameters": [ - { - "name": "authorization", - "in": "header", - "required": false, - "schema": { "type": "string", "example": "Bearer 1234567890" }, - "description": "Optional. Authentication token for requests that need to connect to the Private Ephemeral Rollup." - } - ], - "requestBody": { - "required": true, - "description": "Transfer request", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TransferRequest" } - } - } - }, - "responses": { - "200": { - "description": "Unsigned serialized transaction", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/UnsignedTransactionResponse" } - } - } - }, - "400": { - "description": "Build error or unsupported transfer route (`UNSUPPORTED_TRANSFER_ROUTE`)", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "422": { - "description": "Validation error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } - } - } - } - } - } - }, - "/v1/spl/balance": { - "get": { - "tags": ["SPL"], - "description": "Get the balance for the owner's ATA on the base RPC.", - "parameters": [ - { - "name": "address", - "in": "query", - "required": true, - "schema": { "type": "string", "example": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L" } - }, - { - "name": "mint", - "in": "query", - "required": true, - "schema": { "type": "string", "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" } - }, - { - "name": "cluster", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { "type": "string", "enum": ["mainnet", "devnet"] }, - { "type": "string" } - ], - "example": "mainnet" - }, - "description": "Optional. Use `mainnet` for BASE_RPC_URL and EPHEMERAL_RPC_URL, `devnet` for BASE_DEVNET_RPC_URL and EPHEMERAL_DEVNET_RPC_URL, or provide a custom http(s) RPC URL to override the base RPC while keeping the configured ephemeral RPC." - } - ], - "responses": { - "200": { - "description": "Base-chain token balance", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/BalanceResponse" }, - "example": { - "address": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L", - "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "ata": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", - "location": "base", - "balance": "1000000" - } - } - } - }, - "400": { - "description": "Query error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "422": { - "description": "Validation error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } - } - } - } - } - } - }, - "/v1/spl/private-balance": { - "get": { - "tags": ["SPL"], - "description": "Get the balance for the owner's ATA on the ephemeral RPC. Requires authentication via the Private Ephemeral Rollup login flow.", - "security": [{ "BearerAuth": [] }], - "parameters": [ - { - "name": "authorization", - "in": "header", - "required": true, - "schema": { "type": "string", "example": "Bearer 1234567890" }, - "description": "Required. Authentication token issued by `POST /v1/spl/login`." - }, - { - "name": "address", - "in": "query", - "required": true, - "schema": { "type": "string", "example": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L" } - }, - { - "name": "mint", - "in": "query", - "required": true, - "schema": { "type": "string", "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" } - }, - { - "name": "cluster", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { "type": "string", "enum": ["mainnet", "devnet"] }, - { "type": "string" } - ], - "example": "mainnet" - }, - "description": "Optional. Use `mainnet` for BASE_RPC_URL and EPHEMERAL_RPC_URL, `devnet` for BASE_DEVNET_RPC_URL and EPHEMERAL_DEVNET_RPC_URL, or provide a custom http(s) RPC URL to override the base RPC while keeping the configured ephemeral RPC." - } - ], - "responses": { - "200": { - "description": "Ephemeral token balance", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/BalanceResponse" }, - "example": { - "address": "Bt9oNR5cCtnfuMmXgWELd6q5i974PdEMQDUE55nBC57L", - "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "ata": "3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE", - "location": "ephemeral", - "balance": "1000000" - } - } - } - }, - "400": { - "description": "Missing auth token (`MISSING_AUTH_TOKEN`) or other query error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "422": { - "description": "Validation error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } - } - } - } - } - } - }, - "/v1/spl/is-mint-initialized": { - "get": { - "tags": ["SPL"], - "description": "Check whether the validator-scoped transfer queue exists for a mint on the ephemeral RPC.", - "parameters": [ - { - "name": "mint", - "in": "query", - "required": true, - "schema": { "type": "string", "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" } - }, - { - "name": "cluster", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { "type": "string", "enum": ["mainnet", "devnet"] }, - { "type": "string" } - ], - "example": "mainnet" - } - }, - { - "name": "validator", - "in": "query", - "required": false, - "schema": { "type": "string", "example": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57" }, - "description": "Optional. Defaults to the selected ephemeral RPC identity resolved via `getIdentity`." - } - ], - "responses": { - "200": { - "description": "Mint transfer queue initialization status", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MintInitializationResponse" }, - "example": { - "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "validator": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57", - "transferQueue": "BuBHLbaPmYmgvMiZ8uZb96RjBtmWzJY52u7Di5urNf6M", - "initialized": true - } - } - } - }, - "400": { - "description": "Query error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "422": { - "description": "Validation error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } - } - } - } - } - } - }, - "/v1/swap/quote": { - "get": { - "tags": ["Swap"], - "description": "Get a swap quote between two SPL mints. Proxies the configured Triton Metis Swap API.", - "parameters": [ - { "name": "inputMint", "in": "query", "required": true, "schema": { "type": "string", "example": "So11111111111111111111111111111111111111112" } }, - { "name": "outputMint", "in": "query", "required": true, "schema": { "type": "string", "example": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" } }, - { "name": "amount", "in": "query", "required": true, "schema": { "type": "string", "pattern": "^\\d+$", "example": "1000000" } }, - { "name": "slippageBps", "in": "query", "required": false, "schema": { "type": "integer", "minimum": 0, "example": 50 } }, - { "name": "swapMode", "in": "query", "required": false, "schema": { "$ref": "#/components/schemas/SwapMode" } }, - { "name": "dexes", "in": "query", "required": false, "schema": { "type": "string" } }, - { "name": "excludeDexes", "in": "query", "required": false, "schema": { "type": "string" } }, - { "name": "restrictIntermediateTokens", "in": "query", "required": false, "schema": { "type": "boolean" } }, - { "name": "onlyDirectRoutes", "in": "query", "required": false, "schema": { "type": "boolean" } }, - { "name": "asLegacyTransaction", "in": "query", "required": false, "schema": { "type": "boolean" } }, - { "name": "platformFeeBps", "in": "query", "required": false, "schema": { "type": "integer", "minimum": 0 } }, - { "name": "maxAccounts", "in": "query", "required": false, "schema": { "type": "integer", "minimum": 0 } }, - { "name": "instructionVersion", "in": "query", "required": false, "schema": { "$ref": "#/components/schemas/InstructionVersion" } }, - { "name": "dynamicSlippage", "in": "query", "required": false, "schema": { "type": "boolean" } }, - { "name": "forJitoBundle", "in": "query", "required": false, "schema": { "type": "boolean" } }, - { "name": "supportDynamicIntermediateTokens", "in": "query", "required": false, "schema": { "type": "boolean" } } - ], - "responses": { - "200": { - "description": "Swap quote", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/QuoteResponse" } - } - } - }, - "500": { - "description": "Configuration error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "502": { - "description": "Upstream error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - } - } - } - }, - "/v1/swap/swap": { - "post": { - "tags": ["Swap"], - "description": "Build an unsigned swap transaction from a quote. Supports `visibility=\"public\"` (default upstream pass-through) and `visibility=\"private\"` (forces output into a program-owned stash ATA and appends a `schedule_private_transfer` instruction).", - "requestBody": { - "required": true, - "description": "Swap request", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/SwapRequest" } - } - } - }, - "responses": { - "200": { - "description": "Swap transaction", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/SwapResponse" } - } - } - }, - "400": { - "description": "Invalid request (missing or conflicting private-transfer fields)", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "500": { - "description": "Configuration error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - }, - "502": { - "description": "Upstream error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } - } - } - } - } - } - }, - "/mcp": { - "post": { - "tags": ["MCP"], - "description": "Stateless Streamable HTTP MCP endpoint.\n\nImplementation details:\n- Each `POST /mcp` request creates a fresh `McpServer`, handles the JSON-RPC exchange, then closes it.\n- The transport runs with `sessionIdGenerator: undefined` and `enableJsonResponse: true`, so this server does not issue or require `mcp-session-id` headers.\n- `GET /mcp` returns the info document and `GET /.well-known/mcp.json` returns the discovery document.\n- Clients can use `Accept: application/json` with `Content-Type: application/json`.\n\nTypical flow:\n1. `initialize`\n2. `notifications/initialized`\n3. `tools/list` or `tools/call`", - "responses": { - "200": { - "description": "MCP JSON-RPC response", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/McpResponse" }, - "example": { - "jsonrpc": "2.0", - "id": 3, - "result": { - "content": [ - { "type": "text", "text": "Built an unsigned SPL deposit transaction." } - ], - "structuredContent": { - "kind": "deposit", - "version": "legacy", - "transactionBase64": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIDKmcfsS5XfSOLaLlaBHJry50iH2Ufk2TMz4STC2fHzIcFKkerg3q2DD3Yn8TISmGeKoxSLz+BiP7iQ4pYqXYXsgu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8eS+smowIxqKDcCjw5liNXQkkCbBSDCBDFwtrgCKqoQ0DAgEBBAECAwQCAQEEAgIDBAIBAQQDAgME", - "sendTo": "base", - "recentBlockhash": "9A4VhP8M8fQZxP4h7rB6mP6eM8w2pJkYh7QdZk7V4r2x", - "lastValidBlockHeight": 284512337, - "instructionCount": 3, - "requiredSigners": ["3rXKwQ1kpjBd5tdcco32qsvqUh1BnZjcYnS5kYrP7AYE"], - "validator": "MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57" - } - } - } - } - } - }, - "202": { "description": "Notification accepted; no response body is returned." }, - "400": { - "description": "Invalid JSON or invalid JSON-RPC request", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/McpResponse" }, - "example": { - "jsonrpc": "2.0", - "error": { "code": -32700, "message": "Parse error" }, - "id": null - } - } - } - }, - "415": { - "description": "Content-Type must be application/json", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/McpResponse" } - } - } - }, - "500": { - "description": "MCP JSON-RPC error response", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/McpResponse" } - } - } - } - }, - "requestBody": { - "required": true, - "description": "MCP JSON-RPC request", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": true, - "properties": { - "jsonrpc": { "type": "string", "enum": ["2.0"] }, - "id": { - "anyOf": [{ "type": "string" }, { "type": "number" }, { "type": "null" }] - }, - "method": { "type": "string" }, - "params": {} - }, - "required": ["jsonrpc", "method"] - }, - "example": { - "jsonrpc": "2.0", - "id": 1, - "method": "initialize", - "params": { - "protocolVersion": "2025-11-25", - "capabilities": {}, - "clientInfo": { "name": "curl-example", "version": "1.0.0" } - } - } - } - } - } - } - } - }, - "webhooks": {} -} diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/private-balance.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/private-balance.mdx deleted file mode 100644 index 1bb4812..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/private-balance.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Private Balance" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/private-balance.openapi.json GET /v1/spl/private-balance ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/quote.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/quote.mdx deleted file mode 100644 index 54ded48..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/quote.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Swap Quote" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/quote.openapi.json GET /v1/swap/quote ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/swap.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/swap.mdx deleted file mode 100644 index e2ba5f5..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/swap.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Swap" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/swap.openapi.json POST /v1/swap/swap ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/transfer.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/transfer.mdx deleted file mode 100644 index e872052..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/transfer.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Transfer SPL Tokens" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/transfer.openapi.json POST /v1/spl/transfer ---- diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/withdraw.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/withdraw.mdx deleted file mode 100644 index f42fcc5..0000000 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/withdraw.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Withdraw SPL Tokens" -openapi: /pages/private-ephemeral-rollups-pers/api-reference/per/openapi/withdraw.openapi.json POST /v1/spl/withdraw ---- diff --git a/pages/private-ephemeral-rollups-pers/how-to-guide/ephemeral-spl-private-payments.mdx b/pages/private-ephemeral-rollups-pers/how-to-guide/ephemeral-spl-private-payments.mdx deleted file mode 100644 index 469d53d..0000000 --- a/pages/private-ephemeral-rollups-pers/how-to-guide/ephemeral-spl-private-payments.mdx +++ /dev/null @@ -1,256 +0,0 @@ - ---- -title: Private Payments with Ephemeral SPL Tokens -description: Guide to using ephemeral SPL tokens for private deposits, transfers, and withdrawals ---- - -## Overview - -This guide explains how to use **ephemeral SPL tokens** to enable **private deposits, transfers, and withdrawals** -in the context of the MagicBlock private-payments example. - -Ephemeral tokens are short-lived, program-controlled SPL token accounts or mints that: -- Exist only for the duration of a specific workflow -- Minimize on-chain linkage between users -- Reduce long-term metadata and balance traceability - -The goal is **privacy by design**, not anonymity by default. - ---- - -## Core Concepts - -### What Is an Ephemeral SPL Token? - -An ephemeral SPL token typically means: - -- A **temporary token account** (and sometimes a temporary mint) -- Owned or controlled by a program-derived address (PDA) -- Created just-in-time for a transaction or session -- Closed (and rent reclaimed) after use - -This pattern limits the lifetime of balances and makes it harder to correlate activity across transactions. - ---- - -### Privacy Model - -Private payments here rely on: - -- Short-lived token accounts -- Program-mediated custody -- Controlled account closure -- Optional use of fresh user keypairs per session - -⚠️ This does **not** fully hide activity from validators or RPC providers. -It reduces *linkability*, not *observability*. - ---- - -## Architecture Flow - -``` -User Wallet - | - | 1. Deposit - v -Ephemeral Token Account (PDA-controlled) - | - | 2. Transfer (internal) - v -Another Ephemeral Account - | - | 3. Withdrawal - v -Destination Token Account -``` - ---- - -## Deposits - -### How Deposits Work - -1. User approves a transfer from their standard SPL token account -2. Program creates an ephemeral token account (PDA) -3. Tokens are transferred into the ephemeral account -4. The account is registered internally for later actions - -### Key Properties - -- The user never directly owns the ephemeral account -- Authority is a PDA derived from: - - Program ID - - Session or deposit seed -- Deposit metadata is kept minimal - -### Best Practices - -- Use unique seeds per deposit -- Avoid reusing ephemeral accounts -- Immediately revoke user authority after transfer - ---- - -## Private Transfers - -### Internal Transfers - -Private transfers occur **inside program-controlled accounts**: - -- No user wallet signature required after deposit -- Balances move between ephemeral accounts -- Transfers can represent: - - Internal payments - - Escrow-like flows - - Conditional releases - -### Why This Improves Privacy - -- No direct sender → receiver token transfer -- On-chain history shows only PDA-to-PDA movement -- Users are abstracted from SPL token ownership - ---- - -## Withdrawals - -### Withdrawal Flow - -1. User requests withdrawal -2. Program verifies: - - Authorization - - Balance - - Withdrawal constraints -3. Program transfers tokens to the user’s destination account -4. Ephemeral account is **closed** - -### Account Closure - -Always close ephemeral accounts after withdrawal: - -- Reclaim rent -- Reduce on-chain footprint -- Prevent balance probing - ---- - -## Example Pseudocode - -```ts -// Create ephemeral token account -const ephemeralAccount = derivePDA( - programId, - ["ephemeral", user.publicKey, sessionId] -); - -// Deposit -token.transfer( - userTokenAccount, - ephemeralAccount, - userAuthority, - amount -); - -// Withdraw -token.transfer( - ephemeralAccount, - destinationAccount, - programPDA, - amount -); - -token.closeAccount(ephemeralAccount); -``` - ---- - -## IMPORTANT: Developer Notes ⚠️ - -### 1. Privacy Is a Spectrum - -Ephemeral tokens **do not guarantee anonymity**. - -They: -- Reduce linkability -- Limit long-lived balances -- Improve default privacy hygiene - -They do **not**: -- Hide transaction amounts -- Obfuscate timing -- Protect against RPC-level analysis - ---- - -### 2. Seed Design Matters - -Bad PDA seeds can destroy privacy. - -Avoid: -- Static seeds -- Reused user public keys -- Predictable counters - -Prefer: -- Session-based randomness -- Hashes of user + nonce -- One-time identifiers - ---- - -### 3. Always Close Accounts - -Leaving ephemeral accounts open: -- Leaks historical balances -- Wastes rent -- Enables state probing - -Make closure mandatory in your program logic. - ---- - -### 4. Do Not Log Sensitive Metadata - -Avoid emitting: -- User public keys -- Amounts -- Session identifiers - -Especially in program logs or events. - ---- - -### 5. Wallet UX Still Matters - -Even with ephemeral tokens: -- Wallet approvals reveal intent -- Poor UX can re-link identities -- Reused destination accounts leak patterns - -Encourage: -- Fresh token accounts -- Optional burner wallets -- Clear user education - ---- - -## Summary - -Ephemeral SPL tokens are a powerful primitive for building **privacy-aware payment flows** on Solana. - -When combined with: -- Program-controlled custody -- Account lifecycle discipline -- Careful seed design - -They enable private deposits, internal transfers, and clean withdrawals — without modifying the SPL token standard. - ---- - -## Next Steps - -- Review the private-payments example code -- Audit PDA derivation logic -- Threat-model your privacy assumptions -- Test account closure paths thoroughly diff --git a/pages/templates/private-payments.mdx b/pages/templates/private-payments.mdx index ab2f9c7..14993dc 100644 --- a/pages/templates/private-payments.mdx +++ b/pages/templates/private-payments.mdx @@ -23,7 +23,7 @@ title: Private Payments Fastest and simplest way to build private payments diff --git a/snippets/product-cards.mdx b/snippets/product-cards.mdx index 8182a8c..60603b8 100644 --- a/snippets/product-cards.mdx +++ b/snippets/product-cards.mdx @@ -18,12 +18,12 @@ - Add private onchain transfers to your app in seconds — compliant by default. + Move SPL tokens at rollup speed — public or private transfers, swaps, and private payments for trading and DeFi apps. + + SPL Tokens Anchor Implementation + + + Try private payments + + diff --git a/snippets/spl-tokens-code/delegate.mdx b/snippets/spl-tokens-code/delegate.mdx new file mode 100644 index 0000000..ddf4095 --- /dev/null +++ b/snippets/spl-tokens-code/delegate.mdx @@ -0,0 +1,16 @@ +```typescript +// Legacy vault flow — keep the same idempotent setting across +// delegateSpl / undelegateIx / withdrawSpl within one lifecycle. +const delegateOpts = { validator, idempotent: false as const, payer: admin.publicKey }; + +const ixs = await delegateSpl(owner.publicKey, mint.publicKey, amount, { + ...delegateOpts, + initVaultIfMissing, // true for the first owner of this mint, false after +}); + +await provider.sendAndConfirm( + new anchor.web3.Transaction().add(...ixs), + [owner, admin], + { commitment: "confirmed", skipPreflight: true }, +); +``` diff --git a/snippets/spl-tokens-code/program.mdx b/snippets/spl-tokens-code/program.mdx new file mode 100644 index 0000000..f0ad0b9 --- /dev/null +++ b/snippets/spl-tokens-code/program.mdx @@ -0,0 +1,24 @@ +```rust +use anchor_lang::prelude::*; +use anchor_spl::token::{self, Token, TokenAccount, Transfer as SplTransfer}; +use ephemeral_rollups_sdk::anchor::ephemeral; + +#[ephemeral] +#[program] +pub mod spl_tokens { + use super::*; + + /// Transfer `amount` of SPL tokens from `from` to `to`. + pub fn transfer(ctx: Context, amount: u64) -> Result<()> { + require!(amount > 0, ErrorCode::InvalidAmount); + let cpi_accounts = SplTransfer { + from: ctx.accounts.from.to_account_info(), + to: ctx.accounts.to.to_account_info(), + authority: ctx.accounts.payer.to_account_info(), + }; + let cpi_ctx = CpiContext::new(ctx.accounts.token_program.key(), cpi_accounts); + token::transfer(cpi_ctx, amount)?; + Ok(()) + } +} +``` diff --git a/snippets/spl-tokens-code/sc-commit.mdx b/snippets/spl-tokens-code/sc-commit.mdx new file mode 100644 index 0000000..9a04e88 --- /dev/null +++ b/snippets/spl-tokens-code/sc-commit.mdx @@ -0,0 +1,11 @@ +```rust +// The #[commit] attribute on the accounts context supplies +// magic_context and magic_program. +MagicIntentBundleBuilder::new( + ctx.accounts.payer.to_account_info(), + ctx.accounts.magic_context.to_account_info(), + ctx.accounts.magic_program.to_account_info(), +) +.commit_and_undelegate(&[ctx.accounts.pool.to_account_info()]) +.build_and_invoke()?; +``` diff --git a/snippets/spl-tokens-code/sc-create-eata.mdx b/snippets/spl-tokens-code/sc-create-eata.mdx new file mode 100644 index 0000000..ff45dd4 --- /dev/null +++ b/snippets/spl-tokens-code/sc-create-eata.mdx @@ -0,0 +1,11 @@ +```rust +// The eATA is owned by your custody PDA (e.g. a Pool), derived under the +// Ephemeral SPL Token program from [owner, mint]. +let (eata, _bump) = Pubkey::find_program_address( + &[owner.as_ref(), mint.as_ref()], + &EPHEMERAL_SPL_TOKEN_PROGRAM_ID, +); + +// At initialize, create the eATA (InitializeEphemeralAta) and the per-mint +// global vault that backs every eATA (InitializeGlobalVault), then fund it. +``` diff --git a/snippets/spl-tokens-code/sc-delegate.mdx b/snippets/spl-tokens-code/sc-delegate.mdx new file mode 100644 index 0000000..70a50a7 --- /dev/null +++ b/snippets/spl-tokens-code/sc-delegate.mdx @@ -0,0 +1,24 @@ +```rust +// Delegate the eATA with a CPI to the Ephemeral SPL Token program. +// An optional trailing validator pubkey routes to a specific validator. +let mut data = vec![4]; // DelegateEphemeralAta +if let Some(validator) = validator { + data.extend_from_slice(validator.as_ref()); +} + +let instruction = Instruction { + program_id: EPHEMERAL_SPL_TOKEN_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(payer.key(), true), + AccountMeta::new(ephemeral_ata.key(), false), + AccountMeta::new_readonly(EPHEMERAL_SPL_TOKEN_PROGRAM_ID, false), + AccountMeta::new(buffer.key(), false), + AccountMeta::new(record.key(), false), + AccountMeta::new(metadata.key(), false), + AccountMeta::new_readonly(delegation_program.key(), false), + AccountMeta::new_readonly(system_program.key(), false), + ], + data, +}; +invoke(&instruction, &account_infos)?; +``` diff --git a/snippets/spl-tokens-code/sc-ephemeral.mdx b/snippets/spl-tokens-code/sc-ephemeral.mdx new file mode 100644 index 0000000..e96bb5c --- /dev/null +++ b/snippets/spl-tokens-code/sc-ephemeral.mdx @@ -0,0 +1,12 @@ +```rust +use ephemeral_rollups_sdk::anchor::{commit, delegate, ephemeral}; +use ephemeral_rollups_sdk::cpi::DelegateConfig; +use ephemeral_rollups_sdk::ephem::MagicIntentBundleBuilder; + +#[ephemeral] +#[program] +pub mod your_program { + use super::*; + // ... +} +``` diff --git a/snippets/spl-tokens-code/sc-non-custody.mdx b/snippets/spl-tokens-code/sc-non-custody.mdx new file mode 100644 index 0000000..ef9e48c --- /dev/null +++ b/snippets/spl-tokens-code/sc-non-custody.mdx @@ -0,0 +1,9 @@ +```rust +// No PDA signer — the authority is the user's Signer. +let cpi_accounts = SplTransfer { + from: ctx.accounts.from.to_account_info(), + to: ctx.accounts.to.to_account_info(), + authority: ctx.accounts.payer.to_account_info(), +}; +token::transfer(CpiContext::new(ctx.accounts.token_program.key(), cpi_accounts), amount)?; +``` diff --git a/snippets/spl-tokens-code/sc-post-commit.mdx b/snippets/spl-tokens-code/sc-post-commit.mdx new file mode 100644 index 0000000..2edd68e --- /dev/null +++ b/snippets/spl-tokens-code/sc-post-commit.mdx @@ -0,0 +1,9 @@ +```rust +// Keep real token accounts on base, delegate only program state, and pay out +// PDA-signed on the base layer right after the commit. +MagicIntentBundleBuilder::new(payer, magic_context, magic_program) + .magic_fee_vault(magic_fee_vault) + .commit(&[state_pda]) + .add_post_commit_actions([action]) + .build_and_invoke_signed(payer_seeds)?; +``` diff --git a/snippets/spl-tokens-code/sc-transfer.mdx b/snippets/spl-tokens-code/sc-transfer.mdx new file mode 100644 index 0000000..5e362ee --- /dev/null +++ b/snippets/spl-tokens-code/sc-transfer.mdx @@ -0,0 +1,15 @@ +```rust +use anchor_spl::token::{self, Transfer as SplTransfer}; + +// The custody PDA signs the transfer — no user signature required. +let bump_seed = [pool_bump]; +let signer_seeds: &[&[&[u8]]] = &[&[POOL_SEED, &bump_seed]]; + +let cpi_accounts = SplTransfer { + from, + to, + authority: pool, // the Pool PDA +}; +let cpi_ctx = CpiContext::new_with_signer(token_program.key(), cpi_accounts, signer_seeds); +token::transfer(cpi_ctx, amount)?; +``` diff --git a/snippets/spl-tokens-code/transfer.mdx b/snippets/spl-tokens-code/transfer.mdx new file mode 100644 index 0000000..0c466a2 --- /dev/null +++ b/snippets/spl-tokens-code/transfer.mdx @@ -0,0 +1,19 @@ +```typescript +// Delegation confirms on base before the ER clones the account — +// poll the ER view before transferring. +await waitForErTokenAccount(ata, expectedAmount); + +const transferIxs = await transferSpl( + recipientA.publicKey, + recipientB.publicKey, + mint.publicKey, + 2n, + { visibility: "public", fromBalance: "ephemeral", toBalance: "ephemeral" }, +); + +await providerEphemeralRollup.sendAndConfirm( + new anchor.web3.Transaction().add(...transferIxs), + [recipientA], + { commitment: "confirmed", skipPreflight: true }, +); +``` diff --git a/snippets/spl-tokens-code/undelegate.mdx b/snippets/spl-tokens-code/undelegate.mdx new file mode 100644 index 0000000..b8edfc8 --- /dev/null +++ b/snippets/spl-tokens-code/undelegate.mdx @@ -0,0 +1,12 @@ +```typescript +const sgn = await providerEphemeralRollup.sendAndConfirm( + new anchor.web3.Transaction().add(undelegateIx(owner.publicKey, mint.publicKey)), + [owner], + { commitment: "confirmed", skipPreflight: true }, +); + +// Wait for the commit back to base before withdrawing, or the withdraw +// races the commit and fails with InvalidAccountOwner. +const commit = await GetCommitmentSignature(sgn, providerEphemeralRollup.connection); +await connection.confirmTransaction(commit, "confirmed"); +``` diff --git a/snippets/spl-tokens-code/withdraw.mdx b/snippets/spl-tokens-code/withdraw.mdx new file mode 100644 index 0000000..6c7f5ca --- /dev/null +++ b/snippets/spl-tokens-code/withdraw.mdx @@ -0,0 +1,11 @@ +```typescript +const withdrawIxs = await withdrawSpl(owner.publicKey, mint.publicKey, amount, { + idempotent: false, +}); + +await provider.sendAndConfirm( + new anchor.web3.Transaction().add(...withdrawIxs), + [owner], + { commitment: "confirmed" }, +); +``` From 460926dcc81432e0c38e23946233c50b876b38f1 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Tue, 7 Jul 2026 01:29:43 +0530 Subject: [PATCH 2/9] docs: address CodeRabbit review comments on Ephemeral SPL Token specs --- .gitignore | 1 + docs.json | 2 +- .../api-reference/openapi/deposit.openapi.json | 2 +- .../api-reference/openapi/stealth-pool.openapi.json | 3 ++- .../api-reference/openapi/transaction-send.openapi.json | 9 ++++++++- .../api-reference/openapi/transfer.openapi.json | 1 + pages/ephemeral-spl-token/private-payments.mdx | 2 +- 7 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 64d3440..676191a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ .idea node_modules .translation-cache +.env diff --git a/docs.json b/docs.json index f80ba38..b4f045c 100644 --- a/docs.json +++ b/docs.json @@ -28,7 +28,7 @@ { "source": "/jp/pages/overview/additional-information/solana-vrf", "destination": "/jp/pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf" }, { "source": "/ko/pages/overview/additional-information/solana-vrf", "destination": "/ko/pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf" }, { "source": "/api-reference/per-api/getConfig", "destination": "/pages/ephemeral-spl-token/api-reference/introduction" }, - { "source": "/api-reference/per-api/prepareWithdrawal", "destination": "/pages/ephemeral-spl-token/api-reference/introduction" }, + { "source": "/api-reference/per-api/prepareWithdrawal", "destination": "/pages/ephemeral-spl-token/api-reference/withdraw" }, { "source": "/api-reference/per-api/transferAmount", "destination": "/pages/ephemeral-spl-token/api-reference/transfer" }, { "source": "/api-reference/er-api/introduction", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/introduction" }, { "source": "/api-reference/er-api/getRoutes", "destination": "/pages/ephemeral-rollups-ers/api-reference/er/getRoutes" }, diff --git a/pages/ephemeral-spl-token/api-reference/openapi/deposit.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/deposit.openapi.json index ccb8824..d5b0f6f 100644 --- a/pages/ephemeral-spl-token/api-reference/openapi/deposit.openapi.json +++ b/pages/ephemeral-spl-token/api-reference/openapi/deposit.openapi.json @@ -55,7 +55,7 @@ "initVaultIfMissing": { "type": "boolean", "description": "Optional. Initialize the vault if missing." }, "initAtasIfMissing": { "type": "boolean", "description": "Optional. Initialize associated token accounts if missing." }, "idempotent": { "type": "boolean", "description": "Optional. When `true`, the API uses idempotent variants for any preparatory init instructions." }, - "private": { "type": "boolean", "description": "Optional. Defaults to `true`. When `true`, the deposited balance is kept private." } + "private": { "type": "boolean", "default": true, "description": "Optional. When `true`, the deposited balance is kept private." } }, "required": ["owner", "amount"], "example": { diff --git a/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json index b772a12..16bbb28 100644 --- a/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json +++ b/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json @@ -44,6 +44,7 @@ "handle": { "type": "string", "minLength": 1, + "maxLength": 255, "example": "john.doe@magicblock.id", "description": "Human-readable handle, up to 255 UTF-8 bytes. Stored as its exact bytes — NOT trimmed, lowercased, or normalized, so `John.Doe@…` is a different handle than `john.doe@…`." }, @@ -134,7 +135,7 @@ "in": "query", "required": true, "description": "The exact handle (up to 255 UTF-8 bytes). Must match the stored bytes exactly.", - "schema": { "type": "string", "example": "john.doe@magicblock.id" } + "schema": { "type": "string", "minLength": 1, "maxLength": 255, "example": "john.doe@magicblock.id" } }, { "name": "cluster", diff --git a/pages/ephemeral-spl-token/api-reference/openapi/transaction-send.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/transaction-send.openapi.json index f49f274..8f7824c 100644 --- a/pages/ephemeral-spl-token/api-reference/openapi/transaction-send.openapi.json +++ b/pages/ephemeral-spl-token/api-reference/openapi/transaction-send.openapi.json @@ -49,7 +49,7 @@ }, "cluster": { "anyOf": [ - { "type": "string", "enum": ["mainnet", "devnet"] }, + { "type": "string", "enum": ["mainnet", "devnet", "mainnet-private", "devnet-private"] }, { "type": "string" } ], "example": "mainnet", @@ -79,6 +79,13 @@ } }, "required": ["transactionBase64", "sendTo"], + "if": { + "properties": { "confirm": { "const": true } }, + "required": ["confirm"] + }, + "then": { + "required": ["recentBlockhash", "lastValidBlockHeight"] + }, "example": { "transactionBase64": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", "sendTo": "base", diff --git a/pages/ephemeral-spl-token/api-reference/openapi/transfer.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/transfer.openapi.json index da62c4a..14c2657 100644 --- a/pages/ephemeral-spl-token/api-reference/openapi/transfer.openapi.json +++ b/pages/ephemeral-spl-token/api-reference/openapi/transfer.openapi.json @@ -140,6 +140,7 @@ "visibility": "private", "fromBalance": "base", "toBalance": "base", + "exactOut": false, "initIfMissing": true, "initAtasIfMissing": true, "initVaultIfMissing": false, diff --git a/pages/ephemeral-spl-token/private-payments.mdx b/pages/ephemeral-spl-token/private-payments.mdx index 5ccb89f..6965705 100644 --- a/pages/ephemeral-spl-token/private-payments.mdx +++ b/pages/ephemeral-spl-token/private-payments.mdx @@ -95,7 +95,7 @@ Move tokens into the mint's Global Vault and credit the depositor's ephemeral AT balance private. The response is an unsigned transaction plus a `sendTo` field (`base` or `ephemeral`). Sign it and -submit via [`POST /v1/transaction/send`](/pages/ephemeral-spl-token/api-reference/introduction) +submit via [`POST /v1/transaction/send`](/pages/ephemeral-spl-token/api-reference/transaction-send) or your own RPC. --- From 23ab0efe3be76297109963a9c763f80ebb42fd99 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Wed, 8 Jul 2026 16:27:54 +0530 Subject: [PATCH 3/9] docs: surface the private payments guide in the PER section --- docs.json | 1 + 1 file changed, 1 insertion(+) diff --git a/docs.json b/docs.json index 48f33c7..18cf519 100644 --- a/docs.json +++ b/docs.json @@ -315,6 +315,7 @@ { "group": "Private Payments", "pages": [ + "pages/ephemeral-spl-token/private-payments", "pages/private-ephemeral-rollups-pers/api-reference/per/introduction" ] } From 9799f99ef4fb53f93bb2096c7f4305419dd4a11b Mon Sep 17 00:00:00 2001 From: dhruvja Date: Wed, 8 Jul 2026 16:41:33 +0530 Subject: [PATCH 4/9] docs: link the private payments API reference in the PER section --- docs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs.json b/docs.json index 18cf519..deed53d 100644 --- a/docs.json +++ b/docs.json @@ -315,8 +315,9 @@ { "group": "Private Payments", "pages": [ + "pages/private-ephemeral-rollups-pers/api-reference/per/introduction", "pages/ephemeral-spl-token/private-payments", - "pages/private-ephemeral-rollups-pers/api-reference/per/introduction" + "pages/ephemeral-spl-token/api-reference/introduction" ] } ] From 7357fd427d8bbb973e5aeb13daaaeba61c48a183 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Wed, 8 Jul 2026 16:59:05 +0530 Subject: [PATCH 5/9] docs: tidy PER private payments nav and point API cards to challenge --- docs.json | 3 +-- pages/ephemeral-spl-token/private-payments.mdx | 3 ++- .../api-reference/per/introduction.mdx | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs.json b/docs.json index deed53d..07bf2e6 100644 --- a/docs.json +++ b/docs.json @@ -316,8 +316,7 @@ "group": "Private Payments", "pages": [ "pages/private-ephemeral-rollups-pers/api-reference/per/introduction", - "pages/ephemeral-spl-token/private-payments", - "pages/ephemeral-spl-token/api-reference/introduction" + "pages/ephemeral-spl-token/private-payments" ] } ] diff --git a/pages/ephemeral-spl-token/private-payments.mdx b/pages/ephemeral-spl-token/private-payments.mdx index 6965705..c3bd5f3 100644 --- a/pages/ephemeral-spl-token/private-payments.mdx +++ b/pages/ephemeral-spl-token/private-payments.mdx @@ -1,5 +1,6 @@ --- title: "Private Payments with Ephemeral SPL Tokens" +sidebarTitle: "Guide" description: "Use ephemeral SPL tokens for private deposits, transfers, and withdrawals — private visibility, stealth handles, and queued settlement over the hosted API." --- @@ -31,7 +32,7 @@ unsigned transactions you sign and submit. Endpoints for deposit, transfer, withdraw, balances, stealth pools, and auth. diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx index 156a8e0..5f29de3 100644 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx +++ b/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx @@ -1,5 +1,6 @@ --- title: "Private Payments" +sidebarTitle: "Introduction" description: "Private, compliant onchain payments on MagicBlock — powered by Ephemeral SPL Tokens." --- @@ -35,7 +36,7 @@ section. Deposit, transfer, withdraw, balances, stealth pools, swap, and auth. From 4a437933522bba6b9a0f6126f540028b940ceee6 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Wed, 8 Jul 2026 23:15:02 +0530 Subject: [PATCH 6/9] docs: attach the AI dev skill to the ephemeral SPL token quickstart and cover the eata lifecycle on the skill page --- pages/ephemeral-spl-token/quickstart.mdx | 3 +++ pages/overview/additional-information/ai-dev-skill.mdx | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pages/ephemeral-spl-token/quickstart.mdx b/pages/ephemeral-spl-token/quickstart.mdx index 65ad14e..4714a55 100644 --- a/pages/ephemeral-spl-token/quickstart.mdx +++ b/pages/ephemeral-spl-token/quickstart.mdx @@ -7,6 +7,7 @@ import Software from "/snippets/software.mdx"; import SolanaResources from "/snippets/solana-resources.mdx"; import ProductCards from "/snippets/product-cards.mdx"; import QuickAccessSpl from "/snippets/quick-access-spl.mdx"; +import AIDevSkillCallout from "/snippets/ai-dev-skill-callout.mdx"; import DelegateCode from "/snippets/spl-tokens-code/delegate.mdx"; import TransferCode from "/snippets/spl-tokens-code/transfer.mdx"; @@ -16,6 +17,8 @@ import ProgramCode from "/snippets/spl-tokens-code/program.mdx"; --- + + diff --git a/pages/overview/additional-information/ai-dev-skill.mdx b/pages/overview/additional-information/ai-dev-skill.mdx index 3f508d1..9ab7b7c 100644 --- a/pages/overview/additional-information/ai-dev-skill.mdx +++ b/pages/overview/additional-information/ai-dev-skill.mdx @@ -1,6 +1,6 @@ --- title: AI Dev Skill -description: MagicBlock Ephemeral Rollups development skill for AI coding agents, with MagicBlock-specific patterns for delegation, Magic Actions, cranks, VRF, lamports top-up, commit sponsorship, private payments with swaps, and dual-connection architecture. +description: MagicBlock Ephemeral Rollups development skill for AI coding agents, with MagicBlock-specific patterns for delegation, Magic Actions, cranks, VRF, lamports top-up, commit sponsorship, the Ephemeral SPL Token lifecycle, private payments with swaps, and dual-connection architecture. --- @@ -35,6 +35,7 @@ It is designed for teams working on: - Magic Actions — base-layer instructions chained atomically to an ER commit - Topping up a delegated account's lamports via `lamportsDelegatedTransferIx` - Commit sponsorship and lifting the default 10-commit cap with `magic_fee_vault` +- Ephemeral SPL Token lifecycle — delegate, transfer, undelegate, and withdraw eATAs across the eATA + Global Vault model, via the SDK or the direct `ephemeral-spl-api` path - Private payments — deposits, transfers, withdrawals, and swaps via the Payments API, including the challenge/login bearer-token flow for private reads - Gaming and real-time app development on Solana - Anchor and TypeScript-based integrations @@ -133,6 +134,7 @@ The skill goes beyond a simple prompt template. Its main entrypoint and supporti - Magic Actions: scheduling base-layer instructions inside an ER transaction via `MagicIntentBundleBuilder.add_post_commit_actions(...)` so they execute atomically once the commit is sealed back - Topping up delegated accounts with `lamportsDelegatedTransferIx` (single-use lamports PDA, submitted on base layer, credited on the ER) - Lifting the default 10-commit sponsorship cap by attaching a `magic_fee_vault` PDA and delegated fee payer to the intent bundle +- Ephemeral SPL Token integration — the delegate → transfer → undelegate → withdraw lifecycle, the two integration models (SDK helpers vs. the lower-level `ephemeral-spl-api` program surface), and lifecycle gotchas like `initVaultIfMissing`, one undelegate per transaction, and waiting for commits before withdrawal - Private Ephemeral Rollups (PER) patterns — delegating the permission account alongside the permissioned account so member updates execute on the ER - Private Payments API workflows including the challenge → login → bearer-token flow for reading private balances and the public/private swap modes - VRF and crank setup for real-time apps and games From c796b1b6d22dc6009febad6888f25c364934a6f6 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Fri, 10 Jul 2026 12:54:16 +0530 Subject: [PATCH 7/9] docs: accept ephemeral token vocabulary --- .vale/styles/config/vocabularies/Mintlify/accept.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.vale/styles/config/vocabularies/Mintlify/accept.txt b/.vale/styles/config/vocabularies/Mintlify/accept.txt index cff8b34..c7d8430 100644 --- a/.vale/styles/config/vocabularies/Mintlify/accept.txt +++ b/.vale/styles/config/vocabularies/Mintlify/accept.txt @@ -494,6 +494,9 @@ decompilation deserialization dexes ephemeral +eATA +eATAs +custodied gacha gameplay geofencing From ad3e755bebe941e52d2a73caf4713f4d7a8db230 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Fri, 10 Jul 2026 15:21:35 +0530 Subject: [PATCH 8/9] docs: address CodeRabbit feedback --- .../openapi/stealth-pool.openapi.json | 34 ++++++++++++++++--- .../additional-information/ai-dev-skill.mdx | 2 +- .../api-reference/per/introduction.mdx | 2 +- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json b/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json index 05e4270..f953813 100644 --- a/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json +++ b/pages/ephemeral-spl-token/api-reference/openapi/stealth-pool.openapi.json @@ -69,7 +69,7 @@ "cluster": { "anyOf": [ { "type": "string", "enum": ["mainnet", "devnet", "mainnet-private", "devnet-private"] }, - { "type": "string" } + { "type": "string", "format": "uri" } ], "example": "mainnet", "description": "Optional. Cluster selector or custom http(s) RPC URL." @@ -107,15 +107,33 @@ "stealthPool": { "type": "string", "description": "Derived stealth-pool PDA." }, "setupTransaction": { "type": "object", - "description": "The base-chain setup transaction (same field set as the top-level transaction).", + "description": "The base-chain setup transaction. It uses the same transaction response contract as the top-level transaction; `sendRpcEndpoint` is omitted when `sendTo` is `base`.", "properties": { + "kind": { "type": "string", "enum": ["stealthPool"] }, + "version": { "type": "string", "enum": ["legacy", "v0"] }, "transactionBase64": { "type": "string" }, "sendTo": { "type": "string", "enum": ["base", "ephemeral"] }, + "sendRpcEndpoint": { + "type": "string", + "format": "uri", + "description": "Exact ephemeral RPC endpoint where the signed transaction should be submitted. Present when `sendTo` is `ephemeral`." + }, + "from": { "type": "string", "enum": ["base", "ephemeral"] }, "recentBlockhash": { "type": "string" }, "lastValidBlockHeight": { "type": "integer" }, "instructionCount": { "type": "integer", "minimum": 0 }, - "requiredSigners": { "type": "array", "items": { "type": "string" } } - } + "requiredSigners": { "type": "array", "items": { "type": "string" } }, + "validator": { "type": "string" }, + "fees": { + "type": "object", + "properties": { + "lamports": { "type": "string" }, + "tokens": { "type": "string" } + }, + "required": ["lamports", "tokens"] + } + }, + "required": ["kind", "version", "transactionBase64", "sendTo", "recentBlockhash", "lastValidBlockHeight", "instructionCount", "requiredSigners"] } }, "required": ["kind", "version", "transactionBase64", "sendTo", "recentBlockhash", "lastValidBlockHeight", "instructionCount", "requiredSigners", "stealthPool", "setupTransaction"] @@ -143,7 +161,13 @@ "in": "query", "required": false, "description": "Optional. Cluster selector or custom http(s) RPC URL.", - "schema": { "type": "string", "example": "mainnet" } + "schema": { + "anyOf": [ + { "type": "string", "enum": ["mainnet", "devnet", "mainnet-private", "devnet-private"] }, + { "type": "string", "format": "uri" } + ], + "example": "mainnet" + } } ], "responses": { diff --git a/pages/overview/additional-information/ai-dev-skill.mdx b/pages/overview/additional-information/ai-dev-skill.mdx index 9ab7b7c..002666c 100644 --- a/pages/overview/additional-information/ai-dev-skill.mdx +++ b/pages/overview/additional-information/ai-dev-skill.mdx @@ -35,7 +35,7 @@ It is designed for teams working on: - Magic Actions — base-layer instructions chained atomically to an ER commit - Topping up a delegated account's lamports via `lamportsDelegatedTransferIx` - Commit sponsorship and lifting the default 10-commit cap with `magic_fee_vault` -- Ephemeral SPL Token lifecycle — delegate, transfer, undelegate, and withdraw eATAs across the eATA + Global Vault model, via the SDK or the direct `ephemeral-spl-api` path +- Ephemeral SPL Token lifecycle — delegate, transfer, undelegate, and withdraw eATAs across the eATA + Global Vault model, via the SDK or the direct [Ephemeral SPL Token API](/pages/ephemeral-spl-token/api-reference/introduction) - Private payments — deposits, transfers, withdrawals, and swaps via the Payments API, including the challenge/login bearer-token flow for private reads - Gaming and real-time app development on Solana - Anchor and TypeScript-based integrations diff --git a/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx b/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx index 5f29de3..3ea7f3f 100644 --- a/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx +++ b/pages/private-ephemeral-rollups-pers/api-reference/per/introduction.mdx @@ -36,7 +36,7 @@ section. Deposit, transfer, withdraw, balances, stealth pools, swap, and auth. From ad09003175a4d435972a447993474823a112f279 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Fri, 10 Jul 2026 15:26:45 +0530 Subject: [PATCH 9/9] docs: clarify SPL token navigation --- docs.json | 64 +++++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/docs.json b/docs.json index 4c9e5d4..5bf11a7 100644 --- a/docs.json +++ b/docs.json @@ -323,7 +323,35 @@ ] }, { - "tab": "Ephemeral SPL Token", + "tab": "Solana VRF", + "icon": "dice", + "groups": [ + { + "group": "How-to-Guide", + "pages": [ + "pages/verifiable-randomness-functions-vrfs/how-to-guide/quickstart", + "pages/verifiable-randomness-functions-vrfs/how-to-guide/best-practices" + ] + }, + { + "group": "Reference Material", + "pages": [ + "pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf", + "pages/verifiable-randomness-functions-vrfs/introduction/pricing", + { + "group": "How it Works", + "pages": [ + "pages/verifiable-randomness-functions-vrfs/introduction/technical-details", + "pages/verifiable-randomness-functions-vrfs/introduction/security", + "pages/verifiable-randomness-functions-vrfs/introduction/faq" + ] + } + ] + } + ] + }, + { + "tab": "SPL Tokens on ER", "icon": "coins", "groups": [ { @@ -381,34 +409,6 @@ } ] }, - { - "tab": "Solana VRF", - "icon": "dice", - "groups": [ - { - "group": "How-to-Guide", - "pages": [ - "pages/verifiable-randomness-functions-vrfs/how-to-guide/quickstart", - "pages/verifiable-randomness-functions-vrfs/how-to-guide/best-practices" - ] - }, - { - "group": "Reference Material", - "pages": [ - "pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf", - "pages/verifiable-randomness-functions-vrfs/introduction/pricing", - { - "group": "How it Works", - "pages": [ - "pages/verifiable-randomness-functions-vrfs/introduction/technical-details", - "pages/verifiable-randomness-functions-vrfs/introduction/security", - "pages/verifiable-randomness-functions-vrfs/introduction/faq" - ] - } - ] - } - ] - }, { "tab": "Templates", "icon": "book", @@ -443,8 +443,8 @@ { "tab": "概览", "pages": ["cn/pages/overview/products", { "group": "更多信息", "pages": ["cn/pages/overview/additional-information/whitepaper", "cn/pages/overview/additional-information/security-and-audits", "cn/pages/overview/additional-information/pricing", "cn/pages/overview/additional-information/system-status", "cn/pages/overview/additional-information/request-for-products", "cn/pages/overview/additional-information/ai-dev-skill"] }] }, { "tab": "Ephemeral Rollup", "icon": "bolt", "groups": [{ "group": "操作指南", "pages": ["cn/pages/ephemeral-rollups-ers/how-to-guide/quickstart", "cn/pages/ephemeral-rollups-ers/how-to-guide/local-development", "cn/pages/ephemeral-rollups-ers/how-to-guide/anchor", { "group": "Rust 示例", "pages": ["cn/pages/ephemeral-rollups-ers/how-to-guide/rust-program", "cn/pages/ephemeral-rollups-ers/how-to-guide/rust-tests"] }] }, { "group": "参考资料", "pages": ["cn/pages/ephemeral-rollups-ers/introduction/why", { "group": "工作原理", "pages": ["cn/pages/ephemeral-rollups-ers/introduction/ephemeral-rollup", "cn/pages/ephemeral-rollups-ers/introduction/ephemeral-accounts", "cn/pages/ephemeral-rollups-ers/introduction/magic-router", { "group": "Magic Actions", "pages": ["cn/pages/ephemeral-rollups-ers/magic-actions/overview", "cn/pages/ephemeral-rollups-ers/magic-actions/implementation", "cn/pages/ephemeral-rollups-ers/magic-actions/client", "cn/pages/ephemeral-rollups-ers/magic-actions/troubleshooting"] }] }, "cn/pages/ephemeral-rollups-ers/introduction/faq"] }, { "group": "ROUTER API", "pages": ["cn/pages/ephemeral-rollups-ers/api-reference/er/introduction", "cn/pages/ephemeral-rollups-ers/api-reference/er/getRoutes", "cn/pages/ephemeral-rollups-ers/api-reference/er/getIdentity", "cn/pages/ephemeral-rollups-ers/api-reference/er/getBlockhashForAccounts", "cn/pages/ephemeral-rollups-ers/api-reference/er/getSignatureStatuses", "cn/pages/ephemeral-rollups-ers/api-reference/er/getAccountInfo", "cn/pages/ephemeral-rollups-ers/api-reference/er/getDelegationStatus"] }, { "group": "RPC API", "pages": ["cn/pages/ephemeral-rollups-ers/api-reference/rpc/introduction", { "group": "方法", "expanded": false, "pages": ["cn/pages/ephemeral-rollups-ers/api-reference/rpc/getAccountInfo", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getBalance", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getBlock", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getBlockCommitment", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getBlockHeight", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getBlocks", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getBlocksWithLimit", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getBlockTime", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getFirstAvailableBlock", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getGenesisHash", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getHealth", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getIdentity", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getLargestAccounts", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getLatestBlockhash", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getLeaderSchedule", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getMinimumBalanceForRentExemption", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getMultipleAccounts", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getProgramAccounts", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getRecentPerformanceSamples", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getSignaturesForAddress", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getSignatureStatuses", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getSlot", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenAccountBalance", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenAccountsByDelegate", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenAccountsByOwner", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenLargestAccounts", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenSupply", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getTransaction", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getTransactionCount", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/getVersion", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/isBlockhashValid", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/sendTransaction", "cn/pages/ephemeral-rollups-ers/api-reference/rpc/simulateTransaction"] }] }] }, { "tab": "Private Ephemeral Rollup", "icon": "shield-check", "groups": [{ "group": "操作指南", "pages": ["cn/pages/private-ephemeral-rollups-pers/how-to-guide/quickstart", "cn/pages/private-ephemeral-rollups-pers/how-to-guide/access-control"] }, { "group": "参考资料", "pages": ["cn/pages/private-ephemeral-rollups-pers/introduction/onchain-privacy", "cn/pages/private-ephemeral-rollups-pers/introduction/authorization", "cn/pages/private-ephemeral-rollups-pers/introduction/compliance-framework"] }, { "group": "Private Payments", "pages": ["cn/pages/private-ephemeral-rollups-pers/api-reference/per/introduction", "pages/ephemeral-spl-token/private-payments"] }] }, - { "tab": "Ephemeral SPL Token", "icon": "coins", "groups": [{ "group": "操作指南", "pages": ["pages/ephemeral-spl-token/quickstart", "pages/ephemeral-spl-token/smart-contract-integration", "pages/ephemeral-spl-token/private-payments"] }, { "group": "参考资料", "pages": ["pages/ephemeral-spl-token/overview"] }, { "group": "API Reference", "pages": ["pages/ephemeral-spl-token/api-reference/introduction", { "group": "Core Token API", "pages": ["pages/ephemeral-spl-token/api-reference/deposit", "pages/ephemeral-spl-token/api-reference/transfer", "pages/ephemeral-spl-token/api-reference/withdraw", "pages/ephemeral-spl-token/api-reference/balance", "pages/ephemeral-spl-token/api-reference/initialize-mint", "pages/ephemeral-spl-token/api-reference/is-mint-initialized", "pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata", "pages/ephemeral-spl-token/api-reference/transaction-send"] }, { "group": "Private Payments", "pages": ["pages/ephemeral-spl-token/api-reference/challenge", "pages/ephemeral-spl-token/api-reference/login", "pages/ephemeral-spl-token/api-reference/private-balance", "pages/ephemeral-spl-token/api-reference/stealth-pool", "pages/ephemeral-spl-token/api-reference/stealth-pool-status", "pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank"] }, { "group": "Swap", "pages": ["pages/ephemeral-spl-token/api-reference/quote", "pages/ephemeral-spl-token/api-reference/swap"] }, "pages/ephemeral-spl-token/api-reference/health", "pages/ephemeral-spl-token/api-reference/mcp"] }] }, { "tab": "Solana VRF", "icon": "dice", "groups": [{ "group": "操作指南", "pages": ["cn/pages/verifiable-randomness-functions-vrfs/how-to-guide/quickstart", "cn/pages/verifiable-randomness-functions-vrfs/how-to-guide/best-practices"] }, { "group": "参考资料", "pages": ["cn/pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf", "cn/pages/verifiable-randomness-functions-vrfs/introduction/pricing", { "group": "工作原理", "pages": ["cn/pages/verifiable-randomness-functions-vrfs/introduction/technical-details", "cn/pages/verifiable-randomness-functions-vrfs/introduction/security", "cn/pages/verifiable-randomness-functions-vrfs/introduction/faq"] }] }] }, + { "tab": "SPL Tokens on ER", "icon": "coins", "groups": [{ "group": "操作指南", "pages": ["pages/ephemeral-spl-token/quickstart", "pages/ephemeral-spl-token/smart-contract-integration", "pages/ephemeral-spl-token/private-payments"] }, { "group": "参考资料", "pages": ["pages/ephemeral-spl-token/overview"] }, { "group": "API Reference", "pages": ["pages/ephemeral-spl-token/api-reference/introduction", { "group": "Core Token API", "pages": ["pages/ephemeral-spl-token/api-reference/deposit", "pages/ephemeral-spl-token/api-reference/transfer", "pages/ephemeral-spl-token/api-reference/withdraw", "pages/ephemeral-spl-token/api-reference/balance", "pages/ephemeral-spl-token/api-reference/initialize-mint", "pages/ephemeral-spl-token/api-reference/is-mint-initialized", "pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata", "pages/ephemeral-spl-token/api-reference/transaction-send"] }, { "group": "Private Payments", "pages": ["pages/ephemeral-spl-token/api-reference/challenge", "pages/ephemeral-spl-token/api-reference/login", "pages/ephemeral-spl-token/api-reference/private-balance", "pages/ephemeral-spl-token/api-reference/stealth-pool", "pages/ephemeral-spl-token/api-reference/stealth-pool-status", "pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank"] }, { "group": "Swap", "pages": ["pages/ephemeral-spl-token/api-reference/quote", "pages/ephemeral-spl-token/api-reference/swap"] }, "pages/ephemeral-spl-token/api-reference/health", "pages/ephemeral-spl-token/api-reference/mcp"] }] }, { "tab": "模板", "icon": "book", "pages": ["cn/pages/templates/private-payments", "cn/pages/templates/rock-paper-scissors", "cn/pages/templates/real-time-price-feed", "cn/pages/templates/gachapon", "cn/pages/templates/random-character-generator", "cn/pages/templates/onchain-dice", "cn/pages/templates/counter"] }, { "tab": "工具", "icon": "screwdriver-wrench", "groups": [{ "group": "工具", "pages": ["cn/pages/tools/introduction"] }, { "group": "Wallets & Onramp", "pages": ["cn/pages/tools/wallets-and-onramp/overview"] }, { "group": "Session Keys", "pages": ["cn/pages/tools/session-keys/introduction", "cn/pages/tools/session-keys/how-do-session-keys-work", "cn/pages/tools/session-keys/security", { "group": "开始使用", "pages": ["cn/pages/tools/session-keys/integrating-sessions-in-your-program", "cn/pages/tools/session-keys/installation", "cn/pages/tools/session-keys/session-provider-and-context", "cn/pages/tools/session-keys/usage-examples", "cn/pages/tools/session-keys/use-sessionkey-manager"] }] }, { "group": "Oracles", "pages": ["cn/pages/tools/oracle/introduction", "cn/pages/tools/oracle/implementation"] }, { "group": "Cranks", "pages": ["cn/pages/tools/crank/introduction", "cn/pages/tools/crank/implementation"] }, { "group": "Solana Unity SDK", "pages": ["cn/pages/tools/solana-unity-sdk/overview", "cn/pages/tools/solana-unity-sdk/contribution-guide", { "group": "开始使用", "pages": ["cn/pages/tools/solana-unity-sdk/getting-started/installation", "cn/pages/tools/solana-unity-sdk/getting-started/configuration", "cn/pages/tools/solana-unity-sdk/getting-started/sample-scene"] }, { "group": "核心概念", "pages": ["cn/pages/tools/solana-unity-sdk/core-concepts/associated-token-account", "cn/pages/tools/solana-unity-sdk/core-concepts/transfer-token", "cn/pages/tools/solana-unity-sdk/core-concepts/transaction-builder", "cn/pages/tools/solana-unity-sdk/core-concepts/staking", "cn/pages/tools/solana-unity-sdk/core-concepts/add-signature"] }, { "group": "指南", "pages": ["cn/pages/tools/solana-unity-sdk/guides/mint-an-nft", "cn/pages/tools/solana-unity-sdk/guides/host-your-game", "cn/pages/tools/solana-unity-sdk/guides/publishing-a-game", "cn/pages/tools/solana-unity-sdk/guides/dex-integration", "cn/pages/tools/solana-unity-sdk/guides/jupiter", "cn/pages/tools/solana-unity-sdk/guides/additional-examples"] }] }, { "group": "On-chain identity", "pages": ["cn/pages/tools/open-source-programs/SOAR"] }] } ] @@ -455,8 +455,8 @@ { "tab": "概要", "pages": ["jp/pages/overview/products", { "group": "追加情報", "pages": ["jp/pages/overview/additional-information/whitepaper", "jp/pages/overview/additional-information/security-and-audits", "jp/pages/overview/additional-information/pricing", "jp/pages/overview/additional-information/system-status", "jp/pages/overview/additional-information/request-for-products", "jp/pages/overview/additional-information/ai-dev-skill"] }] }, { "tab": "Ephemeral Rollup", "icon": "bolt", "groups": [{ "group": "ガイド", "pages": ["jp/pages/ephemeral-rollups-ers/how-to-guide/quickstart", "jp/pages/ephemeral-rollups-ers/how-to-guide/local-development", "jp/pages/ephemeral-rollups-ers/how-to-guide/anchor", { "group": "Rust 例", "pages": ["jp/pages/ephemeral-rollups-ers/how-to-guide/rust-program", "jp/pages/ephemeral-rollups-ers/how-to-guide/rust-tests"] }] }, { "group": "参考資料", "pages": ["jp/pages/ephemeral-rollups-ers/introduction/why", { "group": "仕組み", "pages": ["jp/pages/ephemeral-rollups-ers/introduction/ephemeral-rollup", "jp/pages/ephemeral-rollups-ers/introduction/ephemeral-accounts", "jp/pages/ephemeral-rollups-ers/introduction/magic-router", { "group": "Magic Actions", "pages": ["jp/pages/ephemeral-rollups-ers/magic-actions/overview", "jp/pages/ephemeral-rollups-ers/magic-actions/implementation", "jp/pages/ephemeral-rollups-ers/magic-actions/client", "jp/pages/ephemeral-rollups-ers/magic-actions/troubleshooting"] }] }, "jp/pages/ephemeral-rollups-ers/introduction/faq"] }, { "group": "ROUTER API", "pages": ["jp/pages/ephemeral-rollups-ers/api-reference/er/introduction", "jp/pages/ephemeral-rollups-ers/api-reference/er/getRoutes", "jp/pages/ephemeral-rollups-ers/api-reference/er/getIdentity", "jp/pages/ephemeral-rollups-ers/api-reference/er/getBlockhashForAccounts", "jp/pages/ephemeral-rollups-ers/api-reference/er/getSignatureStatuses", "jp/pages/ephemeral-rollups-ers/api-reference/er/getAccountInfo", "jp/pages/ephemeral-rollups-ers/api-reference/er/getDelegationStatus"] }, { "group": "RPC API", "pages": ["jp/pages/ephemeral-rollups-ers/api-reference/rpc/introduction", { "group": "メソッド", "expanded": false, "pages": ["jp/pages/ephemeral-rollups-ers/api-reference/rpc/getAccountInfo", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getBalance", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getBlock", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getBlockCommitment", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getBlockHeight", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getBlocks", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getBlocksWithLimit", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getBlockTime", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getFirstAvailableBlock", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getGenesisHash", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getHealth", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getIdentity", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getLargestAccounts", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getLatestBlockhash", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getLeaderSchedule", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getMinimumBalanceForRentExemption", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getMultipleAccounts", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getProgramAccounts", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getRecentPerformanceSamples", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getSignaturesForAddress", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getSignatureStatuses", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getSlot", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenAccountBalance", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenAccountsByDelegate", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenAccountsByOwner", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenLargestAccounts", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenSupply", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getTransaction", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getTransactionCount", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/getVersion", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/isBlockhashValid", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/sendTransaction", "jp/pages/ephemeral-rollups-ers/api-reference/rpc/simulateTransaction"] }] }] }, { "tab": "Private Ephemeral Rollup", "icon": "shield-check", "groups": [{ "group": "ガイド", "pages": ["jp/pages/private-ephemeral-rollups-pers/how-to-guide/quickstart", "jp/pages/private-ephemeral-rollups-pers/how-to-guide/access-control"] }, { "group": "参考資料", "pages": ["jp/pages/private-ephemeral-rollups-pers/introduction/onchain-privacy", "jp/pages/private-ephemeral-rollups-pers/introduction/authorization", "jp/pages/private-ephemeral-rollups-pers/introduction/compliance-framework"] }, { "group": "Private Payments", "pages": ["jp/pages/private-ephemeral-rollups-pers/api-reference/per/introduction", "pages/ephemeral-spl-token/private-payments"] }] }, - { "tab": "Ephemeral SPL Token", "icon": "coins", "groups": [{ "group": "ガイド", "pages": ["pages/ephemeral-spl-token/quickstart", "pages/ephemeral-spl-token/smart-contract-integration", "pages/ephemeral-spl-token/private-payments"] }, { "group": "参考資料", "pages": ["pages/ephemeral-spl-token/overview"] }, { "group": "API Reference", "pages": ["pages/ephemeral-spl-token/api-reference/introduction", { "group": "Core Token API", "pages": ["pages/ephemeral-spl-token/api-reference/deposit", "pages/ephemeral-spl-token/api-reference/transfer", "pages/ephemeral-spl-token/api-reference/withdraw", "pages/ephemeral-spl-token/api-reference/balance", "pages/ephemeral-spl-token/api-reference/initialize-mint", "pages/ephemeral-spl-token/api-reference/is-mint-initialized", "pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata", "pages/ephemeral-spl-token/api-reference/transaction-send"] }, { "group": "Private Payments", "pages": ["pages/ephemeral-spl-token/api-reference/challenge", "pages/ephemeral-spl-token/api-reference/login", "pages/ephemeral-spl-token/api-reference/private-balance", "pages/ephemeral-spl-token/api-reference/stealth-pool", "pages/ephemeral-spl-token/api-reference/stealth-pool-status", "pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank"] }, { "group": "Swap", "pages": ["pages/ephemeral-spl-token/api-reference/quote", "pages/ephemeral-spl-token/api-reference/swap"] }, "pages/ephemeral-spl-token/api-reference/health", "pages/ephemeral-spl-token/api-reference/mcp"] }] }, { "tab": "Solana VRF", "icon": "dice", "groups": [{ "group": "ガイド", "pages": ["jp/pages/verifiable-randomness-functions-vrfs/how-to-guide/quickstart", "jp/pages/verifiable-randomness-functions-vrfs/how-to-guide/best-practices"] }, { "group": "参考資料", "pages": ["jp/pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf", "jp/pages/verifiable-randomness-functions-vrfs/introduction/pricing", { "group": "仕組み", "pages": ["jp/pages/verifiable-randomness-functions-vrfs/introduction/technical-details", "jp/pages/verifiable-randomness-functions-vrfs/introduction/security", "jp/pages/verifiable-randomness-functions-vrfs/introduction/faq"] }] }] }, + { "tab": "SPL Tokens on ER", "icon": "coins", "groups": [{ "group": "ガイド", "pages": ["pages/ephemeral-spl-token/quickstart", "pages/ephemeral-spl-token/smart-contract-integration", "pages/ephemeral-spl-token/private-payments"] }, { "group": "参考資料", "pages": ["pages/ephemeral-spl-token/overview"] }, { "group": "API Reference", "pages": ["pages/ephemeral-spl-token/api-reference/introduction", { "group": "Core Token API", "pages": ["pages/ephemeral-spl-token/api-reference/deposit", "pages/ephemeral-spl-token/api-reference/transfer", "pages/ephemeral-spl-token/api-reference/withdraw", "pages/ephemeral-spl-token/api-reference/balance", "pages/ephemeral-spl-token/api-reference/initialize-mint", "pages/ephemeral-spl-token/api-reference/is-mint-initialized", "pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata", "pages/ephemeral-spl-token/api-reference/transaction-send"] }, { "group": "Private Payments", "pages": ["pages/ephemeral-spl-token/api-reference/challenge", "pages/ephemeral-spl-token/api-reference/login", "pages/ephemeral-spl-token/api-reference/private-balance", "pages/ephemeral-spl-token/api-reference/stealth-pool", "pages/ephemeral-spl-token/api-reference/stealth-pool-status", "pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank"] }, { "group": "Swap", "pages": ["pages/ephemeral-spl-token/api-reference/quote", "pages/ephemeral-spl-token/api-reference/swap"] }, "pages/ephemeral-spl-token/api-reference/health", "pages/ephemeral-spl-token/api-reference/mcp"] }] }, { "tab": "テンプレート", "icon": "book", "pages": ["jp/pages/templates/private-payments", "jp/pages/templates/rock-paper-scissors", "jp/pages/templates/real-time-price-feed", "jp/pages/templates/gachapon", "jp/pages/templates/random-character-generator", "jp/pages/templates/onchain-dice", "jp/pages/templates/counter"] }, { "tab": "ツール", "icon": "screwdriver-wrench", "groups": [{ "group": "ツール", "pages": ["jp/pages/tools/introduction"] }, { "group": "Wallets & Onramp", "pages": ["jp/pages/tools/wallets-and-onramp/overview"] }, { "group": "Session Keys", "pages": ["jp/pages/tools/session-keys/introduction", "jp/pages/tools/session-keys/how-do-session-keys-work", "jp/pages/tools/session-keys/security", { "group": "スタートガイド", "pages": ["jp/pages/tools/session-keys/integrating-sessions-in-your-program", "jp/pages/tools/session-keys/installation", "jp/pages/tools/session-keys/session-provider-and-context", "jp/pages/tools/session-keys/usage-examples", "jp/pages/tools/session-keys/use-sessionkey-manager"] }] }, { "group": "Oracles", "pages": ["jp/pages/tools/oracle/introduction", "jp/pages/tools/oracle/implementation"] }, { "group": "Cranks", "pages": ["jp/pages/tools/crank/introduction", "jp/pages/tools/crank/implementation"] }, { "group": "Solana Unity SDK", "pages": ["jp/pages/tools/solana-unity-sdk/overview", "jp/pages/tools/solana-unity-sdk/contribution-guide", { "group": "スタートガイド", "pages": ["jp/pages/tools/solana-unity-sdk/getting-started/installation", "jp/pages/tools/solana-unity-sdk/getting-started/configuration", "jp/pages/tools/solana-unity-sdk/getting-started/sample-scene"] }, { "group": "コアコンセプト", "pages": ["jp/pages/tools/solana-unity-sdk/core-concepts/associated-token-account", "jp/pages/tools/solana-unity-sdk/core-concepts/transfer-token", "jp/pages/tools/solana-unity-sdk/core-concepts/transaction-builder", "jp/pages/tools/solana-unity-sdk/core-concepts/staking", "jp/pages/tools/solana-unity-sdk/core-concepts/add-signature"] }, { "group": "ガイド", "pages": ["jp/pages/tools/solana-unity-sdk/guides/mint-an-nft", "jp/pages/tools/solana-unity-sdk/guides/host-your-game", "jp/pages/tools/solana-unity-sdk/guides/publishing-a-game", "jp/pages/tools/solana-unity-sdk/guides/dex-integration", "jp/pages/tools/solana-unity-sdk/guides/jupiter", "jp/pages/tools/solana-unity-sdk/guides/additional-examples"] }] }, { "group": "On-chain identity", "pages": ["jp/pages/tools/open-source-programs/SOAR"] }] } ] @@ -467,8 +467,8 @@ { "tab": "개요", "pages": ["ko/pages/overview/products", { "group": "추가 정보", "pages": ["ko/pages/overview/additional-information/whitepaper", "ko/pages/overview/additional-information/security-and-audits", "ko/pages/overview/additional-information/pricing", "ko/pages/overview/additional-information/system-status", "ko/pages/overview/additional-information/request-for-products", "ko/pages/overview/additional-information/ai-dev-skill"] }] }, { "tab": "Ephemeral Rollup", "icon": "bolt", "groups": [{ "group": "가이드", "pages": ["ko/pages/ephemeral-rollups-ers/how-to-guide/quickstart", "ko/pages/ephemeral-rollups-ers/how-to-guide/local-development", "ko/pages/ephemeral-rollups-ers/how-to-guide/anchor", { "group": "Rust 예제", "pages": ["ko/pages/ephemeral-rollups-ers/how-to-guide/rust-program", "ko/pages/ephemeral-rollups-ers/how-to-guide/rust-tests"] }] }, { "group": "참고 자료", "pages": ["ko/pages/ephemeral-rollups-ers/introduction/why", { "group": "작동 방식", "pages": ["ko/pages/ephemeral-rollups-ers/introduction/ephemeral-rollup", "ko/pages/ephemeral-rollups-ers/introduction/ephemeral-accounts", "ko/pages/ephemeral-rollups-ers/introduction/magic-router", { "group": "Magic Actions", "pages": ["ko/pages/ephemeral-rollups-ers/magic-actions/overview", "ko/pages/ephemeral-rollups-ers/magic-actions/implementation", "ko/pages/ephemeral-rollups-ers/magic-actions/client", "ko/pages/ephemeral-rollups-ers/magic-actions/troubleshooting"] }] }, "ko/pages/ephemeral-rollups-ers/introduction/faq"] }, { "group": "ROUTER API", "pages": ["ko/pages/ephemeral-rollups-ers/api-reference/er/introduction", "ko/pages/ephemeral-rollups-ers/api-reference/er/getRoutes", "ko/pages/ephemeral-rollups-ers/api-reference/er/getIdentity", "ko/pages/ephemeral-rollups-ers/api-reference/er/getBlockhashForAccounts", "ko/pages/ephemeral-rollups-ers/api-reference/er/getSignatureStatuses", "ko/pages/ephemeral-rollups-ers/api-reference/er/getAccountInfo", "ko/pages/ephemeral-rollups-ers/api-reference/er/getDelegationStatus"] }, { "group": "RPC API", "pages": ["ko/pages/ephemeral-rollups-ers/api-reference/rpc/introduction", { "group": "메서드", "expanded": false, "pages": ["ko/pages/ephemeral-rollups-ers/api-reference/rpc/getAccountInfo", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getBalance", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getBlock", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getBlockCommitment", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getBlockHeight", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getBlocks", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getBlocksWithLimit", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getBlockTime", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getFirstAvailableBlock", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getGenesisHash", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getHealth", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getIdentity", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getLargestAccounts", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getLatestBlockhash", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getLeaderSchedule", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getMinimumBalanceForRentExemption", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getMultipleAccounts", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getProgramAccounts", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getRecentPerformanceSamples", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getSignaturesForAddress", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getSignatureStatuses", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getSlot", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenAccountBalance", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenAccountsByDelegate", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenAccountsByOwner", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenLargestAccounts", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getTokenSupply", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getTransaction", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getTransactionCount", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/getVersion", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/isBlockhashValid", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/sendTransaction", "ko/pages/ephemeral-rollups-ers/api-reference/rpc/simulateTransaction"] }] }] }, { "tab": "Private Ephemeral Rollup", "icon": "shield-check", "groups": [{ "group": "가이드", "pages": ["ko/pages/private-ephemeral-rollups-pers/how-to-guide/quickstart", "ko/pages/private-ephemeral-rollups-pers/how-to-guide/access-control"] }, { "group": "참고 자료", "pages": ["ko/pages/private-ephemeral-rollups-pers/introduction/onchain-privacy", "ko/pages/private-ephemeral-rollups-pers/introduction/authorization", "ko/pages/private-ephemeral-rollups-pers/introduction/compliance-framework"] }, { "group": "Private Payments", "pages": ["ko/pages/private-ephemeral-rollups-pers/api-reference/per/introduction", "pages/ephemeral-spl-token/private-payments"] }] }, - { "tab": "Ephemeral SPL Token", "icon": "coins", "groups": [{ "group": "가이드", "pages": ["pages/ephemeral-spl-token/quickstart", "pages/ephemeral-spl-token/smart-contract-integration", "pages/ephemeral-spl-token/private-payments"] }, { "group": "참고 자료", "pages": ["pages/ephemeral-spl-token/overview"] }, { "group": "API Reference", "pages": ["pages/ephemeral-spl-token/api-reference/introduction", { "group": "Core Token API", "pages": ["pages/ephemeral-spl-token/api-reference/deposit", "pages/ephemeral-spl-token/api-reference/transfer", "pages/ephemeral-spl-token/api-reference/withdraw", "pages/ephemeral-spl-token/api-reference/balance", "pages/ephemeral-spl-token/api-reference/initialize-mint", "pages/ephemeral-spl-token/api-reference/is-mint-initialized", "pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata", "pages/ephemeral-spl-token/api-reference/transaction-send"] }, { "group": "Private Payments", "pages": ["pages/ephemeral-spl-token/api-reference/challenge", "pages/ephemeral-spl-token/api-reference/login", "pages/ephemeral-spl-token/api-reference/private-balance", "pages/ephemeral-spl-token/api-reference/stealth-pool", "pages/ephemeral-spl-token/api-reference/stealth-pool-status", "pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank"] }, { "group": "Swap", "pages": ["pages/ephemeral-spl-token/api-reference/quote", "pages/ephemeral-spl-token/api-reference/swap"] }, "pages/ephemeral-spl-token/api-reference/health", "pages/ephemeral-spl-token/api-reference/mcp"] }] }, { "tab": "Solana VRF", "icon": "dice", "groups": [{ "group": "가이드", "pages": ["ko/pages/verifiable-randomness-functions-vrfs/how-to-guide/quickstart", "ko/pages/verifiable-randomness-functions-vrfs/how-to-guide/best-practices"] }, { "group": "참고 자료", "pages": ["ko/pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf", "ko/pages/verifiable-randomness-functions-vrfs/introduction/pricing", { "group": "작동 방식", "pages": ["ko/pages/verifiable-randomness-functions-vrfs/introduction/technical-details", "ko/pages/verifiable-randomness-functions-vrfs/introduction/security", "ko/pages/verifiable-randomness-functions-vrfs/introduction/faq"] }] }] }, + { "tab": "SPL Tokens on ER", "icon": "coins", "groups": [{ "group": "가이드", "pages": ["pages/ephemeral-spl-token/quickstart", "pages/ephemeral-spl-token/smart-contract-integration", "pages/ephemeral-spl-token/private-payments"] }, { "group": "참고 자료", "pages": ["pages/ephemeral-spl-token/overview"] }, { "group": "API Reference", "pages": ["pages/ephemeral-spl-token/api-reference/introduction", { "group": "Core Token API", "pages": ["pages/ephemeral-spl-token/api-reference/deposit", "pages/ephemeral-spl-token/api-reference/transfer", "pages/ephemeral-spl-token/api-reference/withdraw", "pages/ephemeral-spl-token/api-reference/balance", "pages/ephemeral-spl-token/api-reference/initialize-mint", "pages/ephemeral-spl-token/api-reference/is-mint-initialized", "pages/ephemeral-spl-token/api-reference/undelegate-ephemeral-ata", "pages/ephemeral-spl-token/api-reference/transaction-send"] }, { "group": "Private Payments", "pages": ["pages/ephemeral-spl-token/api-reference/challenge", "pages/ephemeral-spl-token/api-reference/login", "pages/ephemeral-spl-token/api-reference/private-balance", "pages/ephemeral-spl-token/api-reference/stealth-pool", "pages/ephemeral-spl-token/api-reference/stealth-pool-status", "pages/ephemeral-spl-token/api-reference/transfer-queue-ensure-crank"] }, { "group": "Swap", "pages": ["pages/ephemeral-spl-token/api-reference/quote", "pages/ephemeral-spl-token/api-reference/swap"] }, "pages/ephemeral-spl-token/api-reference/health", "pages/ephemeral-spl-token/api-reference/mcp"] }] }, { "tab": "템플릿", "icon": "book", "pages": ["ko/pages/templates/private-payments", "ko/pages/templates/rock-paper-scissors", "ko/pages/templates/real-time-price-feed", "ko/pages/templates/gachapon", "ko/pages/templates/random-character-generator", "ko/pages/templates/onchain-dice", "ko/pages/templates/counter"] }, { "tab": "도구", "icon": "screwdriver-wrench", "groups": [{ "group": "도구", "pages": ["ko/pages/tools/introduction"] }, { "group": "Wallets & Onramp", "pages": ["ko/pages/tools/wallets-and-onramp/overview"] }, { "group": "Session Keys", "pages": ["ko/pages/tools/session-keys/introduction", "ko/pages/tools/session-keys/how-do-session-keys-work", "ko/pages/tools/session-keys/security", { "group": "시작하기", "pages": ["ko/pages/tools/session-keys/integrating-sessions-in-your-program", "ko/pages/tools/session-keys/installation", "ko/pages/tools/session-keys/session-provider-and-context", "ko/pages/tools/session-keys/usage-examples", "ko/pages/tools/session-keys/use-sessionkey-manager"] }] }, { "group": "Oracles", "pages": ["ko/pages/tools/oracle/introduction", "ko/pages/tools/oracle/implementation"] }, { "group": "Cranks", "pages": ["ko/pages/tools/crank/introduction", "ko/pages/tools/crank/implementation"] }, { "group": "Solana Unity SDK", "pages": ["ko/pages/tools/solana-unity-sdk/overview", "ko/pages/tools/solana-unity-sdk/contribution-guide", { "group": "시작하기", "pages": ["ko/pages/tools/solana-unity-sdk/getting-started/installation", "ko/pages/tools/solana-unity-sdk/getting-started/configuration", "ko/pages/tools/solana-unity-sdk/getting-started/sample-scene"] }, { "group": "핵심 개념", "pages": ["ko/pages/tools/solana-unity-sdk/core-concepts/associated-token-account", "ko/pages/tools/solana-unity-sdk/core-concepts/transfer-token", "ko/pages/tools/solana-unity-sdk/core-concepts/transaction-builder", "ko/pages/tools/solana-unity-sdk/core-concepts/staking", "ko/pages/tools/solana-unity-sdk/core-concepts/add-signature"] }, { "group": "가이드", "pages": ["ko/pages/tools/solana-unity-sdk/guides/mint-an-nft", "ko/pages/tools/solana-unity-sdk/guides/host-your-game", "ko/pages/tools/solana-unity-sdk/guides/publishing-a-game", "ko/pages/tools/solana-unity-sdk/guides/dex-integration", "ko/pages/tools/solana-unity-sdk/guides/jupiter", "ko/pages/tools/solana-unity-sdk/guides/additional-examples"] }] }, { "group": "On-chain identity", "pages": ["ko/pages/tools/open-source-programs/SOAR"] }] } ]