Tecnología · smart contracts · código abierto
TECNOLOGÍA PARA TOKENIZAR.
REGISTROS PARA VERIFICAR.
Esta página presenta la arquitectura prevista para los proyectos. No acredita un despliegue operativo. Las direcciones verificadas de los contratos de proyecto y sus informes de auditoría no están publicados aquí.
BLOCKCHAIN, SIN TECNICISMOS
CUATRO PIEZAS. ESO ES TODO.
01 · Wallet
Tu cuenta, tu llave
El modelo prevé wallets y reglas de autorización por proyecto. Sus direcciones y controles deben verificarse antes de operar.
02 · Smart contract
Un programa que cumple
Un contrato programaría las reglas de comisiones, custodia y reparto. El esquema requiere despliegue y verificación pública.
03 · Token
Tu participación
Cada token representa una fracción de los derechos económicos de un proyecto. Se registra a tu nombre y se puede transferir.
04 · Libro público
Todo queda registrado
Cada movimiento tiene un hash. Cualquiera puede verificarlo en un explorador de bloques, sin pedir permiso.
INFRAESTRUCTURA / AVALANCHE
ARQUITECTURA PREVISTA EN AVALANCHE.
La blockchain C-Chain de Avalanche permite registrar eventos y consultar transacciones. El explorador muestra los movimientos que se publican en ella.
~1 s
para que una transacción quede confirmada y sea definitiva
¢
costo de transacción en blockchain
USDC
nativo en Avalanche: pagos y distribuciones en dólares digitales
EVM
compatible con Ethereum: estándares y herramientas auditadas
Eventos públicos: suscríbete tú mismo.
Cada acción importante emite un evento en la blockchain. Tú, un auditor o un periodista pueden escucharlos en tiempo real, sin pedirnos permiso.
Evento
Cuándo se emite
Invested
Alguien aporta a una ronda
Refunded
Una ronda no alcanza su soft cap
Disbursed
Se libera un tramo al proyecto
WentLive
El proyecto sale al aire, con su fecha comprometida
Distribution
Se reparten ganancias a los tenedores
Commission
Se registra una comisión por operación
FeeCollected
dracma cobra una comisión
AdminTransfer
Sale dinero de una wallet administrativa
escuchar-comisiones.js
// Escucha en vivo las comisiones pagadas en Avalanche C-Chain
import { ethers } from "ethers";
const provider = new ethers.JsonRpcProvider(
"https://api.avax.network/ext/bc/C/rpc"
);
const splitter = new ethers.Contract(
COMMISSION_SPLITTER, // dirección publicada al desplegar
["event Commission(address indexed to, address indexed subscriber, uint8 level, uint256 amount)"],
provider
);
splitter.on("Commission", (to, subscriber, level, amount) => {
console.log(`N${level} → ${to}: ${ethers.formatUnits(amount, 6)} USDC`);
});
import { ethers } from "ethers";
const provider = new ethers.JsonRpcProvider(
"https://api.avax.network/ext/bc/C/rpc"
);
const splitter = new ethers.Contract(
COMMISSION_SPLITTER, // dirección publicada al desplegar
["event Commission(address indexed to, address indexed subscriber, uint8 level, uint256 amount)"],
provider
);
splitter.on("Commission", (to, subscriber, level, amount) => {
console.log(`N${level} → ${to}: ${ethers.formatUnits(amount, 6)} USDC`);
});
WALLETS ADMINISTRATIVAS
Una wallet separada por proyecto.
El diseño contempla wallets separadas por proyecto. Sus saldos e historial solo pueden comprobarse con direcciones y transacciones verificadas.
Wallet
Para qué sirve
Firmas
Dirección
Tesorería dracma
Comisiones cobradas por dracma
3 de 5
Se publica al desplegar
Reserva de comisiones
Liquidación de una comisión
Contrato
Se publica al desplegar
Saldo operativo de remesas
Pagos instantáneos en cada país
2 de 3
Se publica al desplegar
ARQUITECTURA
CÓMO SE MUEVE UN DÓLAR DENTRO DE DRACMA.
Cada contrato hace una sola cosa. Así es más fácil de auditar y más difícil de romper.
Entrada
On-ramp
Pesos, dólares o USDC
→
FeeRouter
Fee de depósito
1,5 % a tesorería
→
RaiseVault
Garantía de la ronda
Soft cap · hard cap · reembolso
→
SEProjectToken
ERC-6960
Tokens a tu wallet
↓ al cerrar la ronda
Disbursement
Desembolso por hitos
Comisión de desembolso
→
Proyecto
Operación real
Ingresos y gastos on-chain
→
Waterfall
Reparto de ganancias
Capital · 8 % · excedente
→
Off-ramp
Tu retiro
Fee de retiro 1,5 %
RaiseVault.sol
Custodia los aportes de cada ronda. Aplica soft cap, hard cap, fecha límite y reembolsos automáticos.
SEProjectToken.sol
Token ERC-6960. Un solo contrato para todos los proyectos: mainId = proyecto, subId = serie.
FeeRouter.sol
Calcula y cobra cada comisión pactada. Los porcentajes tienen un máximo fijado en el código.
Waterfall.sol
Reparte las ganancias en orden: capital, retorno preferente, excedente.
CommissionSplitter.sol · VoxEscrow.sol
Registran el evento, su base elegible y el beneficiario. La liquidación sigue las condiciones acordadas para el proyecto.
EA en MQL5
Quant opera en la cuenta MQL5 del cliente. Cobra activación y un porcentaje de utilidades con factura mensual.
Ver dracma Quant → FORMATO DE CONTRATO · ERC-6960
UN ESTÁNDAR PENSADO PARA ACTIVOS REALES.
ERC-6960, o Dual Layer Token, organiza los tokens en dos capas: una principal y una secundaria. Es ideal para tokenizar activos reales que se dividen en series, tramos o lotes.
Capa
En dracma
Ejemplo
mainId
El proyecto
1 = Atacama II
subId
La serie de la ronda
1 = Serie A
amount
Tu participación
9.850 tokens = US$9.850
⇄
Un solo contrato para todo el catálogo: más simple de auditar.
⇄
Cada serie puede tener sus propias condiciones sin crear un token nuevo.
⇄
Transferencias y permisos por proyecto y por serie.
IDLT.sol · extracto de la interfaz ERC-6960
// Dual Layer Token: dos capas de identificadores
interface IDLT {
event Transfer(address indexed sender, address indexed recipient,
uint256 indexed mainId, uint256 subId, uint256 amount);
function safeTransferFrom(address sender, address recipient,
uint256 mainId, uint256 subId, uint256 amount,
bytes calldata data) external returns (bool);
function approve(address spender, uint256 mainId,
uint256 subId, uint256 amount) external returns (bool);
function subBalanceOf(address account, uint256 mainId,
uint256 subId) external view returns (uint256);
}
interface IDLT {
event Transfer(address indexed sender, address indexed recipient,
uint256 indexed mainId, uint256 subId, uint256 amount);
function safeTransferFrom(address sender, address recipient,
uint256 mainId, uint256 subId, uint256 amount,
bytes calldata data) external returns (bool);
function approve(address spender, uint256 mainId,
uint256 subId, uint256 amount) external returns (bool);
function subBalanceOf(address account, uint256 mainId,
uint256 subId) external view returns (uint256);
}
RaiseVault.sol · esquema ilustrativo de una ronda
function invest(uint256 mainId, uint256 subId, uint256 amount) external {
Raise storage r = raises[mainId][subId];
require(block.timestamp < r.deadline, "Ronda cerrada");
uint256 fee = amount * DEPOSIT_FEE_BPS / 10_000; // tasa definida en las condiciones
uint256 net = amount - fee;
require(r.raised + net <= r.hardCap, "Hard cap alcanzado");
usdc.transferFrom(msg.sender, address(this), amount);
paid[mainId][subId][msg.sender] += amount; // incluye el fee
r.raised += net;
token.mint(msg.sender, mainId, subId, net);
}
function markLive(uint256 mainId, uint256 subId) external onlyOperatorAndOracle {
Raise storage r = raises[mainId][subId];
require(r.closed, "Ronda abierta");
r.liveAt = block.timestamp; // desde aquí puede haber distribuciones
emit WentLive(mainId, subId, block.timestamp, r.goLiveBy);
}
function isDelayed(uint256 mainId, uint256 subId) public view returns (bool) {
Raise storage r = raises[mainId][subId];
return r.liveAt == 0 && block.timestamp > r.goLiveBy + 90 days;
}
function refund(uint256 mainId, uint256 subId) external {
Raise storage r = raises[mainId][subId];
require(block.timestamp >= r.deadline && r.raised < r.softCap, "Sin reembolso");
uint256 back = paid[mainId][subId][msg.sender];
paid[mainId][subId][msg.sender] = 0;
token.burn(msg.sender, mainId, subId, token.subBalanceOf(msg.sender, mainId, subId));
usdc.transfer(msg.sender, back); // 100 %, fee incluido
}
Raise storage r = raises[mainId][subId];
require(block.timestamp < r.deadline, "Ronda cerrada");
uint256 fee = amount * DEPOSIT_FEE_BPS / 10_000; // tasa definida en las condiciones
uint256 net = amount - fee;
require(r.raised + net <= r.hardCap, "Hard cap alcanzado");
usdc.transferFrom(msg.sender, address(this), amount);
paid[mainId][subId][msg.sender] += amount; // incluye el fee
r.raised += net;
token.mint(msg.sender, mainId, subId, net);
}
function markLive(uint256 mainId, uint256 subId) external onlyOperatorAndOracle {
Raise storage r = raises[mainId][subId];
require(r.closed, "Ronda abierta");
r.liveAt = block.timestamp; // desde aquí puede haber distribuciones
emit WentLive(mainId, subId, block.timestamp, r.goLiveBy);
}
function isDelayed(uint256 mainId, uint256 subId) public view returns (bool) {
Raise storage r = raises[mainId][subId];
return r.liveAt == 0 && block.timestamp > r.goLiveBy + 90 days;
}
function refund(uint256 mainId, uint256 subId) external {
Raise storage r = raises[mainId][subId];
require(block.timestamp >= r.deadline && r.raised < r.softCap, "Sin reembolso");
uint256 back = paid[mainId][subId][msg.sender];
paid[mainId][subId][msg.sender] = 0;
token.burn(msg.sender, mainId, subId, token.subBalanceOf(msg.sender, mainId, subId));
usdc.transfer(msg.sender, back); // 100 %, fee incluido
}
Código ilustrativo y simplificado. No acredita una versión en producción ni controles de seguridad auditados.
REGISTRO ECONÓMICO
UN EVENTO CONFIRMADO.
UNA COMISIÓN IDENTIFICABLE.
Cada venta, desembolso y utilidad conserva una referencia, una base de cálculo y un estado. La liquidación sigue las condiciones acordadas y la disponibilidad de fondos.
Evento
Validación
Registro
Venta realizada
Pago conciliado y atribución confirmada.
Identificador de venta y beneficiario.
Fondos liberados
Autorización del hito y transferencia ejecutada.
Identificador de desembolso y capital liberado.
Utilidades del proyecto
Cierre aprobado y ajustes aplicados.
Período, resultado elegible y reglas de reparto.
ESQUEMA ILUSTRATIVO / NO ES UN CONTRATO DESPLEGADO
evento = confirmar(venta | desembolso | utilidad)
condiciones = obtenerCondiciones(evento.proyecto)
base = calcularBaseElegible(evento, condiciones)
comision = aplicarTasa(base, condiciones.tasa)
registrar(evento.id, base, comision, beneficiario, estado)
liquidarSegunCondiciones(evento.id)
condiciones = obtenerCondiciones(evento.proyecto)
base = calcularBaseElegible(evento, condiciones)
comision = aplicarTasa(base, condiciones.tasa)
registrar(evento.id, base, comision, beneficiario, estado)
liquidarSegunCondiciones(evento.id)
La política contempla reembolsos y ajustes. El registro permite seguir el importe desde el hecho económico hasta su comprobante de liquidación.
CICLO DE VIDA DE UNA RONDA
DEL PRIMER APORTE A LA ÚLTIMA DISTRIBUCIÓN.
1
Publicación
Se despliega la serie con soft cap, hard cap, fecha límite y fecha comprometida para estar al aire.
2
Ronda abierta
Los aportes quedan en garantía en RaiseVault.
3
Soft cap
Si no se alcanza: reembolso del 100 %. Si se alcanza: sigue.
4
Cierre
Por hard cap o por fecha. No se aceptan más aportes.
5
Desembolso
Por tramos ligados a hitos verificados, con comisión de desembolso.
6
Al aire
Tras el tiempo de espera fijado en el contrato. Si se retrasa más de 90 días, queda marcado en público.
7
Operación
Ingresos y gastos registrados on-chain, auditados cada trimestre.
8
Distribuciones
Waterfall reparte en USDC a las wallets de los tenedores.
REPOSITORIO
CÓDIGO ABIERTO. REVÍSALO TÚ MISMO.
El repositorio público permite revisar el código disponible. Las direcciones verificadas, pruebas de despliegue e informes de auditoría de los proyectos no están publicados en esta página.
Ver en GitHub ↗
Verificación de contratos pendiente
Auditoría externa
Informe independiente no publicado.
Bug bounty
Recompensas para quien reporte vulnerabilidades de forma responsable.
Límites en el código
Los límites deben poder comprobarse en código desplegado y verificado. Verificación pendiente.
Pausa de emergencia
Configuración de firmas y política de cambios pendientes de verificación pública.
Estructura prevista de los contratos
sepay-contracts/
├── contracts/
│ ├── token/
│ │ ├── SEProjectToken.sol // ERC-6960
│ │ └── IDLT.sol
│ ├── raise/
│ │ ├── RaiseVault.sol // soft cap · hard cap
│ │ └── Disbursement.sol
│ ├── fees/
│ │ └── FeeRouter.sol
│ ├── distribution/
│ │ └── Waterfall.sol
│ ├── programs/
│ │ ├── CommissionSplitter.sol // pago inmediato
│ │ ├── CommissionReserve.sol
│ │ └── VoxEscrow.sol
│ └── safe/ // ya publicados en GitHub
│ ├── SignerGuard.sol
│ └── DelayedRecovery.sol
├── test/ // pruebas unitarias y de invariantes
├── audits/ // informes publicados
├── deployments/avalanche/ // direcciones en C-Chain
└── README.md
├── contracts/
│ ├── token/
│ │ ├── SEProjectToken.sol // ERC-6960
│ │ └── IDLT.sol
│ ├── raise/
│ │ ├── RaiseVault.sol // soft cap · hard cap
│ │ └── Disbursement.sol
│ ├── fees/
│ │ └── FeeRouter.sol
│ ├── distribution/
│ │ └── Waterfall.sol
│ ├── programs/
│ │ ├── CommissionSplitter.sol // pago inmediato
│ │ ├── CommissionReserve.sol
│ │ └── VoxEscrow.sol
│ └── safe/ // ya publicados en GitHub
│ ├── SignerGuard.sol
│ └── DelayedRecovery.sol
├── test/ // pruebas unitarias y de invariantes
├── audits/ // informes publicados
├── deployments/avalanche/ // direcciones en C-Chain
└── README.md
YA VISTE CÓMO FUNCIONA
AHORA DECIDE CON CALMA. NOSOTROS TE ACOMPAÑAMOS.
Cuéntanos qué te interesa y te escribimos solo para eso, por el canal y con la frecuencia que elijas.
✓
2 minutos
✓
Sin compromiso de aportar
✓
Tú eliges canal y frecuencia