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

# Policies

> Configure vault policies, manage rules, and set up quorum approvals.

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

Policies define the approval requirements for operations across your organization. Rules within a policy act as safety checks: when a specific action (the trigger) occurs, the rule determines who must approve it and how many approvals are needed.

Rules operate at two levels:

* **Admin policy** — Applies to organization-wide operations such as inviting users.
* **Vault policies** — Applies to asset-specific operations in vaults the policy is assigned to, such as withdrawing funds.

When a rule is triggered, the required administrators receive a notification to review the request. Once the necessary quorum is met, Anchorage Digital performs a final review of the operation.

To add, edit, or delete rules and configure their quorums and sub-quorums, see [Rules](/knowledge-base/platform/users/rules).

## Managing policies on iOS

You can view and edit vault policies directly from the Anchorage Digital iOS app under the vault settings.

<ImageCarousel>
  <img src="https://mintcdn.com/deployment-4/0Ay5l5a1-AHLFRG8/knowledge-base/images/screenshots/anchorage-policies-1.png?fit=max&auto=format&n=0Ay5l5a1-AHLFRG8&q=85&s=3f72bf2a6f277a90acb5c4865286b184" alt="Vault settings showing Policies section" width="568" height="1224" data-path="knowledge-base/images/screenshots/anchorage-policies-1.png" />

  <img src="https://mintcdn.com/deployment-4/0Ay5l5a1-AHLFRG8/knowledge-base/images/screenshots/anchorage-policies-2.png?fit=max&auto=format&n=0Ay5l5a1-AHLFRG8&q=85&s=9ffc89e912db45c990557193ffe51c73" alt="Policy details screen showing rules and configuration" width="572" height="1226" data-path="knowledge-base/images/screenshots/anchorage-policies-2.png" />

  <img src="https://mintcdn.com/deployment-4/0Ay5l5a1-AHLFRG8/knowledge-base/images/screenshots/anchorage-policies-3.png?fit=max&auto=format&n=0Ay5l5a1-AHLFRG8&q=85&s=f22a48fa6efc18d02b4737e0b430055a" alt="Policy rules list with edit and delete options" width="564" height="1226" data-path="knowledge-base/images/screenshots/anchorage-policies-3.png" />

  <img src="https://mintcdn.com/deployment-4/0Ay5l5a1-AHLFRG8/knowledge-base/images/screenshots/anchorage-policies-4.png?fit=max&auto=format&n=0Ay5l5a1-AHLFRG8&q=85&s=1ec3b4d3b5f3e4e7411aa81e3e80f00f" alt="Edit policy rule screen with approval requirements" width="568" height="1230" data-path="knowledge-base/images/screenshots/anchorage-policies-4.png" />

  <img src="https://mintcdn.com/deployment-4/0Ay5l5a1-AHLFRG8/knowledge-base/images/screenshots/anchorage-policies-5.png?fit=max&auto=format&n=0Ay5l5a1-AHLFRG8&q=85&s=1561fed6995d4ba7c7bb4705f808663d" alt="Policy users management screen" width="568" height="1228" data-path="knowledge-base/images/screenshots/anchorage-policies-5.png" />

  <img src="https://mintcdn.com/deployment-4/0Ay5l5a1-AHLFRG8/knowledge-base/images/screenshots/anchorage-policies-6.png?fit=max&auto=format&n=0Ay5l5a1-AHLFRG8&q=85&s=0ed2ee80253bcab62559e90a1ba8503c" alt="Review policy changes before submitting for approval" width="566" height="1230" data-path="knowledge-base/images/screenshots/anchorage-policies-6.png" />
</ImageCarousel>

## Conditional rules

<Info>
  Conditional rules are in development and not yet generally available. They will be available in the iOS app and web dashboard first, and are not part of the API at initial release.
</Info>

Today, a rule applies one quorum to every instance of an operation type. Conditional rules will let you vary the approvals required based on the attributes of a specific operation. Planned capabilities include:

* **Trusted destination conditions** — require fewer approvals for withdrawals to a trusted destination, or block withdrawals to any address that isn't a trusted destination.
* **Amount thresholds** — set different approval requirements by transaction amount directly within a rule.
* **Self-serve IP allowlist** — manage the [IP allowlist](/knowledge-base/platform/users/web-dashboard/settings#ip-allowlist) yourself, without contacting Anchorage Digital.
