> ## 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.

# Sending assets

> Withdraw assets, use DApps, manage trusted destinations, and batch endorsements.

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>;
};

## Withdrawals

Withdrawals fall under vault policies. Both administrators and vault members who have been added to a vault can initiate and approve withdrawals.

You may initiate withdrawals in the iOS app or on the web dashboard. If initiated from the web dashboard, biometric approval must be submitted in the iOS app.

### Withdrawing from iOS

<Steps>
  <Step title="Navigate to the vault">
    Go to the desired vault and tap **Withdraw**.
  </Step>

  <Step title="Select asset and wallet">
    Search for and tap the asset you would like to withdraw, then select the wallet from which you would like to withdraw.
  </Step>

  <Step title="Enter amount and destination">
    Enter the withdrawal amount and tap **Continue**. Enter the destination address, scan it, or choose one of your trusted destinations or vaults.
  </Step>

  <Step title="Submit for quorum approval">
    Add a comment (optional), review the withdrawal details, and tap **Submit for approval**. Vault members and administrators will receive a notification to approve the withdrawal via quorum.
  </Step>
</Steps>

<ImageCarousel>
  <img src="https://mintcdn.com/deployment-4/dnKKK5u4vRePxCW5/knowledge-base/images/screenshots/porto-withdraw-asset-selection.png?fit=max&auto=format&n=dnKKK5u4vRePxCW5&q=85&s=62437f08df65ebff69ed30aeeb90adb7" alt="Withdraw screen for searching and selecting the asset to withdraw" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-withdraw-asset-selection.png" />

  <img src="https://mintcdn.com/deployment-4/dnKKK5u4vRePxCW5/knowledge-base/images/screenshots/porto-withdraw-wallet-selection.png?fit=max&auto=format&n=dnKKK5u4vRePxCW5&q=85&s=7484429d0cfeafe185dfa4ab6bf52b45" alt="Wallet list for the selected asset with each wallet's balance" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-withdraw-wallet-selection.png" />

  <img src="https://mintcdn.com/deployment-4/dnKKK5u4vRePxCW5/knowledge-base/images/screenshots/porto-withdraw-amount.png?fit=max&auto=format&n=dnKKK5u4vRePxCW5&q=85&s=df07be6b8349c86a4a6cb7c30780704c" alt="Amount entry screen with a numeric keypad and Set max option" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-withdraw-amount.png" />

  <img src="https://mintcdn.com/deployment-4/dnKKK5u4vRePxCW5/knowledge-base/images/screenshots/porto-withdraw-destination.png?fit=max&auto=format&n=dnKKK5u4vRePxCW5&q=85&s=c8d8f3ad6451aed3887f9f0b9ef7ca4a" alt="Destination screen for entering or scanning the withdrawal address" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-withdraw-destination.png" />

  <img src="https://mintcdn.com/deployment-4/dnKKK5u4vRePxCW5/knowledge-base/images/screenshots/porto-withdraw-comment.png?fit=max&auto=format&n=dnKKK5u4vRePxCW5&q=85&s=e87173d6f7b6209392546a3d0cc199b5" alt="Optional comment screen before reviewing the withdrawal" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-withdraw-comment.png" />

  <img src="https://mintcdn.com/deployment-4/dnKKK5u4vRePxCW5/knowledge-base/images/screenshots/porto-withdraw-review.png?fit=max&auto=format&n=dnKKK5u4vRePxCW5&q=85&s=2898e49f0ad5ef379a1da1a375e7fbfd" alt="Review screen summarizing the withdrawal amount, fee, and destination before submitting for approval" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-withdraw-review.png" />
</ImageCarousel>

### Withdrawing from the web dashboard

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

  <Step title="Select asset, wallet, and amount">
    Select the asset and wallet from which you would like to withdraw, then enter the amount.
  </Step>

  <Step title="Enter destination">
    Enter the destination address to which you would like to send the funds.
  </Step>

  <Step title="Review and submit">
    Review and confirm the information, then submit. Open the iOS app to endorse the withdrawal with biometric approval.
  </Step>
