{"id":22599077,"url":"https://github.com/dappsar/suc","last_synced_at":"2026-04-28T11:33:58.441Z","repository":{"id":123681495,"uuid":"166860780","full_name":"dappsar/suc","owner":"dappsar","description":"Implementación de los activos de la ONG \"Salva un Caballo\", haciendo uso del estándar ERC-721, para representar los activos mediante un token no fungible (NFT).  Este repositorio, es parte del trabajo de fin de máster (TFM), correspondiente al Máster de blockchain, cripto-economía y Ethereum, de la UAH","archived":false,"fork":false,"pushed_at":"2019-04-18T19:17:29.000Z","size":8847,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-28T19:45:10.395Z","etag":null,"topics":["blockchain","javascript","nft","smart-contracts","solidity"],"latest_commit_sha":null,"homepage":"","language":"Solidity","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dappsar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-21T18:28:52.000Z","updated_at":"2023-01-24T18:07:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"81e021d5-d637-45a1-8637-70d9c4165087","html_url":"https://github.com/dappsar/suc","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/dappsar/suc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dappsar%2Fsuc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dappsar%2Fsuc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dappsar%2Fsuc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dappsar%2Fsuc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dappsar","download_url":"https://codeload.github.com/dappsar/suc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dappsar%2Fsuc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32379348,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T11:25:28.583Z","status":"ssl_error","status_checked_at":"2026-04-28T11:25:05.435Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","javascript","nft","smart-contracts","solidity"],"created_at":"2024-12-08T11:08:06.523Z","updated_at":"2026-04-28T11:33:58.405Z","avatar_url":"https://github.com/dappsar.png","language":"Solidity","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Travis Build Status](https://travis-ci.org/dappsar/suc.svg?branch=master)](https://travis-ci.org/dappsar/suc) \u0026nbsp;\r\n[![CircleCI Build Status](https://circleci.com/gh/dappsar/suc/tree/master.svg?style=svg)](https://circleci.com/gh/dappsar/suc/tree/master) \u0026nbsp;\r\n[![Coverage Status](https://coveralls.io/repos/github/dappsar/suc/badge.svg?branch=master)](https://coveralls.io/repos/github/dappsar/suc?branch=master)\r\n\r\n\r\n# Tokenización de activos de ONG \"Salva un Caballo\"\r\n\r\n## Introducción\r\n\r\nSe mantiene en éste repositorio, la implementación de los activos de la ONG \"Salva un Caballo\", haciendo uso del estándar [ERC-721](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md), para representar los activos mediante un token no fungible ([TNF](https://en.wikipedia.org/wiki/Non-fungible_token)).\r\n\r\nEste repositorio, es parte del trabajo de fin de máster (TFM), correspondiente al Máster de blockchain, cripto-economía y Ethereum, de la [Universidad de Alcalá](https://www.uah.es/es/).\r\n\r\n## Contenido\r\n\r\nEn éste documento se describe:\r\n\r\n- [Estructura del proyecto](https://github.com/dappsar/suc/#estructura-del-proyecto)\r\n    \r\n    * [Carpetas y archivos](https://github.com/dappsar/suc/#carpetas-y-archivos)\r\n    * [Diagrama de clases de los contratos e interfaces](https://github.com/dappsar/suc/#carpetas-y-archivos)\r\n    * [Contratos e Interfaces](https://github.com/dappsar/suc/#carpetas-y-archivos)\r\n\r\n- [Preparación del ambiente](https://github.com/dappsar/suc/#preparaci%C3%B3n-del-ambiente)\r\n\r\n    * [Requisitos](https://github.com/dappsar/suc/#requisitos)\r\n    * [Instalación](https://github.com/dappsar/suc/#instalación)\r\n\r\n- [Flujo de los fuentes](https://github.com/dappsar/suc/#floju-de-los-fuentes)\r\n\r\n    * [Compilación](https://github.com/dappsar/suc#compilaci%C3%B3n)\r\n    * [Testing](https://github.com/dappsar/suc#testing)\r\n    * [Migración a una blockchain](https://github.com/dappsar/suc#testing)\r\n    * [Minting](https://github.com/dappsar/suc#testing)\r\n\r\n- [Despliegue en Marketplaces](https://github.com/dappsar/suc#despliegues-en-marketplaces)\r\n\r\n    * [Despliegue en rinkeby usando el compilador web Remix](https://github.com/dappsar/suc#despliegue-en-rinkeby-usando-el-compilador-web-remix)\r\n    * [openSea](https://github.com/dappsar/suc#opensea)\r\n    * [RareBits](https://github.com/dappsar/suc#rare-bits)\r\n\r\n- [Créditos](https://github.com/dappsar/suc/#créditos)\r\n\r\n---\r\n\r\n## Estructura del proyecto\r\n\r\nA continuación se describen las carpetas y archivos (del raíz) que forman parte del proyecto. Todos los archivos correspondientes a los contratos y sus tests, se encuentran en la carpeta [src](https://github.com/dappsar/suc/blob/master/src).\r\n\r\n### Carpetas y archivos\r\n\r\n```bash\r\n├───.circleci           --\u003e Configuración de circle-ci\r\n├───build               --\u003e Carpeta con los contratos en Json\r\n├───doc                 --\u003e Documentación del proyecto\r\n├───images              --\u003e Algunas imagenes del readme\r\n├───scripts             --\u003e Archivos para facilitar acciones (ejemplo: el proceso de minting)\r\n└───src\r\n    ├───contracts\r\n    │   ├───math        --\u003e Support Math Utils Library\r\n    │   ├───ownership   --\u003e Support Ownable Contract\r\n    │   ├───principal   --\u003e NFT Principal\r\n    │   ├───proxy       --\u003e Contrato para proxy\r\n    │   ├───tokens      --\u003e Support ERC721 Interfaces (enumerable, metadata, receiver)\r\n    │   └───utils       --\u003e Supports libraries (ERC165, AddressUtils and Supports Interface)\r\n    ├───migrations      --\u003e Contratos de truffle para migración\r\n    └───tests\r\n        ├───principal   --\u003e Contract Tests\r\n        └───tokens      --\u003e Javascript Tests\r\n    ├───toRemix         --\u003e Todos los contratos en un solo archivo para deploy en Remix\r\n├───.babelrc            --\u003e Configuración de [Babel](https://babeljs.io/docs/en/)\r\n├───.coveralls.yml      --\u003e Configuración de [Coveralls.io](https://coveralls.io/)\r\n├───.editorconfig       --\u003e Configuración para el editor\r\n├───.env.sample         --\u003e Ejemplo de archivo de configuración de entorno con las variables para truffle\r\n├───.eslintignore       --\u003e Archivos / carpetas a ser ignoradas por [esLint](https://eslint.org/docs/user-guide/configuring)\r\n├───.eslintrc.js        --\u003e Configuración de [esLint](https://eslint.org/docs/user-guide/configuring), para \"linting\" de archivos de javascript\r\n├───.gitattributes      --\u003e Configuración para Git\r\n├───.gitignore          --\u003e Archivos / carpetas a ser ignoradas por git\r\n├───.npmignore          --\u003e Archivos a ser ignorados por NPM\r\n├───.solhint.json       --\u003e Configuración de [solHint](https://protofire.github.io/solhint/), para \"linting\" código en Solidity\r\n├───LICENSE             --\u003e Licencia de los fuentes\r\n├───package.json        --\u003e El archivo de npm para las dependencias y scripts\r\n├───README.md           --\u003e Este archivo!\r\n├───truffle-config.js   --\u003e Configuración de Truffle\r\n└── tsconfig.json       --\u003e Configuración de TypeScript (los tests)\r\n```\r\n\r\n\r\n### Diagrama de clases de los contratos e interfaces\r\n\r\nPowered by [mermaid](https://github.com/knsv/mermaid)\r\n\r\n```mermaid\r\nclassDiagram\r\nErc721Metadata \u003c|-- NFTokenMetadata\r\nNfToken \u003c|-- NFTokenMetadata\r\n\r\nErc721Enumerable \u003c|-- NFTokenEnumerable\r\nNfToken \u003c|-- NFTokenEnumerable\r\n\r\nErc765 \u003c|-- SupportsInterface\r\nSupportsInterface \u003c|-- NfToken\r\nErc721 \u003c|-- NfToken\r\n\r\nOwnable \u003c|-- SucToken\r\nNFTokenMetadata \u003c|-- SucToken\r\nNFTokenEnumerable \u003c|-- SucToken\r\n\r\nAddressUtils -- NfToken: Usa\r\nSafeMath -- NfToken: Usa\r\nERC721TokenReceiver -- NfToken: Usa\r\n\r\nErc721 : \u003c\u003c'interface'\u003e\u003e:\r\nErc721Enumerable : \u003c\u003c'interface'\u003e\u003e\r\nErc721Metadata : \u003c\u003c'interface'\u003e\u003e\r\nERC721TokenReceiver :  \u003c\u003c'interface'\u003e\u003e\r\nErc765 : \u003c\u003c'interface'\u003e\u003e\r\nSupportsInterface : \u003c\u003c'interface'\u003e\u003e\r\nAddressUtils :  \u003c\u003c'library'\u003e\u003e\r\nSafeMath :  \u003c\u003c'library'\u003e\u003e\r\n\r\n```\r\n\r\n![Mermaid diagram rendered](images/class-diagram.png)\r\n\r\n\r\n### Contratos e Interfaces\r\n\r\n* [principal/sucToken.sol](src/contracts/principal/sucToken.sol): Es el contrato principal, que tiene la implementación de los activos de la ONG.\r\n- [tokens/nfToken.sol](src/contracts/tokens/nfToken.sol): Implementación de la interfaz erc721. Además de supportsInterface. \r\n* [tokens/nfTokenEnumerable](src/contracts/tokens/nfTokenEnumerable.sol): Implementación de la interfaz erc721Enumerable.\r\n- [tokens/nfTokenMetadata](src/contracts/tokens/nfTokenMetadata.sol): Implementación de la interfaz ercMetadata.\r\n* [tokens/erc721.sol](src/contracts/tokens/erc721.sol): Interfaz con la implementación estándar de ERC-721, correspondiente al EIP-721.\r\n- [tokens/erc721Enumerable.sol](src/contracts/tokens/erc721Enumerable.sol): Interfaz con la implementación estándar de la extensión enumerable, definida en el EIP-721.\r\n* [tokens/erc721Metadata.sol](src/contracts/tokens/erc721Metadata.sol): Interfaz con la implementación estándar de la extensión de metadata, definida en el EIP-721.\r\n- [tokens/erc721TokenReceiver.sol](src/contracts/tokens/erc721TokenReceiver.sol): Interfaz con la implementación estándar de la extensión para transferencias seguras, definida en el EIP-721.\r\n* [ownership/ownable.sol](src/contracts/ownership/ownable.sol): Proporciona funciones para el control de autorización de usuarios, una dirección de propietario (owner) del contrato y simplifica la implementación de permisos de usuarios.\r\n- [math/safeMath.sol](src/contracts/math/safeMath.sol): Esta es una librería que desarrolló el equipo de openZeppelin para tener en cuenta verificaciones en cálculos matemáticos de los contratos inteligentes y evitar errores al hacer uso de operadores matemáticos sin un resguardo lógico ante posible fallos, como un overflow en la suma de dos unit256 que tenga como resultado un valor mayor al soportado por la variable a la que se asigna éste último.\r\n* [utils/addressUtils.sol](src/contracts/utils/addressUtils.sol): Una librería con poco código (una sola función), para un control de las direcciones de los contratos.\r\n- [utils/erc165.sol](src/contracts/utils/erc165.sol): Ésta es una interfaz que provee al contrato de métodos estándares para determinar que otras interfaces implementa. \r\n* [utils/supportsInterface.sol](src/contracts/utils/supportsInterface.sol): Este contrato es la implementación de la interfaz ERC165, que 0xCert toma la implementación de openZeppelin  y le hizo un cambio de nombre, eliminó el método _registerInterface y cambio de private a internal la variable _supportedInterfaces.\r\n* [proxy/proxy.sol](src/contracts/proxy/proxy.sol): Contrato utilizado para la actualización del contrato [sucToken.sol](src/contracts/principal/sucToken.sol). No se muestra en el diagrama, dado que su uso es a nivel de implementación y no tiene relación directa con el resto de contratos (quedaría como una \"caja\" suelta en el diagrama).\r\n\r\n---\r\n\r\n## Preparación del ambiente\r\n\r\nPara la ejecución del proyecto, es necesario cumplir con algunos requisitos, que se describen a continuación. Luego, se detalla cómo realizar el despliegue del proyecto en ambiente local. \r\n\r\n### Requisitos\r\n\r\nEn el ambiente local es requerido tener instalado:\r\n\r\n- [Git](https://nodejs.org/en/)\r\n- [nodeJs](https://nodejs.org/en/)\r\n- [Ganache](https://truffleframework.com/ganache)\r\n- [Truffle](https://truffleframework.com/)\r\n- [Metamask](https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=es)\r\n- [ethereumjs-testrpc](https://www.npmjs.com/package/ethereumjs-testrpc)\r\n\r\n---\r\n\r\n## Instalación\r\n\r\n### PASO 1: Clonación\r\n\r\nDescargar el proyecto con git\r\n\r\n```\r\ngit clone https://github.com/dappsar/suc.git\r\n```\r\n\r\n### PASO 2: Instalar dependencias\r\n\r\nInstalar las dependencias del proyecto con:\r\n\r\n```\r\nnpm install\r\n```\r\n\r\nEso generará la carpeta _node_modules_ con todas las dependencias requeridas.\r\n\r\n### PASO 3: Iniciar Ganache\r\n\r\nIniciar el cliente ganache que se haya descargado. Por lo general, esto se logra, haciendo doble click en el acceso directo que haya generado la instalación.\r\n\r\n\r\n### PASO 4: Configurar variables de entorno\r\n\r\nEl proyecto usa [Infura](https://infura.io/) para el despliegue en las redes de Ethereum y, así, evitar tener configurado un nodo local. Para ello, se requiere configurar las siguienes variables en un archivo de entorno (.env) o definirlas como variables del sistema operativo (con EXPORT o SET):\r\n\r\n__Definición en archivo .env:__\r\n\r\n(se puede ver un archivo de ejemplo [aquí](.env.sample))\r\n\r\n```\r\n- INFURA_KEY=\"\": Key provista por el sitio de infura, para el proyecto que tengamos creado\r\n- MNEMONIC=\"\": las 12 palabras que ayudan a crear la clave privada de la cuenta que tengamos en Metamask\r\n- OWNER_ADDRESS=\"\": Dirección de Metamask que se usará para desplegar los contratos\r\n```\r\n\r\n__Definición mediante EXPORT:__\r\n\r\n```\r\nexport INFURA_KEY=\"\u003cyour_infura_key\u003e\"\r\nexport MNEMONIC=\"\u003cmetamask 12 mnemonic words\u003e\"\r\nexport OWNER_ADDRESS=\"\u003cmetamask address\u003e\"\r\n```\r\n\r\n\r\nEstas variables no son necesarias para el despliegue en localhost, pero como se controla su definición para todas las redes, hay que ponerles algún valor por defecto, que para localhost, puede ser cualquier valor distinto de vacío.\r\n\r\n---\r\n\r\n## Flujo de los fuentes\r\n\r\n\r\n### Compilación\r\n\r\nPara realizar la compilación de los contrato, se tiene que ejecutar el siguiente comando:\r\n\r\n```\r\nnpm run compile\r\n```\r\n\r\n## Testing \r\n\r\nSe está utilizando para probar los smart contracts, el [framework Specron](https://github.com/fulldecent/framework-1).\r\nSe pueden correr los tests realizados para el contrato, con el comando:\r\n\r\n```\r\n# Tests con specron\r\nnpm run test\r\n\r\n# Tests con truffle\r\n# Hay que especificar la carpeta de tests, dado que no lo es la default de truffle\r\ntruffle test ./src/tests/truffle/\r\n\r\n```\r\n\r\nEse comando, llama al framework specron y ejecuta los tests de la carpeta [src/tests](src/tests).\r\n\r\n\r\n### Migración a una blockchain\r\n\r\nTeniendo los contratos compilados e iniciado _Ganache_, se pueden migrar a la blockchain con el siguiente comando:\r\n\r\n```\r\ntruffle migrate --reset\r\n```\r\n\r\nSi se desea desplegar en otra red, diferente a la local, se tiene que usar el parámetro _network_ y tener configurada la red en el archivo _truffle.js_.\r\n\r\n```\r\n# Depliegue en Rinkeby\r\ntruffle migrate --reset --network rinkeby\r\n\r\n# Despliegue en Ropsten\r\ntruffle migrate --reset --network ropsten\r\n```\r\n\r\nEn el archivo de configuración de truffle (truffle-config.js), está configurado la migración para infura.io. \r\nPara que funcione, es necesario configurar tres variables de entorno: MNEMONIC,  INFURA_KEY y OWNER_ADDRESS, con los datos del proyecto que cada uno tenga en Infura y metamask. Eso se puede configurar en un archivo .env (Linux) o setear esas variables con un EXPORT (Windows / linux).\r\n\r\n### Minting\r\n\r\nDespués de desplegarse el contrato en la blockchain, se podrá ver en Etherscan. La dirección del contrato, se puede tomar de la salida de la consola de truffle, luego de ejecutar la migración. En la siguiente imagen se puede ver un ejemplo de la salida de éste paso:\r\n\r\n![Salida Truffle migrate](images/truffle-migrate.png)\r\n\r\nEn etherscan, se puede ver ingresando la siguiente dirección:\r\n\r\nURL: https://rinkeby.etherscan.io/address/\u003ccontract_address\u003e.\r\n\r\n\r\n[Aca](https://rinkeby.etherscan.io/address/0xC38eA247088ee22aeFCcf58671938e2E27875850) hay un ejemplo del contrato desplegado en Rinkeby.\r\n\r\nLuego, teniendo algunas variables configuradas en el entorno o archivo .env, se puede ejecutar el script [scripts/mint.js](scripts/mint.js) para interactuar con el contrato desplegado.\r\n\r\n```\r\n# Variables a configurar \r\nNFURA_KEY=\"\": Key provista por el sitio de infura, para el proyecto que tengamos creado\r\nMNEMONIC=\"\": las 12 palabras que ayudan a crear la clave privada de la cuenta que tengamos en Metamask\r\nOWNER_ADDRESS=\"\": Dirección de Metamask que se usará para desplegar los contratos\r\nFACTORY_CONTRACT_ADDRESS=\"\"\r\nNFT_CONTRACT_ADDRESS=\"\u003cDireccion del contrato, obtenido luego de truffle migrate\u003e\"\r\nNETWORK=\"rinkeby\"\r\n```\r\n\r\n```\r\n# Para ejecutar el minting:\r\nnode scripts/mint.js\r\n```\r\n\r\nEjemplo de salida del script mint.js:\r\n\r\n\r\n![Salida mint.js](images/mint.png)\r\n\r\n\r\n---\r\n\r\n## Despliegue en marketplaces\r\n\r\nEl contrato al respetar la interface ERC-721, puede ser desplegado en distintos marketplaces, como [OpenSea](https://opensea.io/) y [RareBits](https://rarebits.io/).\r\n\r\nPara desplegar el contrato en esos marketplaces, es necesario subirlo a la red que querramos (por ejemplo, [rinkeby](https://rinkeby.etherscan.io/)) y luego realizar el proceso de Minting, para crear los tokens. Hecho eso, se puede ingresar a la misma red, en la URL del marketplace y seguir el wizard que brindan para publicarlo, por lo general, es ingresar la dirección del contrato y listo. \r\n\r\n### Despliegue en rinkeby usando el compilador web Remix\r\n\r\n#### Compilación\r\n\r\nPara desplegar el contrato a través del compilador remix, basta con ingresar al sitio del compilador en [https://remix.ethereum.org](https://remix.ethereum.org/) y copiar el código de nuestro contrato.  Como nuestro contrato tiene dependencias con otros, hay que copiar el código del resto también. En el [siguiente archivo](src/toRemix/deploy.in.remix.sol), se deja todo el código junto.\r\n\r\nLuego, se tiene que seleccionar el compilador correspondiente a la versión de nuestro contrato: soljson-v0.5.2+commit.1df8f40c\r\n(se puede ingresar directamente a la url de Remix con esa versión en éste [link](https://remix.ethereum.org/#optimize=false\u0026version=soljson-v0.5.2+commit.1df8f40c.js)).\r\n\r\nCopiado el código, compilamos el contrato y, de no haber errores, podemos ir a la solapa \"Run\" para desplegar el contrato.\r\n\r\n![Remix Compile](images/remix-compile.png)\r\n\r\n#### Despliegue\r\n\r\nEn la Solapa run, tenemos que elegir en la lista desplegable el nombre de nuestro contrato \"SucToken\" y completar las propiedades _name y _symbol. Luego presionamos \"transact\".\r\n\r\n![Remix Deploy](images/remix-deploy.png)\r\n\r\nPodemos verificar el contrato desplegado en Etherscan, de la red Rinkeby. En el siguiente [link](https://rinkeby.etherscan.io/address/0x89593dd8af8d3a6fd278c08f373d22669dda1cfb), se puede ver un ejemplo de despliegue.\r\n\r\n* Contract Address: 0x89593dd8af8d3a6fd278c08f373d22669dda1cfb\r\n* MetaMask Account: 0x0Fb80359dD096A1Ec1FbfDC07ddEBc2003272b0c\r\n\r\n![Contract Deployed](images/contract-deployed.png)\r\n\r\n#### Completar el código del contrato\r\n\r\nEn etherscan, podemos completar el código fuente del contrato, para que quede verificado. \r\nEsto se puede realizar, haciendo un copy/paste del código en Remix, a la solapa \"code\" del contrato.  Adicionalmente, nos pedirá la versión del compilador usado (que hay que poner exactamente la misma que usamos en remix: soljson-v0.5.2+commit.1df8f40c), el nombre del contrato \"SucToken\" y si queremos optimización o no (elegir que no). \r\n\r\n![Contract Deployed](images/verify-contract-code.png)\r\n\r\n\r\n#### Minting\r\n\r\nTeniendo el contrato compilado y su código verificado en Etherscan, podemos ejecutar los métodos de nuestro contrato. Se puede utilizar la misma interfaz de Remix para ello. \r\n\r\nEn la siguiente imagen, se puede ver la ejecución del método \"mint\", que permite la creación de un token. Solo hay que completar:\r\n\r\n* La dirección del owner, que ponemos la misma con la que se deplegó el contrato\r\n* Un tokenId\r\n* Una dirección url, que contenga la información de la metadata del token. Aca ingresamos una URL de un [archivo json](https://ipfs.infura.io/ipfs/QmSME3zkPwdyxZ3v6bhjmcnkBaMPSfi731n5mtDDmmmZxA) subido previamente a IPFS de la red rinkeby de Infura. \r\n\r\n![Remix Mint](images/remix-mint.png)\r\n\r\nUna vez finalizada la transacción, se puede comprobar en Etherscan. \r\nEjemplo en el siguiente [link](https://rinkeby.etherscan.io/tx/0x0e543b8cf2f25ad43bcf8252374007051f66aaf41addc61092b234c55850f000). \r\n\r\n\r\n![Mint Transaction](images/mint-transaction.png)\r\n\r\n### OpenSea\r\n\r\nTeniendo el contrato desplegado en la red de Ethereum y algún token generado (con el proceso de minting), podemos subirlo al marketplace. \r\nPara subirlo a OpenSea, tenemos que ir a la dirección de la misma red en donde subimos el contrato. En éste caso, Rinkeby: https://rinkeby.opensea.io\r\n\r\nSeleccionamos *Develop* / *Submit Dapps* para subir nuestro contrato. \r\n\r\n![Open Sea Submit](images/open-sea-submit-dapps.png)\r\n\r\nNos pide la dirección del contrato, en donde ingresamos la dirección de EtherScan (0x89593dd8af8d3a6fd278c08f373d22669dda1cfb) y completamos el wizard de Open Sea, que nos mostrará los tokens que tiene el contrato.\r\n\r\n![Open Sea process 1](images/open-sea-process-1.png)\r\n\r\n![Open Sea process 2](images/open-sea-process-2.png)\r\n\r\n\r\nEn las siguientes direcciones, podemos ver la transacción del proceso de minting en Etherscan y la visualización de tokens en OpenSea:\r\n\r\n\r\n* Mint Transaction en EtherScan: https://rinkeby.etherscan.io/tx/0x0e543b8cf2f25ad43bcf8252374007051f66aaf41addc61092b234c55850f000\r\n* Como se ve en openSea: https://rinkeby.opensea.io/assets/0x89593dd8af8d3a6fd278c08f373d22669dda1cfb/4\r\n\r\n![Open Sea Deployed](images/open-sea-deployed.png)\r\n\r\n\r\n### Rare Bits\r\n\r\nPara subirlo a RareBits, tenemos que ingresar a la dirección de la red Rinkeby en [https://rinkeby.rarebits.io/](https://rinkeby.rarebits.io/) y seleccionar la opción del menú *submit dapp*. \r\n\r\n![RareBits Submit Dapp](images/rearebits-submit-dapp.png)\r\n\r\nIngresamos la dirección del contrato: 0x89593dd8af8d3a6fd278c08f373d22669dda1cfb y seguimos los pasos del wizard.\r\n\r\n![RareBits Bits Verified](images/rarebits-verified.png)\r\n\r\n\r\nComo se ve en rareBits: https://rinkeby.rarebits.io/collection/tmpsuctoken4\r\n\r\n![RareBits Deployed](images/rarebits-deployed.png)\r\n\r\n---\r\n\r\n## Créditos\r\n\r\n* La implementación del proyecto, se basa en el código fuente de [0xCert](https://github.com/0xcert/ethereum-erc721), quienes tienen una implementación estándard para tokens no fungibles (NTF) cumpliendo el estándar [ERC-721](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md). \r\n\r\n- Para la realización del diagrama de clases en markdown, usamos [Mermaid](https://github.com/knsv/mermaid), y la ayuda de estee [post](http://mdp.tylingsoft.com/#class-diagram).\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdappsar%2Fsuc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdappsar%2Fsuc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdappsar%2Fsuc/lists"}