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

# International wire withdrawals at Anchorage Digital Singapore

> Add an international USD trusted destination and send USD by international wire from Anchorage Digital Singapore.

export const ImageCarousel = ({images, perView = 3, thumbMaxWidth = 220, children}) => {
  const [page, setPage] = useState(0);
  const [imgH, setImgH] = useState(0);
  const [zoomIdx, setZoomIdx] = useState(null);
  const stripRef = useRef(null);
  const THUMB_MAX_WIDTH = thumbMaxWidth;
  const PEEK_WIDTH = 34;
  const STAGE_HEIGHT = 460;
  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 || [];
  const count = items.length;
  const columns = Math.min(perView, count) || 1;
  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 zoomTo = i => {
    const idx = (i % count + count) % count;
    setZoomIdx(idx);
    setPage(Math.floor(idx / columns));
  };
  useEffect(() => {
    if (zoomIdx === null) return;
    const item = items[zoomIdx];
    const overlay = document.createElement("div");
    overlay.setAttribute("role", "dialog");
    overlay.setAttribute("aria-modal", "true");
    overlay.setAttribute("aria-label", item.alt || "Screenshot");
    Object.assign(overlay.style, {
      position: "fixed",
      top: "0",
      left: "0",
      right: "0",
      bottom: "0",
      zIndex: "2147483000",
      background: "rgba(5, 5, 5, 0.98)",
      display: "flex",
      alignItems: "center",
      justifyContent: "center",
      padding: "24px 72px",
      cursor: "zoom-out"
    });
    const img = document.createElement("img");
    img.src = item.src;
    img.alt = item.alt || "";
    Object.assign(img.style, {
      maxWidth: "94vw",
      maxHeight: "88vh",
      width: "auto",
      height: "auto",
      borderRadius: "10px",
      boxShadow: "0 8px 40px rgba(0, 0, 0, 0.5)",
      cursor: "zoom-out"
    });
    overlay.appendChild(img);
    const makeButton = (label, text, position) => {
      const b = document.createElement("button");
      b.type = "button";
      b.setAttribute("aria-label", label);
      b.textContent = text;
      Object.assign(b.style, {
        position: "absolute",
        width: "40px",
        height: "40px",
        borderRadius: "50%",
        border: "1px solid rgba(255, 255, 255, 0.35)",
        background: "rgba(255, 255, 255, 0.16)",
        color: "#fff",
        fontSize: "20px",
        lineHeight: "38px",
        textAlign: "center",
        cursor: "pointer",
        padding: "0"
      }, position);
      overlay.appendChild(b);
      return b;
    };
    const closeButton = makeButton("Close", "×", {
      top: "18px",
      right: "18px"
    });
    let prevButton = null;
    let nextButton = null;
    if (count > 1) {
      prevButton = makeButton("Previous screenshot", "‹", {
        left: "18px",
        top: "calc(50% - 20px)"
      });
      nextButton = makeButton("Next screenshot", "›", {
        right: "18px",
        top: "calc(50% - 20px)"
      });
      const counter = document.createElement("div");
      counter.textContent = `${zoomIdx + 1} of ${count}`;
      Object.assign(counter.style, {
        position: "absolute",
        bottom: "16px",
        left: "0",
        right: "0",
        textAlign: "center",
        fontSize: "13px",
        color: "rgba(255, 255, 255, 0.85)"
      });
      overlay.appendChild(counter);
    }
    const close = () => setZoomIdx(null);
    overlay.addEventListener("click", e => {
      if (e.target === prevButton || e.target === nextButton) return;
      close();
    });
    if (prevButton) prevButton.addEventListener("click", () => zoomTo(zoomIdx - 1));
    if (nextButton) nextButton.addEventListener("click", () => zoomTo(zoomIdx + 1));
    const onKey = e => {
      if (e.key === "Escape") close(); else if (e.key === "ArrowLeft") zoomTo(zoomIdx - 1); else if (e.key === "ArrowRight") zoomTo(zoomIdx + 1);
    };
    window.addEventListener("keydown", onKey);
    const previousOverflow = document.body.style.overflow;
    document.body.style.overflow = "hidden";
    document.body.appendChild(overlay);
    closeButton.focus();
    return () => {
      window.removeEventListener("keydown", onKey);
      document.body.style.overflow = previousOverflow;
      overlay.remove();
    };
  }, [zoomIdx]);
  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();
  }, []);
  if (!items.length) return null;
  const start = page * columns;
  const visible = items.slice(start, start + columns);
  const zoomBtnStyle = {
    position: "absolute",
    zIndex: 2,
    width: "40px",
    height: "40px",
    borderRadius: "50%",
    border: "1px solid rgba(255, 255, 255, 0.3)",
    background: "rgba(255, 255, 255, 0.14)",
    color: "#fff",
    fontSize: "20px",
    lineHeight: "38px",
    textAlign: "center",
    cursor: "pointer",
    padding: 0
  };
  const pager = 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> : null;
  if (perView === 1) {
    const img = items[page];
    const overlayArrow = side => {
      const isLeft = side === "left";
      return <button type="button" onClick={isLeft ? prev : next} aria-label={isLeft ? "Previous screenshot" : "Next screenshot"} style={{
        position: "absolute",
        top: "50%",
        transform: "translateY(-50%)",
        [isLeft ? "left" : "right"]: "10px",
        zIndex: 2,
        width: "36px",
        height: "36px",
        borderRadius: "50%",
        border: "1px solid var(--ad-border, #e4e5e7)",
        background: "var(--background, #fff)",
        boxShadow: "0 1px 6px rgba(0, 0, 0, 0.25)",
        fontSize: "18px",
        lineHeight: "34px",
        textAlign: "center",
        cursor: "pointer",
        padding: 0
      }}>
          {isLeft ? "‹" : "›"}
        </button>;
    };
    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={{
      position: "relative"
    }}>
          <div style={{
      height: STAGE_HEIGHT + "px",
      display: "flex",
      alignItems: "center",
      justifyContent: "center"
    }}>
            <button type="button" onClick={() => setZoomIdx(page)} aria-label={"Enlarge: " + (img.alt || "screenshot")} style={{
      display: "block",
      maxWidth: "100%",
      maxHeight: "100%",
      border: 0,
      padding: 0,
      background: "none",
      cursor: "zoom-in"
    }}>
              <img src={img.src} alt={img.alt ?? ""} style={{
      display: "block",
      maxWidth: "100%",
      maxHeight: STAGE_HEIGHT + "px",
      width: "auto",
      height: "auto",
      margin: "0 auto",
      borderRadius: "10px",
      border: "1px solid var(--ad-border, #e4e5e7)"
    }} />
            </button>
          </div>

          {showControls && overlayArrow("left")}
          {showControls && overlayArrow("right")}
        </div>

        {img.alt && <div style={{
      marginTop: "8px",
      fontSize: "13px",
      lineHeight: 1.4,
      color: "var(--ad-muted, #6b7280)",
      textAlign: "center"
    }}>
            {img.alt}
          </div>}

        {pager}
      </div>;
  }
  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}>
                <button type="button" data-carousel-imgbox onClick={() => setZoomIdx(start + i)} aria-label={"Enlarge: " + (img.alt || "screenshot")} style={{
      display: "block",
      width: "100%",
      border: 0,
      padding: 0,
      background: "none",
      cursor: "zoom-in"
    }}>
                  <img src={img.src} alt={img.alt ?? ""} style={{
      display: "block",
      maxWidth: "100%",
      maxHeight: Math.round(THUMB_MAX_WIDTH * 1.4) + "px",
      width: "auto",
      height: "auto",
      margin: "0 auto",
      borderRadius: "10px",
      border: "1px solid var(--ad-border, #e4e5e7)"
    }} />
                </button>
                {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>

      {pager}
    </div>;
};

International wire over SWIFT is the only way to send USD from an Anchorage Digital Singapore (ADS) USD wallet. You first add the recipient's bank information as a trusted destination, then initiate a withdrawal from your USD wallet.

## Adding a USD trusted destination

You must be an administrator with trusted destination management permissions. You'll need your iOS device for biometric approval.

<Steps>
  <Step title="Navigate to trusted destinations">
    Go to **Settings** and select **Trusted destinations**.
  </Step>

  <Step title="Add a USD trusted destination">
    Select **Add trusted destination**, then select **Add single (Fiat)**.
  </Step>

  <Step title="Complete recipient information">
    Fill in the required information for the recipient account holder.
  </Step>

  <Step title="Select wire type and bank details">
    Select **International** for the bank account type. Fill in the required bank information and select **Preview**. The **Domestic** option isn't available to ADS organizations, even for recipients in the United States.

    <Note>
      Add an intermediary bank only when the receiving bank's wire instructions name one. Otherwise, leave it blank.
    </Note>
  </Step>

  <Step title="Review and submit">
    Review the operation and select **Confirm and submit for approval**. Complete biometric endorsement. Once the required quorum and sub-quorum approvals are submitted, Anchorage Digital will review the trusted destination.
  </Step>
</Steps>

<Note>
  If you enter information in the **Memo** field, it pre-populates whenever you use this trusted destination for a withdrawal. You can still edit the memo during the withdrawal.
