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)
- Carteira conecta e aprova USDC ao Vault.
- 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%)
- Usuário aprova NK ao Vault.
- 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()
eneedsPoke()
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)
- Fixe ativo canônico (USDC) e endereços de tesouraria (dev/sustain) — idealmente em multisig.
- Deploy em testnet (ex.: Arbitrum Sepolia). Valide depósitos, resgates e accrual da AUM.
- Crie pool NK/USDC com preço inicial = NAV (ex.: 1 NK = 1 USDC).
- Front estático: botões Depositar (mint NK), Resgatar (redeem oficial) e Swap (DEX); exiba NAV/PPS lendo
totalAssets
/totalSupply
. - (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.