</Steps>

### Quorum approvals

Members of the vault policy will receive a notification to approve the withdrawal. Once the required quorum approvals are submitted, Porto will process the withdrawal.

## Using decentralized apps

You can connect to any decentralized application (dApp) that supports WalletConnect on supported networks. WalletConnect is currently supported on Ethereum, Arbitrum, ZKsync, Base, Optimism, Avalanche C-Chain, and Polygon. You can sign any smart contract interaction using your Porto wallet on these networks.

<Note>
  Only trusted dApps and smart contracts should be used. To request support for additional networks, contact [portohelp@anchorage.com](mailto:portohelp@anchorage.com).
</Note>

### Connecting via WalletConnect (iOS)

<Steps>
  <Step title="Open the QR code scanner">
    Tap the QR code scanner icon in the top right corner of the home page.
  </Step>

  <Step title="Connect to the dApp">
    Open the dApp and initiate a WalletConnect connection. Scan the QR code displayed by the dApp.
  </Step>

  <Step title="Select wallet and confirm">
    Select the wallet you want to connect and tap **Connect**. On-chain token balances will be available within the dApp once connected.
  </Step>
</Steps>

<ImageCarousel>
  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-walletconnect-intro.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=93ee7e847def24c143e38e2db06d2f61" alt="How to use QR codes intro screen explaining WalletConnect" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-walletconnect-intro.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-walletconnect-scanner.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=e8f32d5b5bfc53dd87e49221a33e0f9c" alt="QR code scanner screen for connecting to apps and the web dashboard" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-walletconnect-scanner.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-walletconnect-select-wallet.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=ad4db2a544416b2e01f421a751ec921b" alt="Connect to external app screen for selecting which wallet to connect" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-walletconnect-select-wallet.png" />
</ImageCarousel>

### Interacting with smart contracts

<Steps>
  <Step title="Initiate the operation in the dApp">
    Navigate to the dApp, select an operation (for example, swap), and tap **Confirm**.
  </Step>

  <Step title="Approve in Porto">
    The initiator will receive an approval request in the notifications tab. Tap the bell icon, then tap **Approve** and submit biometric authentication.
  </Step>

  <Step title="Quorum approval">
    Once approved by the initiator, quorum approvers approve or reject the transaction and submit biometric authentication. After the policy quorum is met, the transaction is sent to the HSM for verification and signing.
  </Step>
</Steps>

<Info>
  Once the transaction is broadcast and confirmed, the on-chain interaction will complete within approximately five minutes.
</Info>

## Trusted destinations

Administrators may add trusted destinations to ease and speed up the withdrawal process. Trusted destinations can be shared across assets on the same network.

### Adding a trusted destination

<Steps>
  <Step title="Open trusted destinations">
    Go to **Settings** and tap **Trusted destinations**, then tap **Add trusted destination**.
  </Step>

  <Step title="Search for the asset">
    Search for and select the asset associated with the destination.
  </Step>

  <Step title="Enter destination details">
    Scan or paste the address, then enter a name and description. To use the same trusted destination across assets on the same network, select the checkbox under **Description**.
  </Step>

  <Step title="Submit for approval">
    Review the operation details and submit for quorum approval.
  </Step>
</Steps>

<ImageCarousel>
  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-trusted-destinations-list.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=5e47a220bd1107fcd0a1bd52f6468295" alt="Trusted destinations list with Add trusted destination and Upload multiple from file buttons" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-trusted-destinations-list.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-trusted-destination-asset-selection.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=c090648bb38c2ca4930a9f5589b0c662" alt="Add trusted destination screen for searching and selecting an asset" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-trusted-destination-asset-selection.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-trusted-destination-detail-form.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=4b39f3f6c9e0e8afd1500a833408d011" alt="Add trusted destination form with destination address, name, and description fields" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-trusted-destination-detail-form.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-trusted-destination-review.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=6acb087de3f78ed06918063bd2e82fdc" alt="Review screen for the new trusted destination showing eligible approvers before submitting" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-trusted-destination-review.png" />
