Author

Topic: [BOUNTY]Cardstack - Blockchain. Hasta usd 350K (Read 275 times)

member
Activity: 784
Merit: 64
■ Professional Spanish Translator
NOTICIAS

El Director Fundador de Cardstack @christe se sentó con @queentatiana esta mañana para hablar sobre lo que hemos estado trabajando:

https://youtu.be/WZsdajfH1xo
member
Activity: 784
Merit: 64
■ Professional Spanish Translator
Estimados participantes de Cardstack Bounty,

Como ya anunciamos en el pasado, Cardstack brindará a todos los participantes la
opción de que sus recompensas se paguen en ETH en lugar de fichas de CARD.
Si desea tenerlo de esta manera, envíe este formulario la próxima semana

(hasta el 11.06.2018 a las 23:59 CEST)

Complete este formulario si desea recibir ETH en lugar de tokens CARD: ►Formulario◄

Tenga en cuenta que solo aceptaremos su solicitud si utiliza los mismos
detalles en la hoja de cálculo principal, incluida la misma dirección ETH.
member
Activity: 784
Merit: 64
■ Professional Spanish Translator



Website |Libro blanco |Facebook |Twitter | Telegram Ingles| Reddit| Blog



BUENAS NOTICIAS


Buenas Noticias: El contrato Inteligente de Cardstack
ha pasado las dos auditorías de seguridad por parte de
@NCCGroupInfosec, y oficialmente hemos abierto hoy
el código de contrato inteligente.


nota completa en:
https://medium.com/cardstack/cardstack-smart-contract-passes-ncc-audit-reaches-milestone-57e18ed90a76


member
Activity: 784
Merit: 64
■ Professional Spanish Translator



Website |Libro blanco |Facebook |Twitter | Telegram Ingles| Reddit| Blog



RECUERDE ESTE DATO DE SEGURIDAD



Ten cuidado con los estafadores. Nunca le pediremos que envíe fondos a
través de las redes sociales, correo electrónico o DM. No estamos haciendo
regalos gratis, ni ofrecemos bonos por esta vía.

Consulte https://cardstack.com para obtener la información más
reciente e infórmenos sobre cualquier actividad sospechosa en Telegram

member
Activity: 784
Merit: 64
■ Professional Spanish Translator
PENSAMIENTOS

La descentralización de Internet no ocurrirá repentinamente, sino gradualmente, y debemos construir para esa realidad.

Pensamientos de @christse en @beyondblocks



Nota completa en:
https://medium.com/cardstack/building-on-blockchain-for-the-real-world-92593b2a16ba
member
Activity: 784
Merit: 64
■ Professional Spanish Translator
¡Bienvenidos a los recién llegados!

¡Cardstack tendrá otro #AMA pronto! ¿Tiene alguna pregunta para nosotros? ¡No dude en preguntar cualquier cosa que tenga, y asegúrese de etiquetarlos con el hashtag #AMA!

Chris Tse, Director Fundador de Cardstack, responde preguntas de la comunidad en el #AMA anterior. Puedes verlo a continuación:
https://youtu.be/ULAprHGoSg8

IMPORTANTE: Cardstack NUNCA realizará o solicitará pagos a través de Telegram. La dirección de venta y preventa solo se publicará en el sitio web de Cardstack. No envíe ETH a ninguna dirección a través de Telegram.
member
Activity: 784
Merit: 64
■ Professional Spanish Translator


Amigo debes informar en el Bounty Oficial en Ingles.

no aqui.
member
Activity: 784
Merit: 64
■ Professional Spanish Translator
Amigos, les invito a leer esta interesante nota

CARDSTACK ES UN ECOSISTEMA DE SOFTWARE DESCENTRALIZADO
La empresa representa un salto adelante para Blockchain en cada capa de la pila de software, proporcionando un conjunto de herramientas que desbloquea el potencial de la Internet descentralizada para todos.




Aquí les dejo la nota completa:

https://medium.com/@kirochka84/cardstack-is-a-decentralized-software-ecosystem-58b58f5965e2
newbie
Activity: 2
Merit: 0
Hola,

Esta abierto todavía el registro para la WhiteList o llego tarde?

Por otro lado, el sistema de recompensas esta activo? (sobretodo el de twitter, facebook y Telegram)

Un saludo y gracias!
member
Activity: 112
Merit: 10
member
Activity: 784
Merit: 64
■ Professional Spanish Translator
Poniendolo todo junto

El enfoque que Cardstack está tomando para realizar contratos actualizables en Solidity incluye estas 3 características importantes:

Resguardo de estado en su propio(s) contrato(s).
Usar un contrato de registro para administrar direcciones de contrato y vincular contratos con su estado.
Resolución de búsquedas de nombre de ENS para direcciones de contrato.
Al adoptar estos enfoques para el desarrollo de contratos, Cardstack puede crear contratos que pueden evolucionar con el tiempo para satisfacer las necesidades cambiantes de las personas que usan nuestras aplicaciones distribuidas.

Esta es la primera de las optimistas actualizaciones que compartiremos sobre nuestra experiencia en Cardstack con Solidity.

■ Programador

Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP

■ Criptoinversores LATAM

Youtube: http://bit.ly/2ndiNu7
Twitter: http://bit.ly/2nexRa0
Linkedin: http://bit.ly/2GimYgb


member
Activity: 784
Merit: 64
■ Professional Spanish Translator

La piedra angular de todo este proceso es el llamado Servicio de nombres de Ethereum (ENS). ENS permite que los contratos se referencien usando un nombre amigable para los humanos en lugar de una cadena de caracteres hexadecimales no amigable para los humanos https://ens.domains/. Esto permite a los usuarios interactuar con un contrato de token en la dirección cardstack.eth en lugar de la dirección 0x66406f50624a645f36faa517c39049200d55c56e; al igual que ser capaz de utilizar un nombre de dominio como https://google.com en lugar del dns original que dificil de recordar que es https://172.217.12.206.

El registro Cardstack se adhiere a EIP-137, que es el estándar que rige ENS, de modo que puede actuar como un “nombre de sesión” resolver (que es cómo ENS representa internamente nombres de contrato). Debido a que el registro ya está haciendo un seguimiento de la dirección de la última versión de cualquier contrato, usarlo como un resolver para ENS es una opción muy natural.

Como parte del registro de un contrato con el registro de Cardstack, el “namehash” del nombre del contrato se suministra a la función register().

