Swap
Narok • ERC‑4626 Vault

Whitepaper do NK — Visão, Componentes e Funcionamento

Este documento descreve a arquitetura do Narok Vault (ERC‑4626), o token de shares NK, o fluxo operacional de depósito/redeem, a mecânica de taxas (1% AUM streaming, 2% saída) e as integrações periféricas (DEX e keeper). A estrutura segue um formato de documentação com menu lateral, inspirado em projetos como zkSync.

Resumo rápido: Depositar USDC no Vault → receber NK. O bot/estratégia opera fora do contrato; lucros retornam ao Vault, elevando totalAssets e o preço por share (PPS). O resgate oficial usa redeem() e aplica taxa de 2% (1% dev / 1% sustentabilidade). A taxa de gestão (1% a.a.) é streamada via diluição programática (mint de NK à tesouraria), acionada por poke() e/ou por chamadas usuais do Vault.

Visão de alto nível

O Narok Vault é um cofre compatível com ERC‑4626 cuja unidade de participação é o token NK (shares). O ativo subjacente recomendado é USDC. Usuários depositam USDC e recebem NK proporcionalmente ao NAV (patrimônio/quotas). Os resultados da estratégia de negociação (bot) retornam ao cofre, elevando o totalAssets e o preço por share (PPS). Saídas são feitas pelo fluxo oficial redeem(), onde incide a taxa de 2% (split 1%/1%).

Vault (ERC‑4626)

Responsável por custodiar o ativo base e emitir/queimar shares. Principais propriedades:

  • Ativo canônico: USDC (recomendado). Outros ativos podem entrar via router de front‑end (swap prévio → deposit()).
  • Mecânica ERC‑4626: deposit(), mint(), withdraw(), redeem(), e funções preview*.
  • AUM 1% a.a. (streaming): implementada via mint periódico de NK à(s) tesouraria(s), acionado por poke() ou ao interagir com o cofre.
  • Saída 2%: cobrada somente no redeem() oficial (não em swaps DEX).

NK (shares)

Token que representa a fração do Vault. Ao depositar assets, o usuário recebe shares; ao resgatar, queima shares e recebe assets líquidos da taxa de saída.

PPS = totalAssets / totalShares  // NAV por NK

// Mint de shares (ERC‑4626):
if (totalSupply > 0) {
  sharesMintadas = assets * totalShares / totalAssets;
} else {
  sharesMintadas = assets; // primeiro depósito, PPS≈1
}

Estratégia (bot)

Opera off‑chain (segredo industrial). Os lucros realizados são enviados de volta ao Vault, elevando totalAssets. O contrato pode expor strategy.rebalance() para realocação autorizada (opcional), invocada por poke() quando o keeper é reconhecido.

Pool DEX (NK/USDC)

Liquidez secundária para trocas rápidas. O resgate oficial permanece via redeem() no Vault (onde incide a taxa de saída). A cotação da pool pode oscilar ao redor do NAV, e a arbitragem tende a aproximar preço de mercado e valor patrimonial.

Keeper opcional

Automação sem servidor para chamar periodicamente poke(), que realiza o accrual da AUM (e opcionalmente strategy.rebalance()). Pode ser configurado em serviços como Gelato/Defender. Parâmetros como setKeeper e setMinPokeInterval são on‑chain.

1) Depósito (mint NK)

  1. Carteira conecta e aprova USDC ao Vault.
  2. Chama deposit(assets, receiver) → Vault cunha NK para o usuário.
// ERC‑4626 (resumo)
sharesMintadas = (totalShares > 0)
  ? assets * totalShares / totalAssets
  : assets;

USDT? Faça swap USDT→USDC via DEX no front (ou router) e então chame deposit() com USDC.

2) Valorização (NAV sobe)

Lucro do bot → totalAssets cresce → PPS (NAV por NK) aumenta. A AUM 1% a.a. é streamada via mint de shares à tesouraria, proporcional ao tempo decorrido, acionada por poke() e/ou interações usuais.

3) Saída (redeem com taxa 2%)

  1. Usuário aprova NK ao Vault.
  2. Chama redeem(shares, receiver, owner) → queima NK e envia USDC líquidos (–2%).
assetsBruto = shares * totalAssets / totalShares
assetsLiq   = assetsBruto * (1 - 0.02) // 2% (1% dev / 1% sustain)

DEX: também é possível trocar NK↔USDC na pool, mas o preço pode ficar < ou > NAV. O botão de “Resgatar” no site deve sempre usar redeem() para garantir a aplicação da taxa de saída.

Taxas — o que acontece de verdade

  • AUM 1%/ano (streaming): o contrato mina NK para a(s) tesouraria(s), diluindo levemente os demais holders. Efeito econômico ≈ 1% a.a. de gestão, sem tocar no USDC do cofre.
  • Saída 2% (apenas no redeem oficial): split 1% dev / 1% sustentabilidade.