</Note>

## Sending USD

Once a trusted destination is approved, initiate a withdrawal from the iOS app or web dashboard.

<Steps>
  <Step title="Select vault and initiate withdrawal">
    Select the vault and tap **Withdraw**.
  </Step>

  <Step title="Select asset and destination">
    Select **USD** as the asset type and **Trusted Destination** as the destination type. Choose the international trusted destination you want to send funds to.
  </Step>

  <Step title="Enter amount">
    Enter the USD withdrawal amount. The **Add memo** field is optional and is pre-populated if a memo was included when the trusted destination was created.
  </Step>

  <Step title="Review and endorse">
    Review the withdrawal and select **Confirm and endorse withdrawal**. Vault members included in your withdrawal policy will receive a notification to approve the withdrawal.
  </Step>
</Steps>

<ImageCarousel>
  <img src="https://mintcdn.com/deployment-4/dnKKK5u4vRePxCW5/knowledge-base/images/screenshots/usd-withdraw-asset-selection.png?fit=max&auto=format&n=dnKKK5u4vRePxCW5&q=85&s=0422f1102b08f178251936d631372981" alt="Withdraw screen for selecting USD as the asset type" width="828" height="1792" data-path="knowledge-base/images/screenshots/usd-withdraw-asset-selection.png" />

  <img src="https://mintcdn.com/deployment-4/dnKKK5u4vRePxCW5/knowledge-base/images/screenshots/usd-withdraw-amount.png?fit=max&auto=format&n=dnKKK5u4vRePxCW5&q=85&s=c5c3d32b082225e2f24e273ab325a969" alt="USD withdrawal amount screen" width="828" height="1792" data-path="knowledge-base/images/screenshots/usd-withdraw-amount.png" />

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

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

  <img src="https://mintcdn.com/deployment-4/dnKKK5u4vRePxCW5/knowledge-base/images/screenshots/usd-withdraw-review.png?fit=max&auto=format&n=dnKKK5u4vRePxCW5&q=85&s=22129979c997fcf79f64d807658f254e" alt="Review screen for the USD withdrawal before biometric approval" width="828" height="1792" data-path="knowledge-base/images/screenshots/usd-withdraw-review.png" />
</ImageCarousel>

Once the required quorum and sub-quorum approvals are submitted, Anchorage Digital will review the withdrawal for approval.

## Processing and settlement times

Wires are processed between 7:00 AM and 11:00 PM Singapore time (SGT). A withdrawal that completes approval after 11:00 PM SGT is sent in the next processing window.

Withdrawals to counterparties that bank with Standard Chartered can settle at any hour, including weekends and holidays. Other international wires can take more than one business day to reach the beneficiary.


## Related topics

- [Wire withdrawals at Anchorage Digital Singapore](/knowledge-base/platform/users/usd-withdrawals/ads/wire-withdrawals-overview.md)
- [Wire withdrawal FAQs for Anchorage Digital Singapore](/knowledge-base/platform/users/usd-withdrawals/ads/wire-withdrawal-faqs.md)
- [International wire deposits at Anchorage Digital Singapore](/knowledge-base/platform/users/usd-deposits/ads/international-wire-deposits.md)
- [Wire deposits at Anchorage Digital Singapore](/knowledge-base/platform/users/usd-deposits/ads/wire-deposits-overview.md)
- [Wire deposit FAQs for Anchorage Digital Singapore](/knowledge-base/platform/users/usd-deposits/ads/wire-deposit-faqs.md)
