> ## Documentation Index
> Fetch the complete documentation index at: https://docs.anchorage.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Receiving assets

> Deposit assets into Porto vaults and request support for new assets.

export const ImageCarousel = ({images, perView = 3, children}) => {
  const [page, setPage] = useState(0);
  const [imgH, setImgH] = useState(0);
  const stripRef = useRef(null);
  const THUMB_MAX_WIDTH = 220;
  const PEEK_WIDTH = 34;
  useEffect(() => {
    const strip = stripRef.current;
    if (!strip) return;
    const measure = () => {
      const box = strip.querySelector("[data-carousel-imgbox]");
      if (box && box.clientHeight) setImgH(box.clientHeight);
    };
    measure();
    const ro = new ResizeObserver(measure);
    ro.observe(strip);
    return () => ro.disconnect();
  }, []);
  const fromChildren = React.Children.toArray(children).map(c => c && c.props && c.props.src ? {
    src: c.props.src,
    alt: c.props.alt
  } : null).filter(Boolean);
  const items = fromChildren.length ? fromChildren : images || [];
  if (!items.length) return null;
  const count = items.length;
  const columns = Math.min(perView, count);
  const totalPages = Math.ceil(count / columns);
  const showControls = totalPages > 1;
  const goTo = p => setPage((p % totalPages + totalPages) % totalPages);
  const prev = () => goTo(page - 1);
  const next = () => goTo(page + 1);
  const start = page * columns;
  const visible = items.slice(start, start + columns);
  const prevPeek = start > 0 ? items[start - 1] : null;
  const nextPeek = start + columns < count ? items[start + columns] : null;
  const renderPeek = (img, side) => {
    if (!img) return null;
    const isLeft = side === "left";
    return <button type="button" onClick={isLeft ? prev : next} aria-hidden="true" tabIndex={-1} style={{
      flex: `0 0 ${PEEK_WIDTH}px`,
      width: PEEK_WIDTH + "px",
      alignSelf: imgH ? "flex-start" : "stretch",
      height: imgH ? imgH + "px" : undefined,
      border: 0,
      padding: 0,
      cursor: "pointer",
      opacity: 0.5,
      borderRadius: isLeft ? "10px 0 0 10px" : "0 10px 10px 0",
      backgroundImage: `url("${img.src}")`,
      backgroundRepeat: "no-repeat",
      backgroundSize: "auto 100%",
      backgroundPosition: isLeft ? "right center" : "left center",
      WebkitMaskImage: `linear-gradient(to ${isLeft ? "left" : "right"}, #000 15%, transparent 100%)`,
      maskImage: `linear-gradient(to ${isLeft ? "left" : "right"}, #000 15%, transparent 100%)`
    }} />;
  };
  const arrowStyle = {
    flex: "0 0 auto",
    width: "30px",
    height: "30px",
    borderRadius: "50%",
    border: "1px solid var(--ad-border, #e4e5e7)",
    background: "var(--background, #fff)",
    fontSize: "16px",
    lineHeight: "28px",
    textAlign: "center",
    cursor: "pointer",
    padding: 0
  };
  return <div style={{
    outline: "none",
    margin: "1.5rem 0"
  }} role={showControls ? "group" : undefined} aria-label={showControls ? "Screenshot carousel" : undefined} aria-roledescription={showControls ? "carousel" : undefined}>
      <div style={{
    display: "flex",
    alignItems: "center",
    gap: "10px"
  }}>
        {showControls && <button type="button" onClick={prev} aria-label="Previous screenshots" style={arrowStyle}>
            ‹
          </button>}

        <div ref={stripRef} style={{
    display: "flex",
    flexWrap: "nowrap",
    alignItems: "flex-start",
    gap: "14px",
    justifyContent: "center",
    flex: 1
  }}>
          {renderPeek(prevPeek, "left")}
          {}
          {Array.from({
    length: columns
  }).map((_, i) => {
    const img = visible[i];
    const slotStyle = {
      margin: 0,
      flex: "1 1 0",
      maxWidth: THUMB_MAX_WIDTH + "px",
      minWidth: 0
    };
    if (!img) {
      return <div key={start + i} aria-hidden="true" style={{
        ...slotStyle,
        visibility: "hidden"
      }} />;
    }
    return <div key={start + i} style={slotStyle}>
                <span data-carousel-imgbox style={{
      display: "block"
    }}>
                  <img src={img.src} alt={img.alt ?? ""} style={{
      display: "block",
      width: "100%",
      height: "auto",
      margin: 0,
      borderRadius: "10px",
      border: "1px solid var(--ad-border, #e4e5e7)"
    }} />
                </span>
                {img.alt && <div style={{
      marginTop: "6px",
      fontSize: "12px",
      lineHeight: 1.4,
      color: "var(--ad-muted, #6b7280)",
      textAlign: "center"
    }}>
                    {img.alt}
                  </div>}
              </div>;
  })}
          {renderPeek(nextPeek, "right")}
        </div>

        {showControls && <button type="button" onClick={next} aria-label="Next screenshots" style={arrowStyle}>
            ›
          </button>}
      </div>

      {showControls && <div style={{
    textAlign: "center",
    marginTop: "8px",
    fontSize: "12px",
    color: "var(--ad-muted, #6b7280)"
  }}>
          {start + 1}
          {visible.length > 1 ? "–" + (start + visible.length) : ""} of {count}
        </div>}
    </div>;
};