Exemplo numérico

Cenário

  • Depósito inicial: 1.000 USDC → PPS≈1.00 → 1.000 NK
  • Lucro bruto após 1 ano: +15% → patrimônio 1.150 USDC
  • AUM 1% (via diluição) → impacto ≈ −1% no desempenho
  • Resgate oficial: taxa de saída 2%

Cálculo

valorAposAUM ≈ 1.150 × (1 - 0.01) = 1.138,5 USDC
resgateLiq  ≈ 1.138,5 × 0.98 ≈ 1.115,7 USDC
resultado   ≈ +11,6% no ano (ilustrativo)

Componentes que você tem no starter (Python/Ape)

  • NarokVault (ERC‑4626): NK como share, AUM 1%/ano (streaming), saída 2% no redeem/withdraw.
  • Automação: poke() e needsPoke() para keepers (Gelato/Defender).
  • Admin: setKeeper, setStrategy, setMinPokeInterval.
  • Scripts: deploy.py, deposit_usdc.py, deposit_usdt.py (mock), redeem.py, poke.py, etc.

Operação recomendada (V1)

  1. Fixe ativo canônico (USDC) e endereços de tesouraria (dev/sustain) — idealmente em multisig.
  2. Deploy em testnet (ex.: Arbitrum Sepolia). Valide depósitos, resgates e accrual da AUM.
  3. Crie pool NK/USDC com preço inicial = NAV (ex.: 1 NK = 1 USDC).
  4. Front estático: botões Depositar (mint NK), Resgatar (redeem oficial) e Swap (DEX); exiba NAV/PPS lendo totalAssets/totalSupply.
  5. (Opcional) Configure keeper para chamar poke() a cada 6–12h.

Front‑end e UX

  • Botão “Resgatar” deve usar redeem() do Vault (e não swap direto), para garantir a taxa de saída.
  • Exiba NAV/PPS, TVL, APY histórico (se disponível) e último poke.
  • Adicione avisos claros sobre risco de mercado e variação entre preço da DEX e NAV.

Parametrização on‑chain

Controles administrativos mínimos e auditáveis:

  • setKeeper(address) — autoriza/desautoriza keeper.
  • setStrategy(address) — define contrato de estratégia (se aplicável).
  • setMinPokeInterval(uint256) — espaçamento mínimo entre pokes.
  • Endereços dev e sustain (split 1%/1% na saída) — idealmente multisig.

Riscos e mitigações

  • Risco de mercado: performance da estratégia pode variar; NAV pode cair.
  • Risco de smart contract: bugs; mitigar com auditorias, tests e bounties.
  • Risco de liquidez DEX: spreads/slippage; orientar resgate oficial pelo Vault.
  • Risco operacional: parametrização incorreta de keeper ou endereços; usar multisig e timelocks quando aplicável.

Disclaimer

Este material tem caráter informativo e não constitui recomendação de investimento. Criptoativos envolvem riscos significativos, incluindo perda total do capital. Faça sua própria pesquisa e considere consultar profissionais qualificados.

Interfaces ERC‑4626 relevantes

// Funções de uso comum
function deposit(uint256 assets, address receiver) returns (uint256 shares);
function redeem(uint256 shares, address receiver, address owner) returns (uint256 assets);
function totalAssets() view returns (uint256);
function convertToShares(uint256 assets) view returns (uint256 shares);
function convertToAssets(uint256 shares) view returns (uint256 assets);
// Pré-visualizações
function previewDeposit(uint256 assets) view returns (uint256);
function previewRedeem(uint256 shares) view returns (uint256);

Glossário

  • NAV (Net Asset Value): valor patrimonial do Vault por share (PPS).
  • PPS (Preço por Share): totalAssets/totalShares.
  • TVL (Total Value Locked): patrimônio total do Vault.
  • Keeper: automação que chama poke() para accrual e, opcionalmente, rebalance.

Perguntas frequentes (FAQ)

Posso depositar USDT?

Sim, efetuando swap USDT→USDC no front (ou router) antes de chamar deposit().

Por que a taxa de saída é cobrada só no redeem?

Para preservar a neutralidade do cofre e evitar fricção em operações de mercado secundário (DEX). O fluxo oficial captura a taxa ao realizar o resgate patrimonial.

O que acontece se o preço na DEX divergir do NAV?

Arbitradores tendem a trazer o preço para perto do NAV. Usuários têm a opção de usar o resgate oficial para garantir NAV – taxa.

Qual a frequência recomendada de poke()?

Tipicamente a cada 6–12 horas, mas isso depende do volume de interações com o Vault e das preferências operacionais.