Ese namehash luego se puede derivar de la cadena utilizando un script (ver https://github.com/danfinlay/eth-ens-namehash) que convierte el nombre del contrato complejo a uno amigable con los humanos. La dirección del contrato de registro se puede usar como la ENS de la resolución, de modo que resuelve la dirección de la última versión de un contrato de token para los nombres que se le presentan.


■ Programador

Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP

■ Criptoinversores LATAM

Youtube: http://bit.ly/2ndiNu7
Twitter: http://bit.ly/2nexRa0
Linkedin: http://bit.ly/2GimYgb

member
Activity: 784
Merit: 64
■ Professional Spanish Translator

Cardstack usa un contrato base administratable.sol que proporciona la capacidad de agregar y eliminar administradores y súper administradores, así como modificadores para designar que las funciones solo pueden ser invocadas por administradores y superadministradores, o de forma más restrictiva, solo superadministradores. Además, se utilizan mapas iterables para que revisar introspectivamente las direcciones administrativas.

Code:
pragma solidity ^0.4.18;

import "zeppelin-solidity/contracts/ownership/Ownable.sol";
import "zeppelin-solidity/contracts/math/SafeMath.sol";

contract administratable is Ownable {
  using SafeMath for uint256;

  uint256 public totalAdminsMapping;
  uint256 public totalSuperAdminsMapping;
  mapping (uint256 => address) public adminsForIndex;
  mapping (uint256 => address) public superAdminsForIndex;
  mapping (address => bool) public admins;
  mapping (address => bool) public superAdmins;
  mapping (address => bool) processedAdmin;
  mapping (address => bool) processedSuperAdmin;

  event AddAdmin(address indexed admin);
  event RemoveAdmin(address indexed admin);
  event AddSuperAdmin(address indexed admin);
  event RemoveSuperAdmin(address indexed admin);

  modifier onlyAdmins {
    if (msg.sender != owner && !superAdmins[msg.sender] && !admins[msg.sender]) revert();
    _;
  }

  modifier onlySuperAdmins {
    if (msg.sender != owner && !superAdmins[msg.sender]) revert();
    _;
  }

  function addSuperAdmin(address admin) public onlyOwner {
    superAdmins[admin] = true;
    if (!processedSuperAdmin[admin]) {
      processedSuperAdmin[admin] = true;
      superAdminsForIndex[totalSuperAdminsMapping] = admin;
      totalSuperAdminsMapping = totalSuperAdminsMapping.add(1);
    }

    AddSuperAdmin(admin);
  }

  function removeSuperAdmin(address admin) public onlyOwner {
    superAdmins[admin] = false;

    RemoveSuperAdmin(admin);
  }

  function addAdmin(address admin) public onlySuperAdmins {
    admins[admin] = true;
    if (!processedAdmin[admin]) {
      processedAdmin[admin] = true;
      adminsForIndex[totalAdminsMapping] = admin;
      totalAdminsMapping = totalAdminsMapping.add(1);
    }

    AddAdmin(admin);
  }

  function removeAdmin(address admin) public onlySuperAdmins {
    admins[admin] = false;

    RemoveAdmin(admin);
  }
}

A modo de referencia, aparece el Registry.sol completo que muestra cómo se agrega el almacenamiento, cómo se registran y cómo se actualizan los contratos:

Code:
pragma solidity ^0.4.18;

import "zeppelin-solidity/contracts/ownership/Ownable.sol";
import "zeppelin-solidity/contracts/math/SafeMath.sol";
import "./upgradeable.sol";
import "./ExternalStorage.sol";
import "./CstLedger.sol";
import "./administratable.sol";
import "./configurable.sol";
import "./storable.sol";
import "./freezable.sol";
import "./ERC20.sol";

contract Registry is Ownable, administratable, upgradeable {
  using SafeMath for uint256;

  bytes4 constant INTERFACE_META_ID = 0x01ffc9a7;
  bytes4 constant ADDR_INTERFACE_ID = 0x3b3b57de;

  uint256 public numContracts;
  mapping(bytes32 => address) public storageForHash;
  mapping(bytes32 => address) public contractForHash;
  mapping(bytes32 => bytes32) public hashForNamehash;
  mapping(bytes32 => bytes32) public namehashForHash;
  mapping(uint256 => string) public contractNameForIndex;

  event ContractRegistered(address indexed _contract, string _name, bytes32 namehash);
  event ContractUpgraded(address indexed successor, address indexed predecessor, string name, bytes32 namehash);
  event StorageAdded(address indexed storageAddress, string name);
  event StorageRemoved(address indexed storageAddress, string name);
  event AddrChanged(bytes32 indexed node, address a);

  function() public {
    revert();
  }

  function supportsInterface(bytes4 interfaceId) public pure returns (bool) {
    return interfaceId == ADDR_INTERFACE_ID ||
           interfaceId == INTERFACE_META_ID;
  }

  function addr(bytes32 node) public view returns (address) {
    return contractForHash[hashForNamehash[node]];
  }

  function getContractHash(string name) public view unlessUpgraded returns (bytes32) {
    return keccak256(name);
  }

  function register(string name, address contractAddress, bytes32 namehash) public onlySuperAdmins unlessUpgraded returns (bool) {
    bytes32 hash = keccak256(name);
    require(bytes(name).length > 0);
    require(contractAddress != 0x0);
    require(contractForHash[hash] == 0x0);
    require(hashForNamehash[namehash] == 0x0);

    contractNameForIndex[numContracts] = name;
    contractForHash[hash] = contractAddress;

    if (namehash != 0x0) {
      hashForNamehash[namehash] = hash;
      namehashForHash[hash] = namehash;
    }

    numContracts = numContracts.add(1);

    address storageAddress = storageForHash[storable(contractAddress).getStorageNameHash()];
    address ledgerAddress = storageForHash[storable(contractAddress).getLedgerNameHash()];

    if (storageAddress != 0x0) {
      ExternalStorage(storageAddress).addAdmin(contractAddress);
    }
    if (ledgerAddress != 0x0) {
      CstLedger(ledgerAddress).addAdmin(contractAddress);
    }

    configurable(contractAddress).configureFromStorage();

    ContractRegistered(contractAddress, name, namehash);

    if (namehash != 0x0) {
      AddrChanged(namehash, contractAddress);
    }

    return true;
  }

  function upgradeContract(string name, address successor) public onlySuperAdmins unlessUpgraded returns (bytes32) {
    bytes32 hash = keccak256(name);
    require(successor != 0x0);
    require(contractForHash[hash] != 0x0);

    address predecessor = contractForHash[hash];
    contractForHash[hash] = successor;

    uint256 remainingContractBalance;
    // we need https://github.com/ethereum/EIPs/issues/165
    // to be able to see if a contract is ERC20 or not...
    if (hash == keccak256("cst")) {
      remainingContractBalance = ERC20(predecessor).balanceOf(predecessor);
    }

    upgradeable(predecessor).upgradeTo(successor,
                                       remainingContractBalance);
    upgradeable(successor).upgradedFrom(predecessor);

    address successorStorageAddress = storageForHash[storable(successor).getStorageNameHash()];
    address successorLedgerAddress = storageForHash[storable(successor).getLedgerNameHash()];
    address predecessorStorageAddress = storageForHash[storable(predecessor).getStorageNameHash()];
    address predecessorLedgerAddress = storageForHash[storable(predecessor).getLedgerNameHash()];

    if (successorStorageAddress != 0x0) {
      ExternalStorage(successorStorageAddress).addAdmin(successor);
    }
    if (predecessorStorageAddress != 0x0) {
      ExternalStorage(predecessorStorageAddress).removeAdmin(predecessor);
    }

    if (successorLedgerAddress != 0x0) {
      CstLedger(successorLedgerAddress).addAdmin(successor);
    }
    if (predecessorLedgerAddress != 0x0) {
      CstLedger(predecessorLedgerAddress).removeAdmin(predecessor);
    }

    configurable(successor).configureFromStorage();

    if (namehashForHash[hash] != 0x0) {
      AddrChanged(namehashForHash[hash], successor);
    }

    ContractUpgraded(successor, predecessor, name, namehashForHash[hash]);
    return hash;
  }

  function addStorage(string name, address storageAddress) public onlySuperAdmins unlessUpgraded {
    bytes32 hash = keccak256(name);
    storageForHash[hash] = storageAddress;

    StorageAdded(storageAddress, name);
  }

  function getStorage(string name) public view unlessUpgraded returns (address) {
    return storageForHash[keccak256(name)];
  }

  function removeStorage(string name) public onlySuperAdmins unlessUpgraded {
    address storageAddress = storageForHash[keccak256(name)];
    delete storageForHash[keccak256(name)];

    StorageRemoved(storageAddress, name);
  }
}

■ Programador

Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP

■ Criptoinversores LATAM

Youtube: http://bit.ly/2ndiNu7
Twitter: http://bit.ly/2nexRa0
Linkedin: http://bit.ly/2GimYgb


member
Activity: 784
Merit: 64
■ Professional Spanish Translator

Pero, ¿y los “permisos”?

Se ha mencionado la palabra “permisos” varias veces en esta publicación.

¿Qué quieren decir con eso? Los contratos Cardstack tienen la capacidad de designar direcciones desde las cuales las llamadas msg.send pueden invocar funciones privilegiadas. Además, cardstack ha diseñado dos niveles diferentes de acceso privilegiado (es muy probable que haya muchos más, y probablemente querrán generalizar más esta solución a medida que pase el tiempo). El rol de menor nivel de acceso privilegiado es lo que Hassan Abdel-Rahman llama un “administrador”, y el rol de mayor nivel de acceso privilegiado es lo que llama un “super administrador”.

En general, los administradores tienen la capacidad de modificar el almacenamiento, mientras que los superadministradores tienen la capacidad de crear administradores, registrar contratos y actualizar contratos.

■ Programador

Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP



member
Activity: 784
Merit: 64
■ Professional Spanish Translator

Entonces, un resumen rápido:

Se Agregó almacenamiento al registro y se asignó un nombre al almacenamiento.
Se creó un contrato (en este caso un contrato de token) que declara el interés en usar almacenamiento con un nombre específico.

Se registró un contrato con el registro, que luego resuelve los nombres del almacenamiento a direcciones específicas de Ethereum dentro del contrato que se registra.

upgradeContract()

La capacidad de actualizar un contrato queda expresada en la función upgradeContract(). Los parámetros de esta función son el nombre del contrato y la dirección del contrato “sucesor” (donde el contrato actual se convierte en el contrato predecesor).

El registro usará el mismo mecanismo que se aprovechó en el registro del contrato predecesor para descubrir el almacenamiento que el contrato sucesor ha declarado que está interesado en utilizar. El registro resuelve la dirección del almacenamiento en el contrato sucesor y vincula el almacenamiento dentro del contrato sucesor usando la función configureFromStorage().

Durante la operación de actualización, los permisos del contrato predecesor en el almacenamiento se revocan, de modo que ese contrato ya no puede manipular el almacenamiento. Del mismo modo, se otorgan los permisos del contrato sucesor sobre el almacenamiento, de modo que ese contrato puede manipular el almacenamiento. Además, el modificador,unlessUpgraded, evitará que se ejecuten las funciones de ese contrato predecesor y, en su lugar, hará que reviertan.

El contrato predecesor también adquiere una propiedad que apunta al contrato sucesor como resultado de la actualización del contrato del contrato, por lo que los clientes del contrato pueden descubrir la nueva dirección del actualizada. Finalmente, se emite un evento llamando a ContractUpgraded cuando se actualizan los contratos (así como un evento llamando aAddrChangedpara el soporte de resolución ENS EIP-137, más sobre esto más adelante).

■ Programador

Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP



member
Activity: 784
Merit: 64
■ Professional Spanish Translator

Como se puede observar, el nombre del libro mayor y el nombre de almacenamiento utilizados por el contrato del token se especifican en el constructor del contrato y luego se devuelven en la funciónstorable.sol Además, el token de contrato implementa una interfaz configurable.sol, que declara una función configureFromStorage(). En esta función, está el registro para resolver los nombres de almacenamiento a direcciones reales:

Code:
.
.

// In full disclosure, this is a simplification the actual function, i removed stuff
// that wasn't germane to the conversation around upgradable contracts

configureFromStorage() public onlySuperAdmins unlessUpgraded returns (bool) {
  address ledgerAddress = Registry(registry).getStorage(ledgerName);
  address storageAddress =  Registry(registry).getStorage(storageName);
  
  tokenLedger = ITokenLedger(ledgerAddress);
  externalStorage = storageAddress;
  
  return true;
}

.
.

Y en este momento ya se tiene un token de contrato que está vinculado a los tokens de almacenamiento para los que ha declarado interés.

■ Programador

Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP




member
Activity: 784
Merit: 64
■ Professional Spanish Translator

Después de implementar el contrato de almacenamiento, lo agregan al registro y asignan un nombre al contrato de almacenamiento, todo ello al llamar a la funciónregistry.addStorage(). De aquí en adelante, cuando los contratos se registran en el registro, pueden declarar su intención de usar el almacenamiento por su nombre. El registro es entonces responsable de resolver el nombre de almacenamiento en una dirección específica, así como otorgarle al contrato “permisos” para usar el almacenamiento (más sobre esto más adelante).

registry.registerContract()

Para los contratos que participan en el ecosistema y que no son contratos de almacenamiento, por ejemplo: El
contrato de tokens, usan la función registry.registerContract() para agregarlos a nuestro registro. Sus bcontratos implementan una interfaz storable.sol, que tiene la siguiente declaración:

Code:
pragma solidity ^0.4.18;

contract storable {
  function getLedgerNameHash() public view returns (bytes32);
  function getStorageNameHash() public view returns (bytes32);
}

■ Programador

Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP

member
Activity: 784
Merit: 64
■ Professional Spanish Translator

El siguiente componente del enfoque actualizable de cardstack, es el registro. El registro crea una buena abstracción sobre las direcciones reales de Ethereum para los contratos que participan en nuestro ecosistema. La idea es que solo necesitamos saber el “nombre” de un contrato, y consultar el registro de la versión más reciente del contrato que tiene un nombre particular.

Además, los contratos que necesitan usar el almacenamiento compartido no necesitan conocer la dirección del almacenamiento compartido; más bien, pueden declarar al registro su interés en utilizar un cubo de almacenamiento en particular (que también tiene un nombre), y el registro se ocupará de vincular el almacenamiento al contrato que haya declarado interés en usarlo.

Entonces, a un nivel realmente alto, es el registro el que está haciendo el trabajo de mantener un registro de las direcciones de todos los contratos en nuestro sistema y mapear los nombres de los contratos en las direcciones de los contratos.

■ Programador

Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP



member
Activity: 784
Merit: 64
■ Professional Spanish Translator
Puede ver cómo usan su almacenamiento de contabilidad en el contrato principal de tokens ERC20. A continuación hay un ejemplo de algunas de las funciones del ERC20 que aprovechan el almacenamiento específico del libro mayor:

Code:
pragma solidity ^0.4.18;

import "zeppelin-solidity/contracts/ownership/Ownable.sol";
import "zeppelin-solidity/contracts/math/SafeMath.sol";
import "./ERC20.sol";
import "./freezable.sol";
import "./CstLedger.sol";
import "./ExternalStorage.sol";
import "./Registry.sol";
import "./CstLibrary.sol";
import "./displayable.sol";
import "./upgradeable.sol";
import "./configurable.sol";
import "./storable.sol";

contract CardstackToken is ERC20,
                           Ownable,
                           freezable,
                           displayable,
                           upgradeable,
                           configurable,
                           storable {

  using SafeMath for uint256;
  using CstLibrary for address;

  ITokenLedger public tokenLedger;
  address public externalStorage;

  .
  .
  .
 
 function totalSupply() public view unlessFrozen unlessUpgraded returns(uint256) {
    return tokenLedger.totalTokens();
  }

  function tokensAvailable() public view unlessFrozen unlessUpgraded returns(uint256) {
    return totalSupply().sub(totalInCirculation());
  }

  function balanceOf(address account) public view unlessUpgraded unlessFrozen returns (uint256) {
    address thisAddress = this;
    if (thisAddress == account) {
      return tokensAvailable();
    } else {
      return tokenLedger.balanceOf(account);
    }
  }

  function transfer(address recipient, uint256 amount) public unlessFrozen unlessUpgraded returns (bool) {
    require(amount > 0);
    require(!frozenAccount[recipient]);

    tokenLedger.transfer(msg.sender, recipient, amount);
    Transfer(msg.sender, recipient, amount);

    return true;
  }

  function mintTokens(uint256 mintedAmount) public onlySuperAdmins unlessFrozen unlessUpgraded returns (bool) {
    tokenLedger.mintTokens(mintedAmount);

    Mint(mintedAmount, tokenLedger.totalTokens(), circulationCap);

    Transfer(address(0), this, mintedAmount);

    return true;
  }

  function grantTokens(address recipient, uint256 amount) public onlySuperAdmins unlessFrozen unlessUpgraded returns (bool) {
    require(!frozenAccount[recipient]);

    tokenLedger.debitAccount(recipient, amount);
    Transfer(this, recipient, amount);

    return true;
  }
  
  .
  .
  .
  
}

■ Programador
Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP



member
Activity: 784
Merit: 64
■ Professional Spanish Translator

Otra cosa interesante a tener en cuenta es que: Han hecho un trabajo adicional en nuestro contrato de almacenamiento para permitir que nuestros libros mayores (y libros múltiples) sean iterables, de modo que el almacenamiento sea más fácilmente introspectado. Cuesta más gas para mantener tales estructuras; pero para los casos de uso específicos, entendieron que valía la pena compensar las tarifas adicionales de gas.

Para completar, la forma especializada del almacenamiento del libro mayor de cardstack, aparece a continuación:

Code:
pragma solidity ^0.4.18;

import "./administratable.sol";
import "zeppelin-solidity/contracts/math/SafeMath.sol";

contract ITokenLedger {
  function totalTokens() public view returns (uint256);
  function totalInCirculation() public view returns (uint256);
  function balanceOf(address account) public view returns (uint256);
  function mintTokens(uint256 amount) public;
  function transfer(address sender, address reciever, uint256 amount) public;
  function creditAccount(address account, uint256 amount) public;
  function debitAccount(address account, uint256 amount) public;
  function addAdmin(address admin) public;
  function removeAdmin(address admin) public;
}

contract CstLedger is ITokenLedger, administratable {

  using SafeMath for uint256;

  uint256 public _totalInCirculation; // warning this does not take into account unvested nor vested-unreleased tokens into consideration
  uint256 public _totalTokens;
  mapping (address => uint256) public _balanceOf;
  uint256 public ledgerCount;
  mapping (uint256 => address) public accountForIndex;
  mapping (address => bool) public accounts;

  function totalTokens() public view returns (uint256) {
    return _totalTokens;
  }

  function totalInCirculation() public view returns (uint256) {
    return _totalInCirculation;
  }

  function balanceOf(address account) public view returns (uint256) {
    return _balanceOf[account];
  }

  function mintTokens(uint256 amount) public onlyAdmins {
    _totalTokens = _totalTokens.add(amount);
  }

  function makeAccountIterable(address account) internal {
    if (!accounts[account]) {
      accountForIndex[ledgerCount] = account;
      ledgerCount = ledgerCount.add(1);
      accounts[account] = true;
    }
  }

  function transfer(address sender, address recipient, uint256 amount) public onlyAdmins {
    require(_balanceOf[sender] >= amount);

    _balanceOf[sender] = _balanceOf[sender].sub(amount);
    _balanceOf[recipient] = _balanceOf[recipient].add(amount);
    makeAccountIterable(recipient);
  }

  function creditAccount(address account, uint256 amount) public onlyAdmins { // decrease asset/increase liability: remove tokens
    require(_balanceOf[account] >= amount);

    _totalInCirculation = _totalInCirculation.sub(amount);
    _balanceOf[account] = _balanceOf[account].sub(amount);
  }

  function debitAccount(address account, uint256 amount) public onlyAdmins { // increase asset/decrease liability: add tokens
    _totalInCirculation = _totalInCirculation.add(amount);
    _balanceOf[account] = _balanceOf[account].add(amount);
    makeAccountIterable(account);
  }
}

■ Programador
Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP

member
Activity: 784
Merit: 64
■ Professional Spanish Translator

El módulo llamado ExternalStorage.sol es el “contrato de almacenamiento”. En él se puede ver que se ofrecen slots para almacenar todo tipo de datos, incluidas estructuras más complejas como libros reales e incluso “libros múltiples”, que es un mapa de libros contables. Esto es lo que usan para almacenar las asignaciones para la función transferFrom()ERC20 del contrato de Cardstack. Para cada tipo, tienen un parámetro de recordque es la “clave” en el almacén de valores clave del contrato de almacenamiento. En su contrato de biblioteca de token, se puede ver cómo establecen y obtienen esos valores de almacenamiento:

Code:
pragma solidity ^0.4.18;
import "./ExternalStorage.sol";

library CstLibrary {

  function getTokenName(address _storage) public view returns(bytes32) {
    return ExternalStorage(_storage).getBytes32Value("cstTokenName");
  }

  function setTokenName(address _storage, bytes32 tokenName) public {
    ExternalStorage(_storage).setBytes32Value("cstTokenName", tokenName);
  }

  function getTokenSymbol(address _storage) public view returns(bytes32) {
    return ExternalStorage(_storage).getBytes32Value("cstTokenSymbol");
  }

  function setTokenSymbol(address _storage, bytes32 tokenName) public {
    ExternalStorage(_storage).setBytes32Value("cstTokenSymbol", tokenName);
  }

  function getBuyPrice(address _storage) public view returns(uint256) {
    return ExternalStorage(_storage).getUIntValue("cstBuyPrice");
  }

  function setBuyPrice(address _storage, uint256 value) public {
    ExternalStorage(_storage).setUIntValue("cstBuyPrice", value);
  }

  function getSellPrice(address _storage) public view returns(uint256) {
    return ExternalStorage(_storage).getUIntValue("cstSellPrice");
  }

  function setSellPrice(address _storage, uint256 value) public {
    ExternalStorage(_storage).setUIntValue("cstSellPrice", value);
  }

  function getCirculationCap(address _storage) public view returns(uint256) {
    return ExternalStorage(_storage).getUIntValue("cstCirculationCap");
  }

  function setCirculationCap(address _storage, uint256 value) public {
    ExternalStorage(_storage).setUIntValue("cstCirculationCap", value);
  }

  function getVestingRevocable(address _storage, address beneficiary) public view returns(bool) {
    return ExternalStorage(_storage).getBooleanMapValue("cstVestingRevocable", beneficiary);
  }

  function setVestingReleasedAmount(address _storage, address beneficiary, uint256 value) public {
    ExternalStorage(_storage).setLedgerValue("cstVestingReleasedAmount", beneficiary, value);
  }

  function getVestingReleasedAmount(address _storage, address beneficiary) public view returns(uint256) {
    return ExternalStorage(_storage).getLedgerValue("cstVestingReleasedAmount", beneficiary);
  }
  
  function getAllowance(address _storage, address account, address spender) public view returns (uint256) {
    return ExternalStorage(_storage).getMultiLedgerValue("cstAllowance", account, spender);
  }

  function setAllowance(address _storage, address account, address spender, uint256 allowance) public {
    ExternalStorage(_storage).setMultiLedgerValue("cstAllowance", account, spender, allowance);
  }

  
  .
  .
  .
  
  
}

■ Programador
Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP

member
Activity: 784
Merit: 64
■ Professional Spanish Translator

Al igual que en el enfoque descrito en la publicación de Elena, CardStack ha creado un “contrato de almacenamiento” que básicamente actúa como un cubo, elevando el estado de una versión de contrato a la siguiente. En ese contrato de almacenamiento, se puede registrar muchos tipos diferentes de datos en un almacén especial. También han creado un “contrato de Libro mayor”, como en el enfoque de “Colony”, pero es una forma especializada de un contrato de almacenamiento diseñado específicamente para blockchain.


Code:
pragma solidity ^0.4.18;

import "zeppelin-solidity/contracts/math/SafeMath.sol";
import "./administratable.sol";

contract ExternalStorage is administratable {
  using SafeMath for uint256;

  mapping(bytes32 => mapping(address => mapping(address => uint256))) MultiLedgerStorage;
  mapping(bytes32 => uint256) public primaryLedgerCount;
  mapping(bytes32 => mapping(address => bool)) public ledgerPrimaryEntries;
  mapping(bytes32 => mapping(uint256 => address)) public primaryLedgerEntryForIndex;
  mapping(bytes32 => mapping(address => uint256)) public secondaryLedgerCount;
  mapping(bytes32 => mapping(address => mapping(address => bool))) public ledgerSecondaryEntries;
  mapping(bytes32 => mapping(address => mapping(uint256 => address))) public secondaryLedgerEntryForIndex;

  function getMultiLedgerValue(string record, address primaryAddress, address secondaryAddress) public view returns (uint256) {
    return MultiLedgerStorage[keccak256(record)][primaryAddress][secondaryAddress];
  }

  function setMultiLedgerValue(string record, address primaryAddress, address secondaryAddress, uint256 value) public onlyAdmins {
    bytes32 hash = keccak256(record);
    uint256 primaryLedgerIndex = primaryLedgerCount[hash];
    uint256 secondaryLedgerIndex = secondaryLedgerCount[hash][primaryAddress];
    if (!ledgerSecondaryEntries[hash][primaryAddress][secondaryAddress]) {
      secondaryLedgerEntryForIndex[hash][primaryAddress][secondaryLedgerIndex] = secondaryAddress;
      secondaryLedgerCount[hash][primaryAddress] = secondaryLedgerIndex.add(1);
      ledgerSecondaryEntries[hash][primaryAddress][secondaryAddress] = true;

      if (!ledgerPrimaryEntries[hash][primaryAddress]) {
        primaryLedgerEntryForIndex[hash][primaryLedgerIndex] = primaryAddress;
        primaryLedgerCount[hash] = primaryLedgerIndex.add(1);
        ledgerPrimaryEntries[hash][primaryAddress] = true;
      }
    }

    MultiLedgerStorage[hash][primaryAddress][secondaryAddress] = value;
  }

  mapping(bytes32 => mapping(address => uint256)) LedgerStorage;
  mapping(bytes32 => uint256) public ledgerCount;
  mapping(bytes32 => mapping(address => bool)) public ledgerAccounts;
  mapping(bytes32 => mapping(uint256 => address)) public ledgerEntryForIndex;

  function getLedgerValue(string record, address _address) public view returns (uint256) {
    return LedgerStorage[keccak256(record)][_address];
  }

  function getLedgerCount(string record) public view returns (uint256) {
    return ledgerCount[keccak256(record)];
  }

  function setLedgerValue(string record, address _address, uint256 value) public onlyAdmins {
    bytes32 hash = keccak256(record);
    if (!ledgerAccounts[hash][_address]) {
      uint256 ledgerIndex = ledgerCount[hash];
      ledgerEntryForIndex[hash][ledgerIndex] = _address;
      ledgerCount[hash] = ledgerIndex.add(1);
      ledgerAccounts[hash][_address] = true;
    }

    LedgerStorage[hash][_address] = value;
  }

  mapping(bytes32 => mapping(address => bool)) BooleanMapStorage;
  mapping(bytes32 => uint256) public booleanMapCount;
  mapping(bytes32 => mapping(address => bool)) public booleanMapAccounts;
  mapping(bytes32 => mapping(uint256 => address)) public booleanMapEntryForIndex;

  function getBooleanMapValue(string record, address _address) public view returns (bool) {
    return BooleanMapStorage[keccak256(record)][_address];
  }

  function getBooleanMapCount(string record) public view returns (uint256) {
    return booleanMapCount[keccak256(record)];
  }

  function setBooleanMapValue(string record, address _address, bool value) public onlyAdmins {
    bytes32 hash = keccak256(record);
    if (!booleanMapAccounts[hash][_address]) {
      uint256 ledgerIndex = booleanMapCount[hash];
      booleanMapEntryForIndex[hash][ledgerIndex] = _address;
      booleanMapCount[hash] = ledgerIndex.add(1);
      booleanMapAccounts[hash][_address] = true;
    }

    BooleanMapStorage[hash][_address] = value;
  }

  mapping(bytes32 => uint256) UIntStorage;

  function getUIntValue(string record) public view returns (uint256) {
    return UIntStorage[keccak256(record)];
  }

  function setUIntValue(string record, uint256 value) public onlyAdmins {
    UIntStorage[keccak256(record)] = value;
  }

  mapping(bytes32 => bytes32) Bytes32Storage;

  function getBytes32Value(string record) public view returns (bytes32) {
    return Bytes32Storage[keccak256(record)];
  }

  function setBytes32Value(string record, bytes32 value) public onlyAdmins {
    Bytes32Storage[keccak256(record)] = value;
  }

  mapping(bytes32 => address) AddressStorage;

  function getAddressValue(string record) public view returns (address) {
    return AddressStorage[keccak256(record)];
  }

  function setAddressValue(string record, address value) public onlyAdmins {
    AddressStorage[keccak256(record)] = value;
  }

  mapping(bytes32 => bytes) BytesStorage;

  function getBytesValue(string record) public view returns (bytes) {
    return BytesStorage[keccak256(record)];
  }

  function setBytesValue(string record, bytes value) public onlyAdmins {
    BytesStorage[keccak256(record)] = value;
  }

  mapping(bytes32 => bool) BooleanStorage;

  function getBooleanValue(string record) public view returns (bool) {
    return BooleanStorage[keccak256(record)];
  }

  function setBooleanValue(string record, bool value) public onlyAdmins {
    BooleanStorage[keccak256(record)] = value;
  }

  mapping(bytes32 => int) IntStorage;

  function getIntValue(string record) public view returns (int) {
    return IntStorage[keccak256(record)];
  }

  function setIntValue(string record, int value) public onlyAdmins {
    IntStorage[keccak256(record)] = value;
  }
}

■ Programador
Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP

member
Activity: 784
Merit: 64
■ Professional Spanish Translator

El núcleo del enfoque que han tomado en Cardstack estuvo muy influenciado por la publicación de la bloguera llamada Elena Dimitrova sobre cómo COLONY construye contratos ampliables. Específicamente, lo más importante a considerar cuando se actualizan contratos es cómo preservar el estado del contrato original en el contrato actualizado. En un enfoque clásico de ingeniería de software, Elena describe cómo el estado del contrato puede separarse de la funcionalidad del contrato. Este enfoque permite que múltiples contratos compartan el mismo estado.

Cuando desarrollaron ese enfoque, agregaron una componente adicional a la solución: esto es, un “contrato de registro”. El contrato de registro realiza la contabilidad necesaria para realizar un seguimiento del estado del contrato compartido, realizar un seguimiento de las diferentes versiones de cada contrato y vincular y desvincular el estado compartido a los contratos a medida que se agregan nuevas versiones de los contratos a la red.

Puede parecer difícil de comprender, pero es una genialidad
El contrato de registro actúa como un puente entre el Servicio de nombres de Ethereum (ENS) y la última versión de los registros de contratos de Cardstack.

■ Programador

Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP

member
Activity: 784
Merit: 64
■ Professional Spanish Translator



Website |Libro blanco |Facebook |Twitter | Telegram Ingles| Reddit| Blog




¦ Bounty oficial en ingles | ANN en español ¦



Cardstack Contratos actualizables en Solidity 
Parte 01/03
Resolviendo el enigma de cómo mejorar el código de Ethereum






En Cardstack están construyendo un marco de aplicaciones que permitirá a los desarrolladores crear y alojar dApps( aplicaciones decentralizadas), que pongan la experiencia del usuario como algo primordial. Como parte de este esfuerzo, van a crear un token extensible.

→ Si le agrada la temática Ingrese en : https://cardstack.com/

■ Contratos Actualizables.

Entonces, ¿por qué son importantes los contratos actualizables?

Los requisitos cambian, el mercado cambia, el mundo se vuelve más complejo, un químico diría que la entropía del universo aumenta de forma natural. El software, al igual que la biología, se encuentra en constante cambio y evolución. El software más exitoso es el software que se adapta mejor a un mundo cambiante. Un contrato inteligente no es tan inteligente si no puede evolucionar con el tiempo.

Cardstack ha encontrado una manera de resolver este problema crucial.

■ Programador
Hassan Abdel-Rahman
Developer at Cardstack

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP


member
Activity: 784
Merit: 64
■ Professional Spanish Translator

ardstack proporciona un conjunto de herramientas que desbloquean el potencial de la Internet descentralizada para todos: un salto para la cadena de bloques en cada piso de la pila de software.

Ventana para desarrollo de App

Cardstack Framework es un SDK completo para crear aplicaciones de bloqueo potentes y consistentes. Básicamente, hay un concentrador Cardstack que organiza transferencia de datos y valores en múltiples cadenas de bloques y nubes.

El protocolo de negociación

Las dApps alimentadas por Cardstack pueden utilizar el protocolo Tally, que da a los daPP la capacidad de realizar cálculos complejos para organizar grandes redes de usuarios, como ser:

■ Recolectar pagos,
■ Contar votos y
■ Recompensar trabajos.

Ecosistema del token

Los desarrolladores pueden obtener aplicaciones basadas en Cardstack a través de contratos inteligentes respaldados por Cardstack Token (CST), un token que usa la tecnología ERC20 basado en Ethereum, diseñado para recompensar justamente a las comunidades basadas en Cardstack.

Promoción del Token

Es un catalizador para un movimiento global hacia un mercado de software sostenible basado en código fuente abierto respaldado por la criptoeconomía.

Los detalles del token Cardstack están en la última revisión y se publicarán en breve. Esto incluye información sobre los criterios de pre asignación y el mecanismo de recaudación de fondos.

■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP



member
Activity: 784
Merit: 64
■ Professional Spanish Translator
■ Para usuarios finales

Permite mezclar y combine múltiples dApps y aplicaciones en la nube
Permite creer combinaciones increíbles de flujos de trabajo y aplicaciones usando Cardstack Hub
Permite mediante el uso de un token (CST) establecer los acuerdos de retención con todos los servicios que necesita
Permite que sus datos lleguen fácilmente a cualquier parte con nuestra experiencia de usuario.
Permite un comienzo rápido en moneda Fiat: no se requiere experiencia criptográfica

■ Para desarrolladores

provee un completo SDK para crear aplicaciones potentes, hermosas y extensibles
Permite un acceso a una biblioteca completa de la poderosa funcionalidad emergente del sisetma
Mejore su experiencia de aplicación usando Cardstack agregación fuera de la cadena
Se paga de manera justa por el algoritmo de pago y gobernanza operado por la comunidad.
Obtenga un reembolso por sus costos de materiales.
Mantenga las cosas al 100% en código abierto.

■ Para Mineros

Haga un trabajo útil en el empoderamiento impulsado por algoritmos, que proporciona una distribución justa de la riqueza
Ayude a proteger el sistema de los ataques de agentes extremos, maliciosos y correo no deseado
Cargos como los de las tarjetas eBoard pueden ser devueltas al ecosistema
Puede ser compensado por un esquema de clasificación que bloquea las únicas partes que controlan la función de adjudicación




■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP



member
Activity: 784
Merit: 64
■ Professional Spanish Translator



Website |Libro blanco |Facebook |Twitter | Telegram Ingles| Reddit| Blog




¦ Bounty oficial en ingles | ANN en español ¦







El ecosistema CardStack

Este ecosistema se rige por contratos inteligentes respaldados por el token Cardstack llamado CARD, esta construido sobre la tecnología ERC20 de la red Ethereum.

CARD no es solo una unidad de criptografía: sino que está especialmente diseñada para crear un mercado sostenible donde los desarrolladores de código abierto son altamente recompensados, lo que permite a los usuarios seleccionar la combinación perfecta de servicios de software que satisfagan sus necesidades.

Cuando un usuario usa CARD, crea contratos inteligentes entre el usuario y las aplicaciones seleccionadas . Con base en los datos de uso totalmente anónimos seguidos por los contratos inteligentes, lo recopilado se distribuyen regularmente a los creadores y colaboradores de la aplicación de acuerdo con un modelo dinámico de pago algorítmico y gobernanza en manos de la comunidad.

Al igual que otras monedas criptográficas, los usuarios de CARD pueden ser mineros para verificar transacciones y obtener ingresos. Sin embargo, a diferencia de Bitcoin, que obliga a los mineros a resolver problemas matemáticos, los mineros analíticos de Cardstack hacen que el sistema sea justo y flexible al ayudar a calcular la función de recompensa . Los resultados de los mineros analíticos compiten en un esquema de clasificación llamado prueba analítica, por lo que los algoritmos de adjudicación nunca están bajo el control de una sola parte, sino que tienen un control distribuido en el ecosistema.



■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP

member
Activity: 784
Merit: 64
■ Professional Spanish Translator

Con Cardstack, los usuarios finales pueden mezclar y combinar funciones de múltiples aplicaciones o DAPP sin preocuparse por la complejidad de las suscripciones en la nube o los temas vinculados a los servicios. Aún más emocionante: el sistema permite a los usuarios diseñar flujos de trabajo increíblemente nuevos para participar en servicios de diferentes capas de Internet; esto no hubiera sido posible en un mundo centralizado.

La presente invención es posible gracias al paradigma de diseño asociativo que convierte a Cardstack en:

■ Unidades expansibles,
■ Integradas,
■ Encadenadas,
■ Activadas,
■ Versionadas,
■ Clonadas,
■ Aprobadas,
■ Revocadas o
■ Grabadas para siempre en una pieza de capas encapsuladas.

En un mundo descentralizado, sus datos deben estar en red o ser soberanos como lo desee.

Los desarrolladores pueden el framework de Cardstack , un SDK completo para crear aplicaciones poderosas de bloqueo basadas en tarjetas. Construya cualquier cosa usando conceptos modulares y contenedores. Cree fácilmente flujos de trabajo personalizados utilizando Cardstack Hub, que organiza la transferencia de datos y valores en múltiples cadenas de bloques y nubes.

Utilice funciones precompiladas, como:

■ Índices de búsqueda,
■ Notificaciones en tiempo real,
■ Permisos de usuario ,
■ Distribución flexible de contenedores y
■ mucho más.

Todo es ampliable y la fuente es 100% código abierto.



■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP


member
Activity: 784
Merit: 64
■ Professional Spanish Translator



Website |Libro blanco |Facebook |Twitter | Telegram Ingles| Reddit| Blog




¦ Bounty oficial en ingles | ANN en español ¦


Enfoque de Cardstack ,

Cardstack quiere redirigir conceptos verticales a capas horizontales,
conformada por una capa de experiencia dencentralizada en Internet,
 esto permite que un fácil manejo de las aplicaciones locales,
 las aplicaciones en la nube y las aplicaciones dApps
Además, la combinación de experiencia descentralizada
en Internet, junto a la cadena de bloques, y los dispositivos esta
permitiendo que los usaurios vayan aprendiendo a trabajar con
 múltiples aplicaciones en sus dispositivos, nubes y cadenas de
bloques para satisfacer plenamente sus necesidades.

La solución de Cardstack’s

Cardstack está creando una nueva capa de experiencia que ayuda
a los usuarios a organizar su interacción en las aplicaciones (d)
mientras mantiene la aceptación colectiva del mercado de las
tecnologías centralizadas en un ecosistema abierto.

En resumen, el nuevo enfoque debería colocar a los usuarios en el
centro y permitirles actuar como tal; para que las interacciones con
las aplicaciones y los servicios se realicen a través de una pila de
software controlada por los usuarios.

Además, la disposición necesaria para superponer la experiencia
de Internet descentralizada puede hacerse intuitiva al sugerir el
siguiente flujo de movimiento encadenando las capas respectivas
convirtiendo cada estado de una aplicación en una disposición
visual de la información relevante.



■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP



member
Activity: 784
Merit: 64
■ Professional Spanish Translator



Website |Libro blanco |Facebook |Twitter | Telegram Ingles| Reddit| Blog




¦ Bounty oficial en ingles | ANN en español ¦



Los conceptos mas importantes
que podemos resaltar serían:


■ Una tienda de aplicaciones descentralizada (Dapp) que
permite usar la tecnología de capas. La viejas aplicaciones
centralizadas no tienen capacidad de comunicarse entre si,
pero las Dapp si.

■ En las Dapp montadas sobre la nube e internet se accede a
una característica importante: Los usuarios pueden administrar
múltiples suscripciones a productos de software (SaaS)
como servicios basados en la nube y elegir el plan adecuado
para optimizar el costo de todas las funciones requeridas.

■ El surgimiento de la cadena de bloques y las aplicaciones
descentralizadas (dApps) lo ha dificultado al requerir que los
usuarios adquieran y administren servicios para cada una de
las funciones que componen la pila de software.



■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP



member
Activity: 784
Merit: 64
■ Professional Spanish Translator



Website |Libro blanco |Facebook |Twitter | Telegram Ingles| Reddit| Blog




¦ Bounty oficial en ingles | ANN en español ¦



¿Qué es Cardstack?

Cardstack es un framework, un SDK, un marco de código abierto
 y un protocolo de consenso que crea un entorno de software
centralizado que puede desafiar a los superpoderes digitales de hoy en día.

En otras palabras, Cardstack agrega una experiencia revolucionaria
que hace que una tecnología de cadena de bloques sea utilizable y
 escalable ya que crea un ecosistema de software centralizado que
puede competir con las plataformas digitales.
La tecnología como la del bitcoin, estableció un camino donde el
encadenamiento de bloques ofrece la seguridad y la inviolabilidad
necesaria para seguir creciendo, pero también ha beneficiado a
 personas malintencionadas, como los hackers.

El enfoque de descentralización de Cardstack’s permite a los usuarios
 a tener un control sobre los temas de interes, ya que todo esta centrado
en capas que facilitan la interacción con aplicaciones o servicios.



■ Links de la empresa

https://cardstack.com/
https://twitter.com/cardstack
https://www.facebook.com/cardstackproject
https://medium.com/cardstack

■ Chat Oficial de Telegram

Ingles: hIngles: https://t.me/cardstack
Español: Español: http://bit.ly/2FauvfP



member
Activity: 784
Merit: 64
■ Professional Spanish Translator



Website |Libro blanco |Facebook |Twitter | Telegram Ingles| Reddit| Blog




¦ Bounty oficial en ingles | ANN en español ¦



Cardstack  está iniciando su Programa Bounty Oficial para recompensar a sus seguidores con fichas Cardstack.Token: CARD.

El 1% de la cantidad recaudada (en tokens) se asignará al Programa Bounty.

El programa se ejecutará hasta el final de la venta de tokens.
Las recompensas se pagarán dentro de los 30 días posteriores de finalizada de la Venta de Tokens.

Campañas y Porcentaje destinado:





Por favor verifique su participación en esta hoja de cálculo aquí:


REGLA GENERAL :: todos los participantes de recompensas
deben unirse al grupo CardStack en telegram : https://telegram.me/cardstack
Grupo exclusivo de Recompensas telegram: "no hay"

NEWSLETTER

Los primeros 1000 suscriptores del boletín ganarán unos tokens por ser parte del grupo

Solicitud:
1. Suscríbete al boletín en nuestro sitio web

2. Complete y envíe el siguiente formulario: Próximamente



PARTICIPACIÓN SEMANAL
CUALQUIER ENVÍO DE SUS ACCIONES/PUBLICACIONES DE ESTA CAMPAÑA DE RECOMPENSAS MÁS ALLÁ DE LA FECHA DE FINALIZACIÓN DE CADA SEMANA NO SE CONTARÁ

CAMPAÑA DE TWITTER

Las participaciones se pagarán según la cantidad de seguidores (al comienzo de la campaña).

────────────────────────────────
de 250-749 seguidores:1 participación por tweet/retweet
de 750-1499 seguidores:2 apuestas por tweet/retweet
de 1500-9999 seguidores:4 apuestas por tweet/retweet
Más de 10.000 seguidores:6 participaciones por tweet/retweet
────────────────────────────────


Mínimo: 3 retweets por semana
Máximo: 4 retweets por día y 20 retweets por semana

Solicitud:
1. Siga a Cardstack en Twitter: https://twitter.com/cardstack
2. Regístre su participación utilizando este formulario: https://goo.gl/forms/PBhpTQMumsBiLro53
3. Registre sus Tweet/retweets cada semana en el hilo (más reciente dentro de la próxima semana) con este formato:

Code:
TWITTER REPORT
WEEK #
Twitter user URL:
Lista de retweets para la semana # (reemplace # por el número de semanas que participa):
1
2
3
4
5

Reglas:

- Debes tener el rango de "Miembro Jr." o superior en Bitcointalk
- Los tweets / retweets deben tener al menos 2 de estos hashtags:
   #Crowdfunding #Cardstack #dApps.
- Su puntaje de auditoría de twitter (https://www.twitteraudit.com/) debe ser igual a al menos 85% y solo contarán los seguidores reales de la última auditoría.
- La cantidad de seguidores de Twitter NO se actualizarán después de haberse registrado en la campaña
- No retwittear nada anterior a 4 días, NO se contará
- los weets / retweets tienen que estar espaciados por lo menos 1 hora. Cualquier persona que viole esta regla será excluida de la campaña de recompensas



CAMPAÑA DE TRADUCCIONES Y MODERACIÓN

Esta recompensa consiste en dos tareas:

1. Traducción de ANN + bounty thread
2. Creación y moderación de grupos locales de Telegram / Wechat / Kakaochat

Las participaciones obtenidas dependerán de la actividad en el hilo y del número de miembros del grupo Telegram / Wechat / Kakaochat.

  • Traducción del mensaje fijado del grupo principal: 5 participaciones + 2 participaciones por miembro al final de la campaña
  • Moderación local de ANN + bounty thread: 50 participaciones + 10 participaciones por publicación válida
  • Traducción de Whitepaper: 200 participaciones

Solicitud:

1. Envíe un correo electrónico a [email protected] con los siguientes detalles:

- Lengua materna
- Parte de la recompensa que solicita (ANN / WP / Telegram)
- Experiencia de traducción / moderación (si la hay)
- Nombre de usuario Bitcointalk
- Dirección de la cartera ERC-20

2. Después de completar la traducción, publique en este hilo un enlace al hilo traducido o documento técnico

Reglas:
1. Se requiere que los participantes mantengan vivo el hilo local y los grupos de Telegram publicando y traduciendo actualizaciones periódicas, noticias o cualquier anuncio importante. Se rechazará una sola publicación.
2. Las traducciones automáticas (Google o similares) o traducciones con baja calidad serán rechazadas.
3. Las publicaciones innecesarias o repetidas se rechazarán para el recuento de recompensas.
4. Solo las publicaciones escritas por el OP contarán.
5. Solo las publicaciones escritas por el autor se cuentan como publicaciones válidas.



CAMPAÑA DE FIRMA

Distribución de participaciones según nivel de usuario:

Miembro Jr. : 1 Participación / semana
Miembro: 2 Participación/ semana
Miembro completo: 3 Participación/ semana
Miembro Sr : 5 Participación/ semana
miembro Héroe / Legendario: 7 Participación/ semana

Solicitud:
1. Agrega la firma de tu nivel, avatar y texto personal
2. Rellene y envíe este formulario: https://goo.gl/forms/QNyrVLfEIJ3PeS353

Reglas:
1. La Firma, avatar y texto personal deben mantenerse hasta que se hayan calculado las apuestas después del final de la TGE (permita alrededor de una semana para estos cálculos)
2. Se debe realizar un mínimo de 15 publicaciones significativas por semana durante este período. Fuera del tema, spam y publicaciones sin sentido no contarán.
3. Las publicaciones deben tener una longitud mínima de 70 caracteres
4. Los participantes deben tener al menos Rango de miembro Jr. o miembro en el foro

Firmas:

Miembro Jr.
Code:
[center][url=https://cardstack.com/]╔═◼ CARDSTACK ◼═╗The Experience Layer of the Decentralized Internet[/center]


Miembro

Code:
[center][url=https://cardstack.com/]╔═════════════════ [b]CARDSTACK[/b] ═════════════════╗
╚══◼  The Experience Layer of the Decentralized Internet  ◼══╝[/url]
[url=https://twitter.com/cardstack]◼══════ Twitter[/url]  [url=https://telegram.me/cardstack]⦁  Telegram[/url]  [url=https://medium.com/cardstack]⦁   Blog[/url]  [url=https://bitcointalksearch.org/topic/annicocardstack-the-experience-layer-of-the-blockchain-tally-protocol-2768237]⦁  Bitcointalk ══════◼[/url][/center]


Miembro Full
Code:
[center][b][font=arial][url=https://cardstack.com/][color=#00c252]╔═════════════════ [b][color=#3c2282]C[color=#3f1f96]A[color=#431cab]R[color=#4619bf]D[color=#4916d3]S[color=#4619bf]T[color=#431cab]A[color=#3f1f96]C[color=#3c2282]K[/b] ═════════════════╗
[font=rockwell][color=#03c4c0]╚══[color=#3c2282]◼[/color]  [color=#3c2282]The Experience Layer of the Decentralized Internet[/color]  [color=#3c2282]◼[/color]══╝[/url]
[font=rockwell][color=#00c252][color=#3c2282]◼[/color]══════  [url=https://twitter.com/cardstack][color=#9513FF]Twitter[/url]  ⦁  [url=https://telegram.me/cardstack][color=#9513FF]Telegram[/url]  ⦁   [url=https://medium.com/cardstack][color=#9513FF]Blog[/url]  ⦁  [url=https://bitcointalksearch.org/topic/annicocardstack-the-experience-layer-of-the-blockchain-tally-protocol-2768237][color=#9513FF]Bitcointalk[/url]  ══════[color=#3c2282]◼[/color][/center]


Miembro Senior


             ▄▄███▄▄            
           ███████████          
    ▄▄███▄▄  ▀▀███▀▀  ▄▄███▄▄  
  ████████████▄▄    ███████████
    ▀▀████████████▄▄  ▀▀███▀▀  
        ▀▀████████████          
   ▄▄███▄▄  ▀▀███▀▀  ▄▄███▄▄  
  ███████████▄▄     ███████████
    ▀▀████████████▄▄  ▀▀███▀▀  
        ▀▀█████████████▄▄      
    ▄▄███▄▄ ▀▀█████████████▄▄  
  ████████████▄▄ ▀▀████████████
    ▀▀████████████▄▄ ▀▀█████▀▀  
        ▀▀████████████          
            ▀▀█████▀▀          
CARDSTACK
The Experience Layer of the Decentralized Internet
.
Bringing scalability and usability to
dApps for mass market adoption
.
TOKEN EVENT      GET ON WHITELIST
.
Twitter   ⦁   Telegram   ⦁   Blog   ⦁   Bitcointalk
Code:
[center]Sr. Member
[img width=800]https://i.imgur.com/QfIqTah.png[/img][/center]

[code][center][table][tr][td][url=https://cardstack.com/][size=2px][tt][color=#37FF8B]
             ▄▄███▄▄            
           ███████████          
    ▄▄███▄▄  ▀▀███▀▀  ▄▄███▄▄  
  ████████████▄▄    ███████████
    ▀▀████████████▄▄  ▀▀███▀▀  
        ▀▀████████████          
[color=#03c4c0]    ▄▄███▄▄  [color=#37FF8B]▀▀███▀▀[/color]  ▄▄███▄▄  
  ███████████▄▄     ███████████
    ▀▀████████████▄▄  ▀▀███▀▀  
        ▀▀█████████████▄▄      
    ▄▄███▄▄ ▀▀█████████████▄▄  
  ████████████▄▄ ▀▀████████████
    ▀▀████████████▄▄ ▀▀█████▀▀  
        ▀▀████████████          
            ▀▀█████▀▀           [/td][td][url=https://cardstack.com/][font=arial][b][size=22px][color=#3c2282]CARDSTACK
[size=9px]The Experience Layer of the Decentralized Internet[/td][td][/td][td][size=30px][color=#00fff9]│[/td][td][size=4px].
[url=https://cardstack.com/][color=#381D75][size=12px][font=arial]Bringing [b][color=#BD00FF]scalability[/color][/b] and [b][color=#BD00FF]usability[/color][/b] to
dApps for mass market adoption[/td][td][size=30px][color=#00fff9]│[/td][td][size=1px].
[b][color=#381D75][size=10px]TOKEN EVENT      [size=12px][url=https://cardstack.com/][color=#6537FF]GET ON WHITELIST[/url][/b]
[size=5px].
[size=10px][url=https://twitter.com/cardstack][color=#381D75]Twitter[/url]   ⦁   [url=https://telegram.me/cardstack][color=#381D75]Telegram[/url]   ⦁   [url=https://medium.com/cardstack][color=#381D75]Blog[/url]   ⦁   [url=https://bitcointalksearch.org/topic/annicocardstack-the-experience-layer-of-the-blockchain-tally-protocol-2768237][color=#381D75]Bitcointalk[/url][/td][/tr][/table][/center]


Miembro Héroes o Legendario

                                 
              ▄▄███▄▄            
            ███████████          
     ▄▄███▄▄  ▀▀███▀▀  ▄▄███▄▄    
   ████████████▄▄    ███████████  
     ▀▀████████████▄▄  ▀▀███▀▀    
         ▀▀████████████          
    ▄▄███▄▄  ▀▀███▀▀  ▄▄███▄▄    
   ███████████▄▄     ███████████  
     ▀▀████████████▄▄  ▀▀███▀▀    
         ▀▀█████████████▄▄        
     ▄▄███▄▄ ▀▀█████████████▄▄    
   ████████████▄▄ ▀▀████████████  
     ▀▀████████████▄▄ ▀▀█████▀▀  
         ▀▀████████████          
             ▀▀█████▀▀            
                                  
.CARDSTACK..............
...The Experience Layer of the Decentralized Internet.....
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
..Bringing scalability and usability to....
..dApps for mass market adoption......
------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------
..TOKEN EVENT      .GET ON WHITELIST.
...
---------------------------------------------------------------------------------
---Twitter   ⦁   Telegram   ⦁   Blog   ⦁   Bitcointalk----

Code:
[center][table][tr][td][url=https://cardstack.com/][size=2px][glow=#3c2282,2][tt][color=#37FF8B]                                  
              ▄▄███▄▄            
            ███████████          
     ▄▄███▄▄  ▀▀███▀▀  ▄▄███▄▄    
   ████████████▄▄    ███████████  
     ▀▀████████████▄▄  ▀▀███▀▀    
         ▀▀████████████          
[color=#00fff9]     ▄▄███▄▄  [color=#37FF8B]▀▀███▀▀[/color]  ▄▄███▄▄    
   ███████████▄▄     ███████████  
     ▀▀████████████▄▄  ▀▀███▀▀    
         ▀▀█████████████▄▄        
     ▄▄███▄▄ ▀▀█████████████▄▄    
   ████████████▄▄ ▀▀████████████  
     ▀▀████████████▄▄ ▀▀█████▀▀  
         ▀▀████████████          
             ▀▀█████▀▀            
                                  
[/td][td][url=https://cardstack.com/][font=verdana][size=22px][glow=#3c2282,2][color=transparent].[color=#fff]CARDSTACK[color=transparent]..............[/size]
[size=9px][glow=#3c2282,2][color=transparent]...[color=#fff]The Experience Layer of the Decentralized Internet[color=transparent]....[size=5px].
[size=2px][color=transparent][tt]----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------[size=1px]-[/td][td][glow=#4429A3,2][size=5px][color=transparent][tt]-----------------------------------------------------------------------------------------[size=4px]-[/size]
[size=12px]..[font=verdana][url=https://cardstack.com/][color=#fff]Bringing [color=#00fff9]scalability[/color] and [color=#37FF8B]usability[/color] to[tt][color=transparent]...[size=6px].[/size]
[glow=#4429A3,2][color=transparent]..[font=verdana][color=#fff]dApps for mass market adoption[tt][color=transparent].....[size=7px].
[size=3px]-----------------------------------------------------------------------------------------------------------------------------------------------------[size=2px]-[/td][td][glow=#6537FF,2][size=4px][color=transparent][tt]------------------------------------------------------------------------------------------------------------------------[size=3px]-
[size=10px][color=transparent]..[font=verdana][b][color=#fff][size=10px]TOKEN EVENT      [glow=#15FFF9,2][size=12px][color=transparent].[url=https://cardstack.com/][font=verdana][color=#3c2282]GET ON WHITELIST[/url][color=transparent].[/b][/glow][glow=#6537FF,2][tt][color=transparent]..[size=2px].
[size=6px][color=transparent]--------------------------------------------------------------------------------[size=3px]-
[size=10px][color=transparent]---[font=verdana][url=https://twitter.com/cardstack][color=#15FFF9]Twitter[/url]   ⦁   [url=https://telegram.me/cardstack][color=#15FFF9]Telegram[/url]   ⦁   [url=https://medium.com/cardstack][color=#15FFF9]Blog[/url]   ⦁   [url=https://bitcointalksearch.org/topic/annicocardstack-the-experience-layer-of-the-blockchain-tally-protocol-2768237][color=#15FFF9]Bitcointalk[/url][tt][color=transparent]---[size=4px]-[/td][/tr][/table][/center][/quote]






Texto personal: "La experiencia en la Internet descentralizada"

CAMPAÑA DE CREACIÓN DE CONTENIDO

Corre la voz con tu contenido original y gana tokens por:

- Blogueando sobre Cardstack,
- promocionándolo en otros foros, en su grupo de Facebook/LinkedIn o en cualquier otro medio social con un gran alcance
- crear videos de YouTube (incluidas entrevistas)

El 35% de la asignación (0.105% de tokens levantados) se reservará para creadores de contenido VIP solo para invitados.

Las apuestas obtenidas dependen de la calidad (decidida por AmaZix / Cardstack después de la revisión):

Rechazado: 0 participación
Bajo: 1 participación
Medio: 2 participación
Alto: 3 participación
(por publicación / video)

volver a publicar en otro sitio (relevante) ganará un 50% extra de apuestas (se permite una nueva republicación por artículo)

Solicitud:

1. Complete y envíe el siguiente formulario (una vez que suban sus videos o se publiquen sus artículos):
https://goo.gl/forms/O7d2ad6D3Uov9GIq2
2. Publica un enlace a tu artículo / video en el hilo ingles: https://bitcointalksearch.org/topic/closedcardstack-experience-layer-of-blockchain-up-to-350k-2805234


Reglas:
1. El blog / foro debe enfocarse en un tema relevante (a exclusivo criterio de Amazix / Cardstack)
2. Las publicaciones del blog deben tener al menos 250 palabras y las publicaciones del foro deben tener al menos 100 palabras.
3. También se pueden aceptar blogs / foros / videos en idiomas distintos del inglés (a exclusivo criterio de Amazix / Cardstack ). Por favor, póngase en contacto conmigo primero para verificar. NOTA: CUALQUIER ARTÍCULO / VÍDEO NO PREAJUSTADO CREADO EN UN LENGUAJE EXTRANJERO SERÁ RECHAZADO AUTOMÁTICAMENTE (SE OTORGAN 0 PARTICIPACIONES)
4. Los videos deben ser significativos y estar relacionados con Cardstack : venta de tokens, aspectos del Whitepaper, big data, tecnología relacionada, etc.
5. Todos los artículos deben contener enlaces al sitio web de Cardstack , al grupo Telegram y a los hilos de ANN / Bounty.
6. Los videos / artículos con visualizaciones falsas serán descalificados.
7. Solo se aceptará contenido original.
8. No se tolerará el spamming / posting en los subforos incorrectos. Las publicaciones borradas o cerradas por la administración del foro no contarán.




CAMPAÑA DE FACEBOOK

Las participaciones se pagarán dependiendo de la cantidad de amigos/seguidores.

100-500 Seguidores/Amigos: 1 participación por acción+me gusta
500-1500 Seguidores/Amigos: 2 participaciones por cada acción+me gusta
1500-3000 Seguidores/Amigos: 4 participaciones por acción+me gusta
3000 Plus Seguidores/Amigos: 6 participaciones por acción+me gusta

Mínimo de 3 acciones compartidas por semana
Máximo 4 acciones compartidas por día y 20 acciones compartidas por semana

Solicitud
1. Siga y como la página de Facebook de Cardstack : https://www.facebook.com/cardstackproject
2. Rellene y envíe este formulario: https://goo.gl/forms/VKW8imgoSXToJaAq2
3. Registre sus acciones todas las semanas en el foro con este formato:
Code:
[b]FACEBOOK REPORT[/b]
###FACEBOOK SEMANA X###

1
2
3 ...
4
5

Reglas:
1. Los participantes deben compartir y poner me gusta en los mensajes de Cardstack
2. Las cuentas con amigos / seguidores falsos serán descalificadas
3. Amigos / seguidores NO se actualizarán después de haberse registrado en la campaña
4. Todos los artículos compartidos también deben ser del agrado
5. Por favor NO publique comentarios basura, no es necesario ni buscado
6. Las publicaciones / participaciones deben tener un enlace al sitio web de Cardstack o al grupo Telegram Y al menos 2 de estos hashtags: #Crypto #Blockchain #ICO #Crowdfunding #Cardstack #dApps.
DEBE INCLUIR ESTOS EN SUS ACCIONES, de lo contrario no se contarán
7. Las publicaciones / participaciones deben espaciarse al menos 1 hora. Cualquier persona que viole esta regla será excluida de la campaña de recompensas



CAMPAÑA DE YOUTUBE
Suscríbete a nuestro canal de YouTube y sube nuestros videos

1 participación por suscriptor

Solicitud
1. Suscríbete al canal de Youtube de Cardy sube todos los videos
https://www.youtube.com/channel/UCeQgdosVCtedpFiAEwKretg
2. Complete y envíe este formulario: https://goo.gl/forms/8RGqjgRev0AhQ7g83



CAMPAÑA DE CRIPTO COMPARACION

Sigue A Cardstack en CryptoCompare y gana algunos tokens

1 participación por seguidor

Solicitud
Abra una cuenta en Cryptocompare y siga Cardstack
Envíe este formulario: [en proceso]



BONOS

2.5% de los tokens están reservados para los participantes en recompensas que hacen un esfuerzo adicional y hacen un esfuerzo especial para promocionar nuestra venta de tokens. Estos tokens se asignarán a exclusivo criterio de AmaZix/Cardstack (por lo que no aceptaremos ninguna objeción sobre la forma en que se distribuyen).

Algunas actividades que podrían ser dignas de estos tokens son:
Contenido con una calidad especialmente alta o gran alcance
Apertura de nuevos canales para la promoción de la venta
Actividad superior a la media en grupos de Telegram o hilos ANN (no es obligatorio)



CAMPAÑA DE TELEGRAM( Para dueños de grupos)
Corre la voz en tu grupo de Telegram sobre Cardstack y gana algunos tokens

100-249 Miembros: 1 participación / publicación
250-749 Miembros: 2 participación / publicación
750-2499 Miembros: 4 participación / publicación
Más de 2500 miembros: 6 participaciones / publicación

Solicitud
Envíe este formulario: https://goo.gl/forms/upObdDc0bYbsKoLN2
2. Invita a @jamalbtc al grupo
3. Una vez aprobado, recibirás un discurso para publicar en el grupo
4. Cargue la captura de pantalla (usando imgur, postimage o similar) y repórtelo en el hilo con este formato:

Code:
#### TELEGRAM WEEK X ####
Enlace a la publicación de Telegram

Reglas
1. Se permite un máximo de 1 publicación por semana en cada grupo
2. Los grupos con miembros falsos (invitados sin permiso) serán descalificados




REGLAS GENERALES:

1. El Administrador de programa de Recompensas y el Equipo se reservan el derecho de hacer cambios a los términos en cualquier momento.
2. Las direcciones de pago NO se modificarán después de la presentación.
3. Cualquier tipo de comportamiento ofensivo o inadecuado al promocionar Cardstack resultará en la descalificación inmediata de la campaña de recompensas
4. Los decisiones del Administrador del programa de recompensas/equipo Cardstack son finales.
5. Para consultas o quejas, complete y envíe este formulario, NO HAY PREGUNTAS QUE SE ENTREGARAN A TRAVÉS DE PM (mensaje privado):

https://goo.gl/forms/GQWSdQaMu6fcty7V2
[/code]
Jump to: