diff --git a/SmartContract/cauciones.sol b/SmartContract/cauciones.sol
new file mode 100644
index 0000000000000000000000000000000000000000..70b3d1c37e48b947aaa03b3fee578835ff2af4f7
--- /dev/null
+++ b/SmartContract/cauciones.sol
@@ -0,0 +1,71 @@
+// 20190513 Robert Martin-Legene <robert@nic.ar>
+// vim:filetype=javascript
+
+pragma solidity ^0.4.24;
+      
+contract Majority {
+    function    isVoter( address ) public view returns (bool) { }
+}
+
+contract cauciones {
+    enum EstadosDePolizas           { PolizaNoExiste, PolizaVigente, PolizaCancelado, PolizaAnulado }
+
+    // why a struct? because I think we'll see requirements for more info
+    struct                          poliza {
+        EstadosDePolizas                estado;
+    }
+    mapping ( uint256 => poliza )   polizas;
+    Majority                        admins;
+    event                           estadoPoliza( uint256 objeto, EstadosDePolizas estado );
+
+    modifier            onlyAuthorized()
+    {
+        require(admins.isVoter( msg.sender ));
+        _;
+    }
+
+    // can't use the modifier before the admins variable has been initialized.
+    constructor( address admincontractaddress )
+        public
+    {
+        admins                  =   Majority( admincontractaddress );
+        require(
+            admins.isVoter( msg.sender ),
+            "Creator of this contract must be authorized voter in the Majority voting contract."
+        );
+    }
+
+    function _set_estado( uint256 objeto, EstadosDePolizas estado )
+        private
+    {
+        polizas[objeto].estado = estado;
+        emit estadoPoliza( objeto, estado );
+    }
+    function crearPoliza( uint256 objeto )
+        public onlyAuthorized
+    {
+        // must not exist already
+        require( polizas[objeto].estado == EstadosDePolizas.PolizaNoExiste );
+        _set_estado( objeto, EstadosDePolizas.PolizaVigente);
+    }
+    function anularPoliza( uint256 objeto )
+        public onlyAuthorized
+    {
+        // must exist already
+        require( polizas[objeto].estado != EstadosDePolizas.PolizaNoExiste );
+        _set_estado( objeto, EstadosDePolizas.PolizaAnulado);
+    }
+    function cancelarPoliza( uint256 objeto )
+        public onlyAuthorized
+    {
+        // must exist already
+        require( polizas[objeto].estado != EstadosDePolizas.PolizaNoExiste );
+        _set_estado( objeto, EstadosDePolizas.PolizaCancelado);
+    }
+    function mostrarEstado( uint256 objeto )
+        public view
+        returns (uint8)
+    {
+        return uint8(polizas[objeto].estado);
+    }
+}