Este contrato tiene por objeto regular las condiciones de colaboración entre la marca y el influencer, estableciendo derechos, obligaciones y los mecanismos de pago a través de la plataforma blockchain.
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract ContratoColaboracion { address public plataforma; constructor() { plataforma = msg.sender; } }
La plataforma permitirá el registro de marcas e influencers mediante la validación de su información básica, garantizando su actividad en el sistema.
struct Participante { string nombre; uint256 ranking; bool activo; } mapping(address => Participante) public marcas; mapping(address => Participante) public influencers; function registrarMarca(address marca, string memory nombre) public { marcas[marca] = Participante(nombre, 0, true); } function registrarInfluencer(address influencer, string memory nombre) public { influencers[influencer] = Participante(nombre, 0, true); }
Las transacciones financieras entre la marca y el influencer se realizarán mediante contratos inteligentes, asegurando el pago en tiempo real tras la finalización de cada campaña.
function realizarPago(address influencer, uint256 monto) public { require(marcas[msg.sender].activo, "Marca no registrada"); require(influencers[influencer].activo, "Influencer no registrado"); payable(influencer).transfer(monto); }
Todo contenido generado durante la campaña será propiedad exclusiva de la marca, salvo que se estipule lo contrario en acuerdos adicionales.
mapping(uint256 => address) public propiedadIntelectual; function registrarPropiedad(uint256 id, address marca) public { require(marcas[marca].activo, "Marca no registrada"); propiedadIntelectual[id] = marca; }
Ambas partes acuerdan mantener la confidencialidad de la información compartida durante la vigencia del contrato y por un período de 2 años posterior a su finalización.
// No se implementa directamente en Solidity. Acuerdos legales adicionales aplican.
Cualquier disputa será resuelta mediante arbitraje digital gestionado por la plataforma, siendo su decisión vinculante.
function resolverConflicto(uint256 id, string memory decision) public onlyPlataforma { // Arbitraje digital }
Las marcas y los influencers registrados se incluirán en un listado accesible dentro de la plataforma para su consulta.
address[] public listadoMarcas; address[] public listadoInfluencers; function obtenerListadoMarcas() public view returns (address[] memory) { return listadoMarcas; } function obtenerListadoInfluencers() public view returns (address[] memory) { return listadoInfluencers; }
Los compradores pueden apartar promociones pagando el 10% inicial y el resto contra entrega.
struct VentaFlash { address comprador; uint256 adelanto; uint256 restante; bool completado; } mapping(uint256 => VentaFlash) public ventasFlash; function registrarVentaFlash(uint256 id, uint256 adelanto, uint256 restante) public { ventasFlash[id] = VentaFlash(msg.sender, adelanto, restante, false); } function completarVentaFlash(uint256 id) public { require(ventasFlash[id].comprador == msg.sender, "No autorizado"); ventasFlash[id].completado = true; }
El influencer asumirá la responsabilidad de representar la marca durante la campaña, asegurando la promoción activa del producto y reforzando los valores asociados a la marca.
struct Embajador { address influencer; uint256 duracion; bool activo; } mapping(address => Embajador) public embajadores; function designarEmbajador(address influencer, uint256 duracion) public { require(influencers[influencer].activo, "Influencer no registrado"); embajadores[influencer] = Embajador(influencer, duracion, true); } function finalizarEmbajador(address influencer) public { require(embajadores[influencer].activo, "No es embajador"); embajadores[influencer].activo = false; }
El influencer podrá iniciar proyectos comerciales o sociales mediante campañas de crowdfunding gestionadas a través de la plataforma.
struct Proyecto { address creador; string descripcion; uint256 meta; uint256 fondos; bool completado; } mapping(uint256 => Proyecto) public proyectos; function crearProyecto(uint256 id, string memory descripcion, uint256 meta) public { require(influencers[msg.sender].activo, "Influencer no registrado"); proyectos[id] = Proyecto(msg.sender, descripcion, meta, 0, false); } function donar(uint256 id) public payable { require(proyectos[id].fondos < proyectos[id].meta, "Proyecto completado"); proyectos[id].fondos += msg.value; } function completarProyecto(uint256 id) public { require(proyectos[id].fondos >= proyectos[id].meta, "Meta no alcanzada"); proyectos[id].completado = true; }
Los pagos de comisiones se ejecutarán en tiempo real, asegurando la automatización del proceso y reduciendo la burocracia.
function pagarComision(address influencer, uint256 monto) public { require(marcas[msg.sender].activo, "Marca no registrada"); payable(influencer).transfer(monto); }
La marca deberá mantener activa la campaña depositando al liquidity pool. Si no se realiza el depósito, la campaña se pausará automáticamente sin responsabilidad para el influencer.
mapping(address => uint256) public liquidity; function depositarLiquidity(address marca, uint256 monto) public { require(marcas[marca].activo, "Marca no registrada"); liquidity[marca] += monto; } function pausarCampana(address marca) public { require(liquidity[marca] == 0, "Liquidity suficiente"); // Lógica para pausar campaña }
Las acciones u omisiones de ambas partes influirán en un ranking. Tras múltiples incumplimientos, la plataforma bloqueará su acceso.
function actualizarRanking(address participante, uint256 puntos) public { if (marcas[participante].activo) { marcas[participante].ranking += puntos; } else if (influencers[participante].activo) { influencers[participante].ranking += puntos; } } function bloquearParticipante(address participante) public { if (marcas[participante].ranking < 0 || influencers[participante].ranking < 0) { if (marcas[participante].activo) { marcas[participante].activo = false; } else if (influencers[participante].activo) { influencers[participante].activo = false; } } }
El influencer podrá ofrecer una promoción especial en la cual el comprador pague un 10% del valor del producto al realizar la compra, y el resto lo abone contra entrega del producto.
struct PromocionFlash { address influencer; uint256 porcentajePagoInicial; bool activa; } mapping(address => PromocionFlash) public promocionesFlash; function activarPromocionFlash(address influencer, uint256 porcentaje) public { require(influencers[influencer].activo, "Influencer no registrado"); promocionesFlash[influencer] = PromocionFlash(influencer, porcentaje, true); } function realizarPagoFlash(address influencer, uint256 montoInicial) public { require(promocionesFlash[influencer].activa, "Promocion no activa"); uint256 saldoRestante = montoInicial * (100 - promocionesFlash[influencer].porcentajePagoInicial) / 100; payable(influencer).transfer(saldoRestante); }
El influencer se compromete a promover la venta de productos asociados al contrato, con la obligación de asegurar el cumplimiento de los términos de cada campaña.
mapping(address => uint256) public ventasRealizadas; function registrarVenta(address influencer, uint256 monto) public { require(influencers[influencer].activo, "Influencer no registrado"); ventasRealizadas[influencer] += monto; }
El influencer es responsable de realizar la promoción del producto de manera efectiva y ética, garantizando el cumplimiento de las expectativas de la campaña.
function verificarResponsabilidad(address influencer) public view returns (bool) { require(influencers[influencer].activo, "Influencer no registrado"); // Verificar si el influencer ha cumplido con las responsabilidades de la campaña return ventasRealizadas[influencer] > 0; }
El influencer acuerda no promocionar productos de marcas competidoras durante la vigencia del contrato, garantizando la exclusividad de su promoción para la marca contratante.
mapping(address => bool) public exclusividadActiva; function activarExclusividad(address influencer) public { require(influencers[influencer].activo, "Influencer no registrado"); exclusividadActiva[influencer] = true; } function verificarExclusividad(address influencer) public view returns (bool) { return exclusividadActiva[influencer]; }
Cualquier modificación del contrato deberá ser acordada por ambas partes mediante un consentimiento formal, y su implementación será realizada mediante una actualización del contrato inteligente.
function modificarContrato(address influencer, uint256 nuevoMonto) public { require(influencers[influencer].activo, "Influencer no registrado"); // Modificar los términos del contrato influencers[influencer].comision = nuevoMonto; }
El contrato tendrá una duración inicial de [X] meses, renovable de forma automática si ambas partes están de acuerdo, con la posibilidad de cancelación anticipada por cualquiera de las partes con un aviso previo.
uint256 public duracionContrato = 180 days; function verificarDuracion(address influencer) public view returns (uint256) { return block.timestamp - influencers[influencer].fechaInicio; } function cancelarContrato(address influencer) public { require(block.timestamp - influencers[influencer].fechaInicio > duracionContrato, "Contrato en vigencia"); influencers[influencer].activo = false; }
Ambas partes se comprometen a mantener la confidencialidad de la información sensible que se comparta durante la vigencia del contrato, incluida la información financiera y de campaña.
mapping(address => bool) public confidencialidadCumplida; function firmarConfidencialidad(address influencer) public { require(influencers[influencer].activo, "Influencer no registrado"); confidencialidadCumplida[influencer] = true; } function verificarConfidencialidad(address influencer) public view returns (bool) { return confidencialidadCumplida[influencer]; }
El contrato podrá ser terminado por cualquiera de las partes antes de su vencimiento mediante notificación formal, con las condiciones establecidas para la liquidación de pagos y responsabilidades.
function terminarContrato(address influencer) public { require(influencers[influencer].activo, "Influencer no registrado"); influencers[influencer].activo = false; }