</ImageCarousel>

### Adding trusted destinations in bulk (CSV)

Administrators can import multiple trusted destinations at once using a CSV file from the web dashboard. Contact [portohelp@anchorage.com](mailto:portohelp@anchorage.com) for the CSV template and instructions.

### Removing a trusted destination

<Warning>
  Only administrators can remove trusted destinations. Removal requires quorum approval.
</Warning>

<div style={{ display: "flex", gap: "2rem", alignItems: "flex-start" }}>
  <div style={{ flex: 1 }}>
    <Steps>
      <Step title="Open trusted destinations">
        Go to **Settings** and tap **Trusted destinations**.
      </Step>

      <Step title="Select and remove">
        Tap the trusted destination to be removed, then tap **Remove**.
      </Step>

      <Step title="Submit for approval">
        Add a comment (optional), tap **Review** to review the details, and submit for quorum approval.
      </Step>
    </Steps>
  </div>

  <div style={{ flex: "0 0 auto" }}>
    <Frame caption="Trusted destination detail with Remove option">
      <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-trusted-destination-remove.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=d8ae7ea49cf693f5832f109e2b99f1c6" alt="Trusted destination detail screen showing its address and a Remove button" style={{ maxHeight: "300px", width: "auto" }} width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-trusted-destination-remove.png" />
    </Frame>
  </div>
</div>

## Batch endorsements

Multiple operations can be approved simultaneously in the Porto iOS app, allowing for secure and efficient approval of pending activity.

<Steps>
  <Step title="Open pending activity">
    Go to **Pending activity** (bell icon) to see the list of operations awaiting approval.
  </Step>

  <Step title="Select operations">
    Tap **Select** in the top right corner. Select the operations you wish to approve and tap **Confirm and review**.
  </Step>

  <Step title="Review each operation">
    Review each operation's details and select **Approve**, **Reject**, or **Review later** as appropriate.
  </Step>

  <Step title="Submit biometric approval">
    Once finished, review the selection for each operation and follow the prompts to submit biometric approval.
  </Step>
</Steps>

<ImageCarousel>
  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-batch-activity-screen.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=dbb274841f70a9c942071bf9fd04240d" alt="Pending activity list showing three operations awaiting approval" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-batch-activity-screen.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-batch-select-operations.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=508572ea81dc2d3b36c261dcbdf22c82" alt="Select operations screen with all three operations checked and Confirm and review highlighted" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-batch-select-operations.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-batch-review-1-details.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=c00d6140be6586971e485225b82ef8dd" alt="Review operation 1 of 3 showing a withdrawal's amount, fee, and destination" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-batch-review-1-details.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-batch-review-1-approve.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=0f15d47cb7cf22c2b98ae5d11cf81c6d" alt="Review operation 1 of 3 with Approve, Reject, and Review later options" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-batch-review-1-approve.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-batch-review-2-reject.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=85fc3e2d30137b46a5bf2556c1b3fff1" alt="Review operation 2 of 3 with Reject highlighted" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-batch-review-2-reject.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-batch-review-3-details.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=b37b017f25f8f28c76a4daacf95db787" alt="Review operation 3 of 3 showing an Add trusted destination operation's details" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-batch-review-3-details.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-batch-review-3-later.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=9831696f0110729892ada6dc2c65d586" alt="Review operation 3 of 3 with Review later highlighted" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-batch-review-3-later.png" />

  <img src="https://mintcdn.com/deployment-4/3eHo4c6eQNfdmseu/knowledge-base/images/screenshots/porto-batch-summary.png?fit=max&auto=format&n=3eHo4c6eQNfdmseu&q=85&s=88fe98326b306300855b121c6e1c1250" alt="Summary screen listing the chosen outcome for each operation with a Continue and endorse button" width="828" height="1792" data-path="knowledge-base/images/screenshots/porto-batch-summary.png" />
</ImageCarousel>

Batched endorsements are processed once the required quorum is met.