## Creating a deposit address

To receive a deposit, you need a deposit address for that asset. Creating a deposit address generates a new wallet and prompts you to download the encrypted wallet key. An encrypted wallet key can be decrypted and exported if you choose to import the wallet into another service provider.

<Warning>
  The encrypted wallet key is NOT sensitive unless decrypted. Only administrators can decrypt the wallet key to import it into another wallet service provider.
</Warning>

### Getting a deposit address (iOS)

<Steps>
  <Step title="Navigate to the vault">
    Go to the desired vault and tap **Deposit**, then select the asset.
  </Step>

  <Step title="Download the encrypted wallet key">
    Tap **Download wallet key** (or tap **Why does this matter** to learn more). Choose your save method—for example, tap **Save to files**. If you already have wallet keys downloaded, select **Keep both** and rename them.
  </Step>

  <Step title="Copy or share your deposit address">
    After saving your wallet keys and tapping **Continue**, select the wallet to view its address. Copy or share the deposit address or QR code with the sending party.
  </Step>
</Steps>

<ImageCarousel>
  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-add-wallet-disclaimer.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=b2f3ce787183ae379420a1b7b22435b8" alt="Create new wallet disclaimer screen explaining that wallets are unique and self-custodied" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-add-wallet-disclaimer.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-add-wallet-download-key.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=545915e81d13e0fe800c4b714f7711b7" alt="Download encrypted key screen with a Download wallet key button" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-add-wallet-download-key.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-wallet-detail-address.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=89868f5af0428da751d91a4a387831fb" alt="New wallet's detail screen showing its deposit address, QR code icon, and copy icon" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-wallet-detail-address.png" />
</ImageCarousel>

### Getting a deposit address (web dashboard)

<Steps>
  <Step title="Navigate to the vault">
    Go to the desired vault in the web dashboard and select the asset.
  </Step>

  <Step title="Select or create a wallet">
    Select an existing wallet or create a new one.
  </Step>

  <Step title="Copy the deposit address">
    Copy and share the address with the sending party.
  </Step>
</Steps>

<Note>
  Vault members receive a notification every time a deposit is made to the vault.
</Note>

## Requesting new asset support

Porto supports hundreds of assets, including all ERC-20 and SPL tokens—even those not explicitly listed in the app.

<Steps>
  <Step title="Search for the asset">
    In the iOS app, go to **Settings** and tap **Supported assets**. Search for the asset by name or symbol.
  </Step>

  <Step title="Submit a support request">
    If the asset is not yet supported, tap to submit an asset support request.
  </Step>
</Steps>

<Info>
  You can self-custody all ERC-20 and SPL assets, including assets not shown in the app. For faster processing, include the token's contract address in your request.
</Info>

For further questions, contact [portohelp@anchorage.com](mailto:portohelp@anchorage.com).

## Finding an ERC-20 token contract address

Block explorers let you view and search the blockchain for transactions, addresses, tokens, and other activity. Having a token's contract address allows you to add the token directly on Porto by pasting the address into the Asset Support Request form.

<Steps>
  <Step title="Visit the block explorer for the token's network">
    * Aptos: [explorer.aptoslabs.com](https://explorer.aptoslabs.com/?network=mainnet)
    * Arbitrum: [arbiscan.io](https://arbiscan.io/)
    * Base: [basescan.org](https://basescan.org/)
    * Ethereum: [etherscan.io](https://etherscan.io/)
    * Optimism: [optimistic.etherscan.io](https://optimistic.etherscan.io/)
    * Plume: [explorer.plumenetwork.xyz](https://explorer.plumenetwork.xyz/)
    * Polygon: [polygonscan.com](https://polygonscan.com/)
    * Solana: [solscan.io](https://solscan.io/)
    * ZKSync: [explorer.zksync.io](https://explorer.zksync.io/)
  </Step>

  <Step title="Search for the token">
    Search for the token using its name or symbol.
  </Step>

  <Step title="Copy the contract address">
    The contract address will be clearly indicated on the token's page. Copy it for use in the Porto Asset Support Request form.
  </Step>
</Steps>
