diff --git a/build-on-celo/build-on-minipay/code-library.mdx b/build-on-celo/build-on-minipay/code-library.mdx deleted file mode 100644 index ffc595ab89..0000000000 --- a/build-on-celo/build-on-minipay/code-library.mdx +++ /dev/null @@ -1,412 +0,0 @@ ---- -title: MiniPay Code Library -description: Snippets of code that can be used to implement flows inside MiniPay -sidebarTitle: "Code Library" ---- - - - Make sure you are using Typescript v5 or above and Viem v2 or above. - - -## Get the connected user's address without any Library - -```js -// The code must run in a browser environment and not in node environment -if (window && window.ethereum) { - // User has a injected wallet - - if (window.ethereum.isMiniPay) { - // User is using Minipay - - // Requesting account addresses - let accounts = await window.ethereum.request({ - method: "eth_requestAccounts", - params: [], - }); - - // Injected wallets inject all available addresses, - // to comply with API Minipay injects one address but in the form of array - console.log(accounts[0]); - } - - // User is not using MiniPay -} - -// User does not have a injected wallet -``` - -To use the code snippets below, install the following packages: - -{/* prettier-ignore-start */} - - - ```bash yarn - yarn add @celo/abis @celo/identity viem@2 - ``` - - - ```bash npm - npm install @celo/abis @celo/identity viem@2 - ``` - - - -## Check USDm Balance of an address - -```js -import { getContract, formatEther, createPublicClient, http } from "viem"; -import { celo } from "viem/chains"; -import { stableTokenABI } from "@celo/abis"; - -// USDm address on Celo mainnet -const STABLE_TOKEN_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; - -async function checkUSDmBalance(publicClient, address) { - const StableTokenContract = getContract({ - abi: stableTokenABI, - address: STABLE_TOKEN_ADDRESS, - client: publicClient, - }); - - const balanceInBigNumber = await StableTokenContract.read.balanceOf([ - address, - ]); - - const balanceInWei = balanceInBigNumber.toString(); - const balanceInEthers = formatEther(balanceInWei); - - return balanceInEthers; -} - -const publicClient = createPublicClient({ - chain: celo, - transport: http(), -}); // Mainnet - -const balance = await checkUSDmBalance(publicClient, address); // In Ether unit -``` - - - -## Check If a transaction succeeded - -```js -import { createPublicClient, http } from "viem"; -import { celo } from "viem/chains"; - -async function checkIfTransactionSucceeded(publicClient, transactionHash) { - const receipt = await publicClient.getTransactionReceipt({ - hash: transactionHash, - }); - - return receipt.status === "success"; -} - -const publicClient = createPublicClient({ - chain: celo, - transport: http(), -}); // Mainnet - -const transactionStatus = await checkIfTransactionSucceeded( - publicClient, - transactionHash -); -``` - - -## Estimate Gas for a transaction (in Celo) - -```js -import { createPublicClient, http } from "viem"; -import { celo } from "viem/chains"; - -async function estimateGas(publicClient, transaction, feeCurrency = "") { - return await publicClient.estimateGas({ - ...transaction, - feeCurrency: feeCurrency ? feeCurrency : "", - }); -} - -const publicClient = createPublicClient({ - chain: celo, - transport: http(), -}); - -const gasLimit = await estimateGas(publicClient, { - account: "0x8eb02597d85abc268bc4769e06a0d4cc603ab05f", - to: "0x4f93fa058b03953c851efaa2e4fc5c34afdfab84", - value: "0x1", - data: "0x", -}); -``` - - - - - -## Estimate Gas for a transaction (in USDm) - -```js -import { createPublicClient, http } from "viem"; -import { celo } from "viem/chains"; - -async function estimateGas(publicClient, transaction, feeCurrency = "") { - return await publicClient.estimateGas({ - ...transaction, - feeCurrency: feeCurrency ? feeCurrency : "", - }); -} - -const publicClient = createPublicClient({ - chain: celo, - transport: http(), -}); - -const STABLE_TOKEN_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; - -const gasLimit = await estimateGas( - publicClient, - { - account: "0x8eb02597d85abc268bc4769e06a0d4cc603ab05f", - to: "0x4f93fa058b03953c851efaa2e4fc5c34afdfab84", - value: "0x1", - data: "0x", - }, - STABLE_TOKEN_ADDRESS -); -``` - - - -## Estimate Gas Price for a transaction (in Celo) - -```js -import { createPublicClient, http } from "viem"; -import { celo } from "viem/chains"; - -async function estimateGasPrice(publicClient, feeCurrency = "") { - return await publicClient.request({ - method: "eth_gasPrice", - params: feeCurrency ? [feeCurrency] : [], - }); -} - -const publicClient = createPublicClient({ - chain: celo, - transport: http(), -}); - -const gasPrice = await estimateGasPrice(publicClient); -``` - -## Estimate Gas Price for a transaction (in USDm) - -```js -import { createPublicClient, http } from "viem"; -import { celo } from "viem/chains"; - -async function estimateGasPrice(publicClient, feeCurrency = "") { - return await publicClient.request({ - method: "eth_gasPrice", - params: feeCurrency ? [feeCurrency] : [], - }); -} - -const publicClient = createPublicClient({ - chain: celo, - transport: http(), -}); - -const STABLE_TOKEN_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; - -const gasPrice = await estimateGasPrice(publicClient, STABLE_TOKEN_ADDRESS); -``` - - -## Calculate USDm to be spent for transaction fees - -```js -import { createPublicClient, http, formatEther, fromHex } from "viem"; -import { celo } from "viem/chains"; - -const publicClient = createPublicClient({ - chain: celo, - transport: http(), -}); - -const STABLE_TOKEN_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; - -// `estimateGas` implemented above -const gasLimit = await estimateGas( - publicClient, - { - account: "0x8eb02597d85abc268bc4769e06a0d4cc603ab05f", - to: "0x4f93fa058b03953c851efaa2e4fc5c34afdfab84", - value: "0x1", - data: "0x", - }, - STABLE_TOKEN_ADDRESS -); - -// `estimateGasPrice` implemented above -const gasPrice = await estimateGasPrice(publicClient, STABLE_TOKEN_ADDRESS); - -// Convert hex gas price to BigInt and calculate fees -const gasPriceBigInt = fromHex(gasPrice, "bigint"); -const transactionFeesInUSDm = formatEther(gasLimit * gasPriceBigInt); -``` - - - -## Resolve Minipay phone numbers to Addresses - -Install the `@celo/identity` package: - -```bash -npm install @celo/identity -``` - -### Step 1: Set up your issuer - -The issuer is the account registering attestations. When a user requests attestation registration, verify they own the identifier (e.g., SMS verification for phone numbers). - -```js -import { createWalletClient, http } from "viem"; -import { celoSepolia } from "viem/chains"; -import { privateKeyToAccount } from "viem/accounts"; - -// The issuer is the account that is registering the attestation -const ISSUER_PRIVATE_KEY = "YOUR_ISSUER_PRIVATE_KEY"; - -// Create Celo Sepolia viem client with the issuer private key -const viemClient = createWalletClient({ - account: privateKeyToAccount(ISSUER_PRIVATE_KEY), - transport: http(), - chain: celoSepolia, -}); - -// Information provided by user, issuer should confirm they own the identifier -const userPlaintextIdentifier = "+12345678910"; -const userAccountAddress = "0x000000000000000000000000000000000000user"; - -// Time at which issuer verified the user owns their identifier -const attestationVerifiedTime = Date.now(); -``` - -### Step 2: Check and top up ODIS quota - -```js -import { OdisUtils } from "@celo/identity"; -import { AuthSigner } from "@celo/identity/lib/odis/query"; -import { OdisContextName } from "@celo/identity/lib/odis/query"; - -// authSigner provides information needed to authenticate with ODIS -const authSigner: AuthSigner = { - authenticationMethod: OdisUtils.Query.AuthenticationMethod.WALLET_KEY, - sign191: ({ message, account }) => viemClient.signMessage({ message, account }), -}; - -// serviceContext provides the ODIS endpoint and public key -const serviceContext = OdisUtils.Query.getServiceContext( - OdisContextName.CELO_SEPOLIA -); - -// Check existing quota on issuer account -const issuerAddress = viemClient.account.address; -const { remainingQuota } = await OdisUtils.Quota.getPnpQuotaStatus( - issuerAddress, - authSigner, - serviceContext -); - -// If needed, approve and send payment to OdisPayments to get quota for ODIS -// Note: This example uses viem. For contract interactions, use getContract from viem -if (remainingQuota < 1) { - // Use viem's getContract to interact with stable token and ODIS payments contracts - // Implementation depends on your specific contract setup -} -``` - -### Step 3: Derive the obfuscated identifier - -Get the obfuscated identifier from the plaintext identifier by querying ODIS: - -```js -const { obfuscatedIdentifier } = await OdisUtils.Identifier.getObfuscatedIdentifier( - userPlaintextIdentifier, - OdisUtils.Identifier.IdentifierPrefix.PHONE_NUMBER, - issuerAddress, - authSigner, - serviceContext -); -``` - -### Step 4: Look up account addresses - -Query the FederatedAttestations contract to look up account addresses owned by an identifier: - -```js -const attestations = await federatedAttestationsContract.lookupAttestations( - obfuscatedIdentifier, - [issuerAddress] // Trusted issuers -); - -console.log(attestations.accounts); -``` - -## Request an ERC20 token transfer - - - USDT and USDC on Celo use **6 decimals**, not 18. Pass `tokenDecimals` as `6` when - transferring either token. Using `18` will send 1,000,000,000,000× more than intended. - USDm uses 18 decimals. - - -```js -import { createWalletClient, createPublicClient, custom, http, encodeFunctionData, parseUnits } from "viem"; -import { celo, celoSepolia } from "viem/chains"; -import { stableTokenABI } from "@celo/abis"; - -const walletClient = createWalletClient({ - chain: celoSepolia, // For testnet - // chain: celo, // For mainnet - transport: custom(window.ethereum!), -}); - -const publicClient = createPublicClient({ - chain: celoSepolia, // For testnet - // chain: celo, // For mainnet - transport: http(), -}); - -async function requestTransfer(tokenAddress, transferValue, tokenDecimals, receiverAddress) { - const hash = await walletClient.sendTransaction({ - to: tokenAddress, - // Mainnet token addresses and their decimals: - // USDm: '0x765DE816845861e75A25fCA122bb6898B8B1282a' (18 decimals) - // USDC: '0xcebA9300f2b948710d2653dD7B07f33A8B32118C' (6 decimals) - // USDT: '0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e' (6 decimals) - data: encodeFunctionData({ - abi: stableTokenABI, // Token ABI from @celo/abis - functionName: "transfer", - args: [ - receiverAddress, - // USDm uses 18 decimals; USDC and USDT use 6 decimals - parseUnits(`${Number(transferValue)}`, tokenDecimals), - ], - }), - }); - - const transaction = await publicClient.waitForTransactionReceipt({ - hash, // Transaction hash that can be used to search transaction on the explorer. - }); - - if (transaction.status === "success") { - // Do something after transaction is successful. - } else { - // Do something after transaction has failed. - } -} -``` - -{/* prettier-ignore-end */} diff --git a/build-on-celo/build-on-minipay/deeplinks.mdx b/build-on-celo/build-on-minipay/deeplinks.mdx deleted file mode 100644 index 67f3150d1c..0000000000 --- a/build-on-celo/build-on-minipay/deeplinks.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: MiniPay Deeplinks -description: Special links that open a relevant MiniPay screen based on intent ---- - -Deeplinks let your Mini App interact with MiniPay's native features without manual navigation. They use the host `link.minipay.xyz` and can be triggered from external apps or from within MiniPay itself. - - - The user must have MiniPay installed and be logged in. Users without the app - are shown an install prompt. - - -## Available deeplinks - -| Action | Deeplink | Description | -| --- | --- | --- | -| Add cash | `https://link.minipay.xyz/add_cash` | Launches the add cash flow. Optionally scope the tokens with `?tokens=USDM,USDT` (supported: `USDM`, `USDT`, `USDC`). | -| Open Mini App | `https://link.minipay.xyz/browse?url=xxx` | Opens an approved Mini App at the given URL. | -| Discover tab | `https://link.minipay.xyz/discover` | Opens the Mini Apps discovery page. | -| Transaction receipt | `https://link.minipay.xyz/receipt?tx=xxx` | Shows the receipt for a transaction hash. Append `&celebrate` for a celebration animation. | -| QR code | `https://link.minipay.xyz/qr` | Shows the user's QR code. | -| Invite friends | `https://link.minipay.xyz/invite_friends` | Opens the invite friends screen. | -| Pockets | `https://link.minipay.xyz/balance` | Opens the balance (pockets) view. | - -## Trigger the add cash screen - -To trigger or redirect a MiniPay user to the add cash screen inside MiniPay, use the following link: - -[https://link.minipay.xyz/add_cash](https://link.minipay.xyz/add_cash) - -To pre-select which tokens the user can add, pass the `tokens` query parameter, for example [https://link.minipay.xyz/add_cash?tokens=USDM,USDT](https://link.minipay.xyz/add_cash?tokens=USDM,USDT). - - -![add cash minipay deeplink](/img/developer/build-on-minipay/deeplinks/add-cash-deeplink.gif) - diff --git a/build-on-celo/build-on-minipay/overview.mdx b/build-on-celo/build-on-minipay/overview.mdx index 17d828d7e6..58804f6357 100644 --- a/build-on-celo/build-on-minipay/overview.mdx +++ b/build-on-celo/build-on-minipay/overview.mdx @@ -1,34 +1,221 @@ --- -title: Build on MiniPay -description: A guide for building on MiniPay and Celo. -sidebarTitle: "Overview" +title: Build for MiniPay +sidebarTitle: "MiniPay" +description: What is Celo-specific about building a MiniPay Mini App — stablecoins, gas paid in stablecoins, detecting MiniPay, phone-number lookup — plus the index of the MiniPay developer docs for everything else --- -## Create a Mini App for the MiniPay Stablecoin Wallet +This page is for developers building a Mini App for [MiniPay](https://www.opera.com/products/minipay), the stablecoin wallet from Opera. It covers only what is specific to Celo. The build, test and submit lifecycle is documented by the MiniPay team at [docs.minipay.xyz](https://docs.minipay.xyz/); the index at the end of this page lists every page there so you — or your coding agent — can see what is available without leaving this site. ---- +MiniPay runs only on Celo (mainnet) and Celo Sepolia (testnet). It has more than 10M activations, a built-in Mini App discovery page, and ships inside the Opera Mini Android browser and as a standalone app for [Android](https://play.google.com/store/apps/details?id=com.opera.minipay) and [iOS](https://apps.apple.com/de/app/minipay-easy-global-wallet/id6504087257?l=en-GB). Balances are shown in the user's local currency, the wallet is 2 MB, and phone numbers can stand in for addresses. + +## Prerequisites + +- A web app (any framework) reachable over HTTPS; for local development use `ngrok http 3000` to expose `localhost` +- [viem](/tooling/libraries-sdks/viem/index) or [wagmi](https://wagmi.sh/) — both support Celo's fee-currency transactions natively +- Testnet funds: CELO from the [Celo Sepolia faucet](https://faucet.celo.org/celo-sepolia), swapped to a stablecoin in the [Mento app](https://app.mento.org/) +- To scaffold: `npx @celo/celo-composer@latest create -t minipay` (the [MiniPay template](https://github.com/celo-org/minipay-template)), or follow the [MiniPay quick start](https://docs.minipay.xyz/getting-started/quick-start.html) + +## What is Celo-specific + +### Stablecoins are the only assets + +MiniPay holds USDm, USDC and USDT — no CELO balance is shown to the user. Price and settle in one of these. + +| Token | Celo mainnet (42220) | Decimals | +|---|---|---| +| USDm | [`0x765DE816845861e75A25fCA122bb6898B8B1282a`](https://celoscan.io/address/0x765DE816845861e75A25fCA122bb6898B8B1282a) | 18 | +| USDC | [`0xcebA9300f2b948710d2653dD7B07f33A8B32118C`](https://celoscan.io/address/0xcebA9300f2b948710d2653dD7B07f33A8B32118C) | 6 | +| USDT | [`0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e`](https://celoscan.io/address/0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e) | 6 | + + +USDC and USDT use **6 decimals**; USDm uses 18. `parseUnits(amount, 18)` on a USDC transfer sends 10¹² times the intended amount. Pass the token's decimals explicitly. + + +```ts +import { erc20Abi, parseUnits, encodeFunctionData } from "viem"; + +// USDC on Celo mainnet (42220): 6 decimals +const USDC = "0xcebA9300f2b948710d2653dD7B07f33A8B32118C"; +const hash = await walletClient.sendTransaction({ + to: USDC, + data: encodeFunctionData({ + abi: erc20Abi, + functionName: "transfer", + args: [receiver, parseUnits("1.50", 6)], // 1.50 USDC + }), +}); +``` + +Testnet addresses are on [Fee currency contracts](/tooling/contracts/fee-currencies). + +### Gas is paid in the user's stablecoin + +MiniPay uses [fee abstraction](/build-on-celo/fee-abstraction/overview): the user never holds CELO, and the wallet pays gas in the stablecoin the user holds the most of. You may set `feeCurrency` on `eth_sendTransaction`, but MiniPay can override it. Do not build flows that assume a CELO balance, and do not show a "buy CELO for gas" step. + +To show a fee estimate in the user's currency, estimate gas and gas price in that token. The JSON-RPC methods accept the fee currency directly: + +```ts +// Celo mainnet (42220); USDm has 18 decimals. For USDC/USDT use the *adapter* address, see fee abstraction. +const USDM = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; + +const gasLimit = await publicClient.request({ + method: "eth_estimateGas", + params: [{ from: account, to, value: "0x0", data: "0x", feeCurrency: USDM }], +}); +const gasPrice = await publicClient.request({ + method: "eth_gasPrice", + params: [USDM], +}); +const feeInUsdm = formatUnits(BigInt(gasLimit) * BigInt(gasPrice), 18); +``` + +In the UI, label this "network fee", not "gas" — see the MiniPay [design standards](https://docs.minipay.xyz/design-standards/). + +### Detect MiniPay and skip the connect button + +Inside MiniPay the wallet is already connected through the injected provider, and `window.ethereum.isMiniPay` is `true`. Hide your connect-wallet UI and connect the injected connector on load: + +```tsx +import { useEffect, useState } from "react"; +import { useConnect } from "wagmi"; +import { injected } from "wagmi/connectors"; + +export function useMiniPay() { + const [isMiniPay, setIsMiniPay] = useState(false); + const { connect } = useConnect(); + + useEffect(() => { + if (window.ethereum?.isMiniPay) { + setIsMiniPay(true); + connect({ connector: injected({ target: "metaMask" }) }); + } + }, [connect]); + + return isMiniPay; // render only when false +} +``` + +Check for `window.ethereum` before initialising any web3 library; the provider is injected by the host. Wallet-connection details and error handling: [Wallet connection](https://docs.minipay.xyz/getting-started/wallet-connection.html). + +### Resolve MiniPay phone numbers to addresses + +MiniPay maps phone numbers to addresses through [SocialConnect](/build-on-celo/build-on-socialconnect) and ODIS. To look a number up you act as an *issuer*: an account that has verified the user owns the number (for example by SMS), has a [data encryption key (DEK)](https://github.com/celo-org/social-connect) registered on the Accounts contract, and holds ODIS quota. + +```bash +npm install @celo/identity @celo/abis viem +``` + +```ts +import { createPublicClient, http } from "viem"; +import { celo } from "viem/chains"; +import { federatedAttestationsABI } from "@celo/abis"; +import { OdisUtils } from "@celo/identity"; +import type { AuthSigner } from "@celo/identity/lib/odis/query"; + +// Celo mainnet (42220). @celo/identity ships ODIS contexts for mainnet only — no Celo Sepolia. +const FEDERATED_ATTESTATIONS = "0x0aD5b1d0C25ecF6266Dd951403723B2687d6aff2"; +const issuerAddress = "0xYourIssuerAddress"; + +// 1. Authenticate with ODIS using the issuer's DEK private key +const authSigner: AuthSigner = { + authenticationMethod: OdisUtils.Query.AuthenticationMethod.ENCRYPTION_KEY, + rawKey: process.env.ISSUER_DEK_PRIVATE_KEY!, +}; +const serviceContext = OdisUtils.Query.getServiceContext(OdisUtils.Query.OdisContextName.MAINNET); + +// 2. Check quota; top up by paying OdisPayments (0xAE6B29f31B96e61DdDc792f45fDa4e4F0356D0CB) if it is 0 +const { remainingQuota } = await OdisUtils.Quota.getPnpQuotaStatus(issuerAddress, authSigner, serviceContext); + +// 3. Derive the obfuscated identifier for the phone number (one quota unit per call) +const { obfuscatedIdentifier } = await OdisUtils.Identifier.getObfuscatedIdentifier( + "+12345678910", + OdisUtils.Identifier.IdentifierPrefix.PHONE_NUMBER, + issuerAddress, + authSigner, + serviceContext, +); + +// 4. Read the accounts attested for it by the issuers you trust +const publicClient = createPublicClient({ chain: celo, transport: http() }); +const [, accounts] = await publicClient.readContract({ + address: FEDERATED_ATTESTATIONS, + abi: federatedAttestationsABI, + functionName: "lookupAttestations", + args: [obfuscatedIdentifier as `0x${string}`, [issuerAddress]], +}); +console.log(accounts); +``` + +Contract addresses are from the on-chain registry (`FederatedAttestations`, `OdisPayments`) and listed on [Core contracts](/tooling/contracts/core-contracts). The MiniPay reference for this is [Phone number lookup](https://docs.minipay.xyz/technical-references/phone-number-lookup.html). + +### Deeplinks + +Deeplinks open a MiniPay screen from your Mini App or from outside (WhatsApp, a web page). The host is `link.minipay.xyz`; users without the app get an install prompt. + +| Action | Deeplink | +|---|---| +| Add cash, optionally scoped to tokens | `https://link.minipay.xyz/add_cash?tokens=USDM,USDT,USDC` | +| Open an approved Mini App | `https://link.minipay.xyz/browse?url=https://your-app.example` | +| Discovery page | `https://link.minipay.xyz/discover` | +| Transaction receipt (append `&celebrate` for an animation) | `https://link.minipay.xyz/receipt?tx=0x…` | +| User's QR code | `https://link.minipay.xyz/qr` | +| Invite friends | `https://link.minipay.xyz/invite_friends` | +| Balance (pockets) | `https://link.minipay.xyz/balance` | + +Reference: [Deeplinks](https://docs.minipay.xyz/technical-references/deeplinks.html). + +## Test inside MiniPay + +You cannot test in an Android emulator; use a phone. + +1. In the MiniPay app open **Settings → About** and tap the **Version** number until developer mode is confirmed. +2. Back in **Settings → Developer Settings**, enable **Developer Mode** and, for Celo Sepolia, **Use Testnet**. +3. Tap **Load Test Page**, enter your app's HTTPS URL (the `ngrok` URL for local development), and tap **Go**. + +Step-by-step with screenshots: [Test your Mini App inside MiniPay](https://docs.minipay.xyz/getting-started/test-in-minipay.html). -[MiniPay](https://www.opera.com/products/minipay) is a stablecoin wallet with a built-in Mini App discovery page, integrated directly within the popular Opera Mini Android browser and also available as a standalone application on Android and iOS. +## The MiniPay developer docs -Since launching, MiniPay is the fastest growing non-custodial wallet in the Global South with more than 10M+ activations. +Everything below lives at docs.minipay.xyz and is maintained by the MiniPay team. - -Install the new MiniPay standalone app for [Android](https://play.google.com/store/apps/details?id=com.opera.minipay) or [iOS](https://apps.apple.com/de/app/minipay-easy-global-wallet/id6504087257?l=en-GB) now! 🎉 📥 - +**Getting started** +- [What are Mini Apps?](https://docs.minipay.xyz/getting-started/overview.html) +- [Quick start](https://docs.minipay.xyz/getting-started/quick-start.html) — scaffold a Mini App with the Celo agent skills +- [Test your Mini App inside MiniPay](https://docs.minipay.xyz/getting-started/test-in-minipay.html) +- [Project setup](https://docs.minipay.xyz/getting-started/project-setup.html) and [Setting up a React app](https://docs.minipay.xyz/getting-started/setup-react.html) +- [FAQ](https://docs.minipay.xyz/faq.html) -## Why Build on MiniPay? +**Guides** +- [Wallet connection](https://docs.minipay.xyz/getting-started/wallet-connection.html) — injected provider, auto-connect, connection state, errors +- [UI and container integration](https://docs.minipay.xyz/getting-started/ui-and-container.html) +- [Interacting with smart contracts](https://docs.minipay.xyz/getting-started/smart-contracts.html) +- [Best practices](https://docs.minipay.xyz/getting-started/best-practices.html) +- [Deployment](https://docs.minipay.xyz/getting-started/deployment.html) +- [Submit your Mini App](https://docs.minipay.xyz/getting-started/submit-your-miniapp.html) to the discovery page +- [Building for MiniPay](https://docs.minipay.xyz/getting-started/why-minipay.html) and [Availability](https://docs.minipay.xyz/getting-started/availability.html) +- [Design standards](https://docs.minipay.xyz/design-standards/) — including user-facing terminology +- [Examples](https://docs.minipay.xyz/getting-started/examples.html) -- **Useful Applications:** MiniPay focuses on practical uses in everyday life, especially in emerging markets, where most of their users are located. -- **Integrated App Discovery:** MiniPay includes a built-in app discovery page, allowing users to interact with selected Mini Apps directly within their wallet, without needing to switch to other platforms. -- **Access to Opera’s Large User Base** Developers can tap into MiniPay’s growing user base (10 Million activated addresses) and Opera browser distribution. +**Technical reference** +- [Retrieve balance](https://docs.minipay.xyz/technical-references/retrieve-balance.html) +- [Send a transaction](https://docs.minipay.xyz/technical-references/send-transaction.html) — USDC, USDT, USDm with wagmi +- [Gas estimation](https://docs.minipay.xyz/technical-references/gas-estimation.html) +- [Transaction status](https://docs.minipay.xyz/technical-references/transaction-status.html) +- [Phone number lookup](https://docs.minipay.xyz/technical-references/phone-number-lookup.html) +- [Chain switching](https://docs.minipay.xyz/technical-references/chain-switching.html) +- [Deeplinks](https://docs.minipay.xyz/technical-references/deeplinks.html) +- Custom methods: [overview](https://docs.minipay.xyz/technical-references/custom-methods/custom-methods.html), [getExchangeRate](https://docs.minipay.xyz/technical-references/custom-methods/get-exchange-rate.html), [scanQrCode](https://docs.minipay.xyz/technical-references/custom-methods/scan-qr-code.html), [requestContact](https://docs.minipay.xyz/technical-references/custom-methods/request-contact.html) -## Key Features of MiniPay +## Funding and programs -- **Phone Number mapping:** Uses mobile phone numbers as wallet addresses. -- **Fast, Low-Cost Transactions:** Offers fast P2P stablecoin transactions with sub-cent fees. -- **Lightweight Design:** At just 2MB, users can use the wallet with limited data. +- Building in public? Register for Build With Celo programs at [celopg.eco](https://www.celopg.eco/). +- Raising? Send a deck or product demo to team@verda.ventures. +- Grants and accelerators: [Fund your project](/build-on-celo/fund-your-project). -## Opportunities for MiniPay Builders +## Related -- **Raising Funding?** Reach out to team@verda.ventures with a deck and/or product demo. -- **Still Building?** Register your project for [Build With Celo: Proof-of-Ship](https://www.celopg.eco/programs/proof-of-ship-s1) for monthly rewards. +- [Fee abstraction](/build-on-celo/fee-abstraction/overview) - How gas in stablecoins works and the adapter addresses for USDC and USDT +- [Fee currency contracts](/tooling/contracts/fee-currencies) - Token and adapter addresses per network +- [Build with local stablecoins](/build-on-celo/build-with-local-stablecoin) - Mento stablecoins beyond USDm +- [SocialConnect](/build-on-celo/build-on-socialconnect) - Phone-number to address mapping +- [Celo Composer](/build-on-celo/quickstart) - Scaffold a MiniPay-ready app diff --git a/build-on-celo/build-on-minipay/prerequisites/ngrok-setup.mdx b/build-on-celo/build-on-minipay/prerequisites/ngrok-setup.mdx deleted file mode 100644 index c3fe955b3e..0000000000 --- a/build-on-celo/build-on-minipay/prerequisites/ngrok-setup.mdx +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Ngrok Setup -description: Ngrok Setup to share localhost project with MiniPay app ---- - -When builidng dApps for MiniPay locally, you want to test the dApp inside MiniPay wallet on your phone. - -But since the dApp is running locally, you cannot simply visit localhost on your phone to open the dApp on your phone. - -To solve this, we use `ngrok`. - -`ngrok` allows us to share our localhost by providing us with a temporary web url that can be used on any device! - -## Installing Ngrok - -1. Visit [ngrok.com](https://ngrok.com) - -![ngrok.com](/img/developer/build-on-minipay/ngrok-setup/1.png) - -2. Sign up - - - ![sign up ngrok](/img/developer/build-on-minipay/ngrok-setup/2.png) - - -3. The dashboard will have instructions based on your OS on how to install and use ngrok! - -![dashboard](/img/developer/build-on-minipay/ngrok-setup/3.png) - -4. Once installed you can use the following command to share your localhost port. - -```bash -> ngrok http [PORT] -``` - -The output looks something like this. - - - ![ngrok output](/img/developer/build-on-minipay/ngrok-setup/4.png) - - -You can use the highlighted url to launch the localhost dApp on the [MiniPay's Site Tester](/build-on-celo/build-on-minipay/quickstart#test-your-mini-app-inside-minipay). diff --git a/build-on-celo/build-on-minipay/quickstart.mdx b/build-on-celo/build-on-minipay/quickstart.mdx deleted file mode 100644 index 8fc8bc2d42..0000000000 --- a/build-on-celo/build-on-minipay/quickstart.mdx +++ /dev/null @@ -1,279 +0,0 @@ ---- -title: Get Started Building on MiniPay -description: A quickstart guide for building on MiniPay and Celo. -sidebarTitle: "Getting Started" ---- - -A step-by-step guide to setting up, building, and testing your MiniPay Mini App. - ---- - -## 1. Installing MiniPay - -MiniPay is designed for mainstream adoption, making digital payments simple and easy to use. - -#### Key Features: - -- **Currency Display**: Balances appear in your local currency. -- **Stablecoin Support**: Only stablecoins (USDm, USDC, and USDT) are supported. -- **Simple Swaps**: The pocket swap feature allows for easy swaps between stablecoins by dragging one pocket into another. - - - MiniPay is only available on Celo and Celo Sepolia Testnet. Other blockchain - networks are not supported. - - -#### How to Access MiniPay: - -- [**Opera Mini Browser**](https://www.opera.com/pl/products/minipay) (Android) -- [**Standalone App Android**](https://play.google.com/store/apps/details?id=com.opera.minipay) -- [**Standalone App iOS**](https://apps.apple.com/de/app/minipay-easy-global-wallet/id6504087257?l=en-GB) - -#### Set Up MiniPay: - -- **Install the MiniPay Standalone App:** Download for [Android](https://play.google.com/store/apps/details?id=com.opera.minipay) and [iOS](https://apps.apple.com/de/app/minipay-easy-global-wallet/id6504087257?l=en-GB) -- **Create an Account:** Sign up using your Google account and phone number. - -## 2. Build Your MiniPay Mini App - -#### For creating a new app: - -- Use the [Celo Composer MiniPay Template](https://github.com/celo-org/minipay-template) to start building. - -```bash -npx @celo/celo-composer@latest create -t minipay -``` - -- Follow the [Quickstart Guide](/build-on-celo/quickstart) for a step-by-step tutorial. - -#### For integrating an existing app: - -- Follow the [Helpful Tips Guide](#helpful-tips-to-make-your-mini-app-minipay-compatible) to ensure your app is MiniPay compatible. - -## 3. Get Testnet Tokens - -Request CELO testnet tokens from the Celo [faucet](https://faucet.celo.org/celo-sepolia/) to test your Mini App. After you got the CELO tokens, you can exchange them for stablecoins like USDm, USDT and USDC in the [mento app](https://app.mento.org/). - -## 4. Test your Mini App inside MiniPay - - - You cannot test MiniPay using the Android Studio Emulator. Use an Android or - iOS mobile device. - - -### Enable Developer Mode: - -1. Open the MiniPay app on your phone and navigate to settings. - - - Open MiniPay dApp store - - -2. In the **About** section, tap the **Version** number repeatedly until the confirmation message appears. - - - Open MiniPay dApp test page - - -3. Return to **Settings**, then select **Developer Settings**. - - - MiniPay dApp testing - - -4. Enable **Developer Mode** and toggle **Use Testnet** to connect to Sepolia L2 testnet. - - - MiniPay dApp testing - - -### Load Your Mini App: - -1. In **Developer Settings,** tap **Load Test Page.** -2. Enter your **Mini App URL.** - - If testing a local deployment, use [ngrok](#testing-local-development-with-minipay) to expose your localhost. - - - MiniPay dApp testing - - -6. Click **Go** to launch and test your Mini App. - - - MiniPay dApp testing - - ---- - -## Helpful Tips to Make Your Mini App MiniPay Compatible - - - MiniPay uses Custom [Fee Abstraction](/build-on-celo/fee-abstraction/overview) based - transactions. We recommend using viem or wagmi as they provide native support - for fee currency. - - -#### 1. Using Viem - -```js -import { createWalletClient, custom } from "viem"; -import { celo, celoSepolia } from "viem/chains"; - -const client = createWalletClient({ - chain: celo, - // chain: celoSepolia, // For Celo Sepolia Testnet - transport: custom(window.ethereum), -}); - -const [address] = await client.getAddresses(); -``` - -#### 2. Using Wagmi - - - These snippets use **wagmi v2** (the current major version). In v2, connectors - are functions (e.g. `injected()`) rather than the classes used in v1 - (`new InjectedConnector()`), `WagmiConfig` is now `WagmiProvider`, and the - config is built with `createConfig`. - - -First, create your wagmi config and wrap your app in `WagmiProvider` (wagmi v2 also requires a TanStack Query provider): - -```tsx -// providers.tsx -"use client"; - -import { WagmiProvider, createConfig, http } from "wagmi"; -import { celo } from "wagmi/chains"; -import { injected } from "wagmi/connectors"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; - -export const config = createConfig({ - chains: [celo], - connectors: [injected({ target: "metaMask" })], - transports: { - [celo.id]: http(), - }, -}); - -const queryClient = new QueryClient(); - -export function Providers({ children }: { children: React.ReactNode }) { - return ( - - {children} - - ); -} -``` - -Then auto-connect on load using the connector from your config: - -```tsx -import { useEffect } from "react"; -import { useConnect } from "wagmi"; - -const { connect, connectors } = useConnect(); - -useEffect(() => { - // `connectors[0]` is the `injected()` connector registered in `createConfig` - connect({ connector: connectors[0] }); -}, [connect, connectors]); -``` - -This sets up the `injected` connector in `createConfig` and then uses the `connect` method from the `useConnect` hook. The `useEffect` ensures that the connection is established when the page loads. - -In the Viem example, we're creating a wallet client that specifies the chain and a custom transport using `window.ethereum`. The `getAddresses` method then retrieves the connected addresses. - -### Important Notes - -Ensure the "Connect Wallet" button is hidden when your DApp is loaded inside the MiniPay app, as the wallet connection is implicit. - -_Code Example to hide Connect Wallet button if the user is using MiniPay wallet_ - -```tsx -import { useEffect, useState } from "react"; -import { useConnect } from "wagmi"; -import { injected } from "wagmi/connectors"; - -export default function Header() { - // State variable that determines whether to hide the button or not. - const [hideConnectBtn, setHideConnectBtn] = useState(false); - const { connect } = useConnect(); - - useEffect(() => { - if (window.ethereum && window.ethereum.isMiniPay) { - // User is using MiniPay so hide connect wallet button. - setHideConnectBtn(true); - - connect({ connector: injected({ target: "metaMask" }) }); - } - }, [connect]); - - return ( -
- {/* Conditional rendering of Connect Wallet button */} - {!hideConnectBtn && ( - - )} -
- ); -} -``` - -- Always verify the existence of `window.provider` before initializing your web3 library to ensure seamless compatibility with the MiniPay wallet. -- When using `ngrok`, remember that the tunneling URL is temporary. You'll get a new URL every time you restart ngrok. -- Be cautious about exposing sensitive information or functionality when using public tunneling services like ngrok. Always use them in a controlled environment. -- MiniPay manages gas fees for you. You can set the `feeCurrency` property when running `eth_sendTransaction`, but MiniPay may ignore it and pay gas in the stablecoin the user holds the most of. Supported gas tokens include `USDT`, `USDC`, and `USDm` (as well as other Mento stablecoins). -- Use viem or wagmi to build and send transactions, as they provide native support for Celo's fee-currency transactions. - -## Testing Local Development with MiniPay - -If you're developing your MiniApp locally (e.g., on `localhost:3000`), use `ngrok` to tunnel traffic over HTTP, for real-time testing. - -#### Set Up ngrok - -- **Install ngrok:** If you haven't already, install ngrok. You can find instructions on their [official website](https://ngrok.com/download). -- **Start Your Local Server:** Ensure your local development server is running. For instance, if you're using Next.js, you might run `npm run dev` to start your server at `localhost:3000`. -- **Tunnel Traffic with ngrok:** In your terminal, run the following command to start an ngrok tunnel: - -```bash -ngrok http 3000 -``` - -This will provide you with a public URL that tunnels to your localhost. - -For a more in depth guide, check out the official [ngrok setup](/build-on-celo/build-on-minipay/prerequisites/ngrok-setup). - -- **Test in MiniPay:** Copy the provided ngrok URL and use it inside the MiniPay app to test your DApp. diff --git a/build-on-celo/quickstart.mdx b/build-on-celo/quickstart.mdx index 33c05ed702..d51c46f8d5 100644 --- a/build-on-celo/quickstart.mdx +++ b/build-on-celo/quickstart.mdx @@ -89,7 +89,7 @@ Optimized for building dApps that integrate with the MiniPay mobile wallet, with npx @celo/celo-composer@latest create --template minipay ``` -Checkout [minipay docs](/build/build-on-minipay/overview) to learn more about it. +Checkout [minipay docs](/build-on-celo/build-on-minipay/overview) to learn more about it. ### AI Chat App diff --git a/docs.json b/docs.json index ab42e0d96b..ef7f071059 100644 --- a/docs.json +++ b/docs.json @@ -153,21 +153,7 @@ { "group": "Use Cases", "pages": [ - { - "group": "Build for MiniPay", - "pages": [ - "build-on-celo/build-on-minipay/overview", - "build-on-celo/build-on-minipay/quickstart", - { - "group": "Prerequisites", - "pages": [ - "build-on-celo/build-on-minipay/prerequisites/ngrok-setup" - ] - }, - "build-on-celo/build-on-minipay/code-library", - "build-on-celo/build-on-minipay/deeplinks" - ] - }, + "build-on-celo/build-on-minipay/overview", "build-on-celo/build-with-farcaster", "build-on-celo/build-with-self", "build-on-celo/build-with-local-stablecoin", @@ -1792,27 +1778,67 @@ }, { "source": "/developer/build-on-minipay", - "destination": "/build/build-on-minipay" + "destination": "/build-on-celo/build-on-minipay/overview" }, { "source": "/developer/build-on-minipay/code-library", - "destination": "/build/build-on-minipay/code-library" + "destination": "/build-on-celo/build-on-minipay/overview" }, { "source": "/developer/build-on-minipay/deeplinks", - "destination": "/build/build-on-minipay/deeplinks" + "destination": "/build-on-celo/build-on-minipay/overview" }, { "source": "/developer/build-on-minipay/overview", - "destination": "/build/build-on-minipay/overview" + "destination": "/build-on-celo/build-on-minipay/overview" }, { "source": "/developer/build-on-minipay/prerequisites/ngrok-setup", - "destination": "/build/build-on-minipay/prerequisites/ngrok-setup" + "destination": "/build-on-celo/build-on-minipay/overview" }, { "source": "/developer/build-on-minipay/quickstart", - "destination": "/build/build-on-minipay/quickstart" + "destination": "/build-on-celo/build-on-minipay/overview" + }, + { + "source": "/build-on-celo/build-on-minipay/quickstart", + "destination": "/build-on-celo/build-on-minipay/overview" + }, + { + "source": "/build-on-celo/build-on-minipay/code-library", + "destination": "/build-on-celo/build-on-minipay/overview" + }, + { + "source": "/build-on-celo/build-on-minipay/deeplinks", + "destination": "/build-on-celo/build-on-minipay/overview" + }, + { + "source": "/build-on-celo/build-on-minipay/prerequisites/ngrok-setup", + "destination": "/build-on-celo/build-on-minipay/overview" + }, + { + "source": "/build/build-on-minipay", + "destination": "/build-on-celo/build-on-minipay/overview" + }, + { + "source": "/build/build-on-minipay/quickstart", + "destination": "/build-on-celo/build-on-minipay/overview" + }, + { + "source": "/build/build-on-minipay/code-library", + "destination": "/build-on-celo/build-on-minipay/overview" + }, + { + "source": "/build/build-on-minipay/deeplinks", + "destination": "/build-on-celo/build-on-minipay/overview" + }, + { + "source": "/build/build-on-minipay/prerequisites/ngrok-setup", + "destination": "/build-on-celo/build-on-minipay/overview" + }, + { + "source": "/build/build-on-minipay/overview", + "destination": "/build-on-celo/build-on-minipay/overview" }, { "source": "/developer/build-with-ai/overview", diff --git a/img/developer/build-on-minipay/android-studio-setup/1.png b/img/developer/build-on-minipay/android-studio-setup/1.png deleted file mode 100644 index 7c7916b502..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/1.png and /dev/null differ diff --git a/img/developer/build-on-minipay/android-studio-setup/10.png b/img/developer/build-on-minipay/android-studio-setup/10.png deleted file mode 100644 index e65a235276..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/10.png and /dev/null differ diff --git a/img/developer/build-on-minipay/android-studio-setup/11.png b/img/developer/build-on-minipay/android-studio-setup/11.png deleted file mode 100644 index db18efd0ca..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/11.png and /dev/null differ diff --git a/img/developer/build-on-minipay/android-studio-setup/2.png b/img/developer/build-on-minipay/android-studio-setup/2.png deleted file mode 100644 index c54611b84f..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/2.png and /dev/null differ diff --git a/img/developer/build-on-minipay/android-studio-setup/3.png b/img/developer/build-on-minipay/android-studio-setup/3.png deleted file mode 100644 index f31ca9ac1d..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/3.png and /dev/null differ diff --git a/img/developer/build-on-minipay/android-studio-setup/4.png b/img/developer/build-on-minipay/android-studio-setup/4.png deleted file mode 100644 index c449f708af..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/4.png and /dev/null differ diff --git a/img/developer/build-on-minipay/android-studio-setup/5.png b/img/developer/build-on-minipay/android-studio-setup/5.png deleted file mode 100644 index 026c889085..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/5.png and /dev/null differ diff --git a/img/developer/build-on-minipay/android-studio-setup/6.png b/img/developer/build-on-minipay/android-studio-setup/6.png deleted file mode 100644 index 923fccefb5..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/6.png and /dev/null differ diff --git a/img/developer/build-on-minipay/android-studio-setup/7.png b/img/developer/build-on-minipay/android-studio-setup/7.png deleted file mode 100644 index 493791bb08..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/7.png and /dev/null differ diff --git a/img/developer/build-on-minipay/android-studio-setup/8.png b/img/developer/build-on-minipay/android-studio-setup/8.png deleted file mode 100644 index cba4f32649..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/8.png and /dev/null differ diff --git a/img/developer/build-on-minipay/android-studio-setup/9.png b/img/developer/build-on-minipay/android-studio-setup/9.png deleted file mode 100644 index 1cba95d3f3..0000000000 Binary files a/img/developer/build-on-minipay/android-studio-setup/9.png and /dev/null differ diff --git a/img/developer/build-on-minipay/deeplinks/add-cash-deeplink.gif b/img/developer/build-on-minipay/deeplinks/add-cash-deeplink.gif deleted file mode 100644 index 11b8bc5a88..0000000000 Binary files a/img/developer/build-on-minipay/deeplinks/add-cash-deeplink.gif and /dev/null differ diff --git a/img/developer/build-on-minipay/ngrok-setup/1.png b/img/developer/build-on-minipay/ngrok-setup/1.png deleted file mode 100644 index 4e81305d5c..0000000000 Binary files a/img/developer/build-on-minipay/ngrok-setup/1.png and /dev/null differ diff --git a/img/developer/build-on-minipay/ngrok-setup/2.png b/img/developer/build-on-minipay/ngrok-setup/2.png deleted file mode 100644 index 1a358f270c..0000000000 Binary files a/img/developer/build-on-minipay/ngrok-setup/2.png and /dev/null differ diff --git a/img/developer/build-on-minipay/ngrok-setup/3.png b/img/developer/build-on-minipay/ngrok-setup/3.png deleted file mode 100644 index 72fcca5510..0000000000 Binary files a/img/developer/build-on-minipay/ngrok-setup/3.png and /dev/null differ diff --git a/img/developer/build-on-minipay/ngrok-setup/4.png b/img/developer/build-on-minipay/ngrok-setup/4.png deleted file mode 100644 index 53f136db25..0000000000 Binary files a/img/developer/build-on-minipay/ngrok-setup/4.png and /dev/null differ diff --git a/img/doc-images/minipay/build-on-minipay/activate-developer-mode.jpg b/img/doc-images/minipay/build-on-minipay/activate-developer-mode.jpg deleted file mode 100644 index 9a0df41c4d..0000000000 Binary files a/img/doc-images/minipay/build-on-minipay/activate-developer-mode.jpg and /dev/null differ diff --git a/img/doc-images/minipay/build-on-minipay/choose-developer-settings.jpg b/img/doc-images/minipay/build-on-minipay/choose-developer-settings.jpg deleted file mode 100644 index e0899cc2ac..0000000000 Binary files a/img/doc-images/minipay/build-on-minipay/choose-developer-settings.jpg and /dev/null differ diff --git a/img/doc-images/minipay/build-on-minipay/choose-settings.jpg b/img/doc-images/minipay/build-on-minipay/choose-settings.jpg deleted file mode 100644 index 4f436ac62d..0000000000 Binary files a/img/doc-images/minipay/build-on-minipay/choose-settings.jpg and /dev/null differ diff --git a/img/doc-images/minipay/build-on-minipay/choose-testnet.jpg b/img/doc-images/minipay/build-on-minipay/choose-testnet.jpg deleted file mode 100644 index fbeef0c5d9..0000000000 Binary files a/img/doc-images/minipay/build-on-minipay/choose-testnet.jpg and /dev/null differ diff --git a/img/doc-images/minipay/build-on-minipay/enter-url.jpg b/img/doc-images/minipay/build-on-minipay/enter-url.jpg deleted file mode 100644 index 758e0aad25..0000000000 Binary files a/img/doc-images/minipay/build-on-minipay/enter-url.jpg and /dev/null differ diff --git a/img/doc-images/minipay/build-on-minipay/minipay-1.png b/img/doc-images/minipay/build-on-minipay/minipay-1.png deleted file mode 100644 index b0baddf83c..0000000000 Binary files a/img/doc-images/minipay/build-on-minipay/minipay-1.png and /dev/null differ diff --git a/img/doc-images/minipay/build-on-minipay/minipay-2.png b/img/doc-images/minipay/build-on-minipay/minipay-2.png deleted file mode 100644 index 71ee858b9f..0000000000 Binary files a/img/doc-images/minipay/build-on-minipay/minipay-2.png and /dev/null differ diff --git a/img/doc-images/minipay/build-on-minipay/minipay-3.png b/img/doc-images/minipay/build-on-minipay/minipay-3.png deleted file mode 100644 index b542b3e870..0000000000 Binary files a/img/doc-images/minipay/build-on-minipay/minipay-3.png and /dev/null differ diff --git a/img/doc-images/minipay/build-on-minipay/site-tester-opening.jpg b/img/doc-images/minipay/build-on-minipay/site-tester-opening.jpg deleted file mode 100644 index 9b53598670..0000000000 Binary files a/img/doc-images/minipay/build-on-minipay/site-tester-opening.jpg and /dev/null differ diff --git a/img/doc-images/minipay/build-on-minipay/turn-on-developer-mode.jpg b/img/doc-images/minipay/build-on-minipay/turn-on-developer-mode.jpg deleted file mode 100644 index 5b80297e50..0000000000 Binary files a/img/doc-images/minipay/build-on-minipay/turn-on-developer-mode.jpg and /dev/null differ diff --git a/tooling/libraries-sdks/composer-kit.mdx b/tooling/libraries-sdks/composer-kit.mdx index 943abc60f2..155b0d9821 100644 --- a/tooling/libraries-sdks/composer-kit.mdx +++ b/tooling/libraries-sdks/composer-kit.mdx @@ -217,5 +217,5 @@ For comprehensive examples and detailed API documentation for each component: ## Next Steps - Get started with [Celopedia](/build-on-celo/build-with-ai/celopedia) to build on Celo with your AI coding assistant -- Explore [building on MiniPay](/build/build-on-minipay/overview) for mobile-first experiences +- Explore [building on MiniPay](/build-on-celo/build-on-minipay/overview) for mobile-first experiences - Learn about [DeFi integration](/build/build-with-defi) for financial applications diff --git a/tooling/wallets/index.mdx b/tooling/wallets/index.mdx index 7bd136e200..a0cabbd2cb 100644 --- a/tooling/wallets/index.mdx +++ b/tooling/wallets/index.mdx @@ -27,7 +27,7 @@ MiniPay is a non-custodial lightweight mobile wallet that allows users to send a - Maintainers: Opera - Ledger support: No - Supported tokens: USDm, USDT, and USDC -- [Start building](/build/build-on-minipay/quickstart) +- [Start building](/build-on-celo/build-on-minipay/overview) ---