Інтеграція з Anchorage Digital
Anchorage Digital — перший federally chartered крипто-банк у США (OCC charter, 2021). Для продуктів, що працюють з institutional клієнтами або вимагають банківського рівня кастодії, Anchorage — серйозний варіант. Не потрібно будувати власну кастодіальну інфраструктуру, отримувати окремі ліцензії на зберігання, договарюватися зі страховщиками — все це Anchorage бере на себе. Інтеграція через API дозволяє вбудувати institutional-grade custody прямо у ваш продукт.
Що дає інтеграція
Anchorage надає REST API для управління:
- Custody — зберігання активів з апаратною ізоляцією ключів (HSM-based, не pure software)
- Transactions — створення, підписання й broadcast on-chain транзакцій через кастодіальний pipeline
- Staking — делегування для PoS активів (ETH, SOL, MATIC, ADA й інші) з reporting
- Trading — OTC trading desk інтеграція
- Governance — on-chain голосування від імені кастодійованих активів
API побудований на REST принципах, аутентифікація через JWT + API ключі. Sandbox середовище доступне для розробки.
Архітектура інтеграції
Аутентифікація й безпека
Anchorage використовує двохрівневу аутентифікацію: API ключ + підпис запиту. Кожен запит повинен бути підписаний приватним ключем, публічний аналог якого зареєстрований у системі:
import crypto from "crypto";
interface AnchorageRequestSigner {
apiKeyId: string;
privateKey: string; // PEM формат, ECDSA P-256
}
function signRequest(
signer: AnchorageRequestSigner,
method: string,
path: string,
body: object | null,
timestamp: number
): string {
const bodyString = body ? JSON.stringify(body) : "";
const payload = `${timestamp}${method}${path}${bodyString}`;
const sign = crypto.createSign("SHA256");
sign.update(payload);
const signature = sign.sign(signer.privateKey, "base64");
return `Signature keyId="${signer.apiKeyId}",algorithm="ecdsa-p256",signature="${signature}"`;
}
async function anchorageRequest(
signer: AnchorageRequestSigner,
method: string,
path: string,
body?: object
): Promise<Response> {
const timestamp = Math.floor(Date.now() / 1000);
const authHeader = signRequest(signer, method, path, body ?? null, timestamp);
return fetch(`https://api.anchorage.com${path}`, {
method,
headers: {
"Content-Type": "application/json",
"Api-Access-Key": signer.apiKeyId,
"Authorization": authHeader,
"X-Timestamp": String(timestamp),
},
body: body ? JSON.stringify(body) : undefined,
});
}
Створення транзакції й approval workflow
Транзакції проходять через configurable approval workflow. Це не просто "відправити й забути" — залежно від налаштувань vault транзакція може вимагати підтвердження від кількох операторів, мобільного додатка Anchorage (out-of-band approval), або автоматично виконуватися якщо проходить policy rules.
interface CreateTransactionRequest {
vaultId: string;
assetType: string; // "ETHEREUM", "BITCOIN", "SOLANA" тощо
destinationAddress: string;
amount: string; // у базових одиницях (wei для ETH)
note?: string;
externalTxId?: string; // ваш внутрішній ID для ідемпотентності
}
async function createWithdrawal(
signer: AnchorageRequestSigner,
request: CreateTransactionRequest
): Promise<{ transactionId: string; status: string }> {
const response = await anchorageRequest(
signer, "POST", "/v2/transactions", request
);
if (!response.ok) {
const error = await response.json();
throw new Error(`Anchorage API error: ${error.message}`);
}
return response.json();
}
// Polling статусу — транзакція проходить через PENDING_APPROVAL → APPROVED → BROADCASTING → DONE
async function waitForTransaction(
signer: AnchorageRequestSigner,
transactionId: string,
timeoutMs = 300_000
): Promise<string> {
const start = Date.now();
while (Date.now() - start < timeoutMs) {
const response = await anchorageRequest(
signer, "GET", `/v2/transactions/${transactionId}`
);
const tx = await response.json();
if (tx.status === "DONE") return tx.txHash;
if (["FAILED", "REJECTED"].includes(tx.status)) {
throw new Error(`Transaction ${tx.status}: ${tx.rejectionReason}`);
}
await new Promise(resolve => setTimeout(resolve, 5000));
}
throw new Error("Transaction polling timeout");
}
Робота з балансами й адресами
Anchorage організує активи в vaults (логічні сховища) й wallets (адреси конкретних активів всередині vault). Зазвичай створює окремий vault для кожного клієнта:
// Отримати баланс конкретного активу у vault
async function getVaultBalance(
signer: AnchorageRequestSigner,
vaultId: string,
assetType: string
): Promise<{ available: string; total: string }> {
const response = await anchorageRequest(
signer, "GET", `/v2/vaults/${vaultId}/assets/${assetType}`
);
const asset = await response.json();
return {
available: asset.availableBalance,
total: asset.totalBalance,
};
}
// Отримати адресу депозиту для поповнення
async function getDepositAddress(
signer: AnchorageRequestSigner,
vaultId: string,
assetType: string
): Promise<string> {
const response = await anchorageRequest(
signer, "GET", `/v2/vaults/${vaultId}/assets/${assetType}/addresses`
);
const data = await response.json();
return data.addresses[0].address;
}
Типові сценарії інтеграції
Exchange / торгова платформа — кастодія коштів користувачів у Anchorage vaults, вывід через Transaction API з approval workflow, депозити через webhook сповіщення про вхідні транзакції.
Fund administrator — створення окремого vault для кожного фонду, staking через Anchorage Earn, reporting через Transaction history API.
Corporate treasury — управління treasury у кількох активах, автоматичні ребалансування через API, аудит trail для compliance.
Обмеження й що потрібно знати
Anchorage — не self-service. Інтеграція починається з enterprise sales процесу, KYB, підписання контракту. Sandbox доступен після initial approval. Pricing — за договоренням, як правило basis points від AUM + фіксована плата за транзакції.
Transaction finality залежить від approval policy: якщо налаштований manual approval, час від створення до виконання може становити години. Це потрібно враховувати в UX — користувач повинен розуміти що вывід не миттєвий.
Підтримувані активи постійно розширюються, але екзотичні L2 токени можуть відсутніти. Перевіряйте актуальний список через /v2/assets ендпоінт перед дизайном.







