Min-StarkNet es un proyecto paralelo influenciado por Lil-Web3 de Miguel Piedrafita, destinado a crear implementaciones mínimas e intencionalmente limitadas de diferentes protocolos, estándares y conceptos para ayudar a un principiante de Cairo a aprender y familiarizarse con las sintaxis básicas de Cairo, avanzando rápidamente de principiante a intermedio😉.
Este proyecto utiliza Protostar como marco de desarrollo. Para comenzar con Protostar, siga las guías contenidas en los documentos oficiales.
Tenga en cuenta que Protostar actualmente tiene soporte solo para Linux y MacOS, por lo que si está ejecutando un sistema operativo Windows, intente consultar WSL2.
Una vez que haya instalado Protostar, siga adelante para clonar el repositorio ejecutando el siguiente comando en una terminal:
- Original Darlington02
git clone git@github.com:Darlington02/min-starknet.git
- Nadai con Guía
gh repo clone Nadai2010/Nadai-Min-Starknet
PD: asegúrese de seguir el repositorio, en el orden especificado a continuación para obtener la máxima eficiencia, y siempre lea los comentarios del código para comprender de manera efectiva los códigos subyacentes, Y podría ser útil tener en cuenta también que goerli2 fue la red más utilizada durante el desarrollo
Finalmente, este repositorio está dirigido a aquellos con conocimientos básicos de cómo funcionan Cairo y StarkNet. Si no comprende la sintaxis básica de El Cairo, tómese un tiempo para leer primero mi serie Journey through Cairo en medium.
Min-ens es una implementación simple de un servicio de espacio de nombres en El Cairo. Contiene una sola función externa store_name
y una sola función de vista get_name
. Una variable de almacenamiento names
que es una asignación de dirección a nombre, también se usa para almacenar los nombres asignados a cada dirección, y un evento nombre_almacenado que se emite cada vez que un nombre ¡está almacenado!
También hay disponible un archivo de prueba básico aquí para ayudarlo a aprender los conceptos básicos de la escritura de pruebas en Cairo con Protostar.
Una de las cosas básicas que aprendemos a hacer al comenzar con el desarrollo de contratos inteligentes es aprender a construir e implementar el popular contrato de token ERC2O. En este repositorio, implementamos el estándar ERC20 usando la biblioteca de Openzeppelin.
El objetivo de este proyecto es construir e implementar un contrato de token ERC20 simple.
Para mejorar en la redacción de pruebas, puede intentar comprender y replicar la prueba de contrato ERC20 cairo aquí.
Min-erc721 implementa el estándar de token ERC721 (tokens no fungibles) en El Cairo utilizando la biblioteca de Openzeppelin.
El objetivo es construir e implementar un contrato ERC721 simple en Starknet.
También hay un archivo de prueba disponible aquí
Min-nft-marketplace es una implementación mínima de un NFT Marketplace para comprar y vender tokens NFT.
Implementa dos funciones externas, list_token(token_contract_address, token_id, price)
para enumerar tokens en el mercado y buy_token(listing_id)
para comprar tokens en el mercado.
Los eventos listing_created
y listing_sold
también se emiten cada vez que se enumera o vende un token.
Nota: Recuerde llamar a setApprovalForAll(marketplace_contract_address, true) en el contrato para el NFT que está enumerando antes de llamar a la función list_token
Próximamente archivo de prueba..
Min-amm es una implementación mínima de un creador de mercado automatizado en El Cairo. Los códigos fuente se obtuvieron y se modificaron mínimamente de los Cairo docs, por lo que puede consultarlos en caso de que se confunda.
También se creó un archivo de prueba aquí.
Min-ico es una implementación mínima de una preventa o ICO en El Cairo. Una oferta inicial de monedas ICO es el equivalente a una IPO, una forma popular de recaudar fondos para productos y servicios generalmente relacionados con criptomonedas.
El proceso de pensamiento para esta aplicación es que un usuario interesado en participar en la ICO debe registrarse primero con 0.001 ETH
llamando a la función register
, luego, una vez que expire la duración de la ICO especificada usando ICO_DURATION
, ahora puede llamar a la función externa claim
para reclamar su parte de tokens ICO.
PD: Todos los usuarios que participan en la ICO pagan la misma cantidad por el registro y reclaman la misma cantidad de tokens.
Nota: Recuerde llamar a aprobar(<dirección del contrato>, reg_amount) en el contrato ETH de StarkNet antes de llamar a la función registrar
Min-stake es una implementación mínima de un contrato de staking en El Cairo.
El staking es un proceso popular de bloquear una cierta cantidad de sus tenencias criptográficas para obtener recompensas o ganar intereses.
El proceso de pensamiento para esta aplicación requiere que un usuario primero deposite una cierta cantidad del token ERC20 para apostar llamando a la función stake (stake_amount, duration_in_secs)
, y finalmente reclame los tokens + el interés acumulado una vez que la duración haya terminado por llamando a la función claim_rewards(stake_id)
.
Nota: Recuerde llamar a aprobar(stake_contract_address, stake_amount) en el contrato StarkNet ETH antes de llamar a la función stake
La capacidad de crear puentes de mensajería personalizados en StarkNet para transferencias de datos y activos es una de las características principales que hace que StarkNet se destaque de otros paquetes acumulativos existentes.
En este proyecto, vamos a crear un puente de mensajería ERC20 personalizado simple que puede ayudar a un usuario a transferir un token ERC20 entre StarkNet y Ethereum.
El proceso de pensamiento para esta aplicación es que tenemos un token ERC20 implementado en StarkNet, que pretendemos conectar con Ethereum, para permitir que los usuarios envíen sus tokens entre capas. Primero tenemos que implementar un clon de nuestro token ERC20 en Ethereum, con un suministro inicial cero (esto se hace para garantizar que el suministro total en las diferentes capas, cuando se suma, permanezca constante). Luego implementamos nuestro token bridge en ambas capas, configurando el token ERC20 que queremos unir en particular.
Cada vez que ocurre un puente desde L2 -> L1, los tokens puenteados se bloquean en el contrato puente L2, y la misma cantidad de tokens puenteados se acuñan en L1 para el usuario, y cada vez que ocurre un puente desde L1 -> L2, el los tokens puenteados se queman y la misma cantidad de tokens puenteados se libera o transfiere del contrato puente L2 al usuario, por lo que siempre se mantiene constante el suministro total.
Con Regenesis a la mano, es necesario comprender cómo funcionan los contratos actualizables para poder migrar con éxito los contratos existentes a Cairo v1.0. En esta sección, aprenderemos cómo crear contratos actualizables mediante la codificación de un token ERC20 actualizable.
En términos simples, un contrato actualizable es aquel que le permite cambiar el código/lógica subyacente de su contrato inteligente, sin alterar necesariamente el punto de entrada (dirección del contrato) de su dApp. Esto se hace separando sus contratos en un Proxy y una implementación. El Proxy sirve como punto de entrada y también contiene el almacenamiento del contrato, mientras que la Implementación contiene el código/lógica de su dApp. Para una inmersión más profunda, consulte este artículo de David Baretto aquí.
Gracias al equipo de Openzeppelin, ya tenemos una buena plantilla a seguir. Primero tendríamos que copiar el contrato de proxy en nuestro repositorio. Este contrato de proxy contiene algunas funciones importantes que debemos comprender:
-
El
constructor
que toma 4 parámetros: deployment_hash que es el hash de clase de nuestro contrato deimplementation_hash
,selector
que es el nombre del selector de nuestra función de inicializador (1295919550572838631247819983596733806859788957403169325509326258146877103642),calldata_len
que es la longitud de nuestro calldata del contrato de (construcción y argumento) ycalldata
que son los argumentos del constructor del contrato de implementación. El constructor establece el hash de implementación e inicializa el contrato de implementación. -
La función
__default__
que es responsable de redirigir cualquier llamada de función cuyo selector no se pueda encontrar en el contrato del proxy a la implementación. -
La función
__l1_default__
que es responsable de redirigir cualquier función realizada a un @l1_handler cuyo selector no se encuentra en el contrato del proxy a la implementación.
Finalmente, creamos nuestros contratos de implementación agregando funciones como upgrade
para actualizar el hash de implementación, setAdmin
para configurar el administrador de proxy, getImplementationHash
para obtener el hash de clase de contrato de implementación y getAdmin
para obtener el administrador de proxy actual.
Tenga en cuenta que el contrato de implementación nunca debe:
- Ser desplegado como un contrato regular. En su lugar, se debe declarar el contrato de implementación (lo que crea una clase declarada que contiene su hash y abi).
- Establezca su estado inicial con un constructor tradicional (decorado con @constructor). En su lugar, utilice un método de inicialización que invoque al constructor Proxy.
¿Busca una versión ya implementada de estos contratos? échales un vistazo en StarkScan (Goerli2).
PD: si alguna vez se encuentra con un error de asignación, probablemente necesite llamar a la función de aprobación en el contrato ETH de antemano.
ENS
- 0x0340be76bc3bb090a3a339a8ccf6381e7d6620e80e047ddd814268c286dc1e66
ERC20
- 0x064b2aee30d3693237d0e4f1792b0bde2d80f799d2f95ee7cc2bb339b8fce23e
ERC721
- 0x02f5222bdb8e68b59736e1490c5ec36ab32f609e4e7058a4042841a51a6cec94
ERC721
- 0x02f5222bdb8e68b59736e1490c5ec36ab32f609e4e7058a4042841a51a6cec94NFTMarket
- 0x05b3f40d5cdac77a4e922d8765a5a6ae96e64dc2a4796187d9a25166d0da2235
AMM
- 0x0219cc693096e2d7df6d6145758fe1b63218725054c61e1fe98cf862cb4c2eb9
ERC20
- 0x064b2aee30d3693237d0e4f1792b0bde2d80f799d2f95ee7cc2bb339b8fce23eICO
- 0x028afec7907fa30e16aa62e89658d2a416e00f7917a57502d5dc0e43755df103
ERC20
- 0x064b2aee30d3693237d0e4f1792b0bde2d80f799d2f95ee7cc2bb339b8fce23eSTAKING
- 0x06aaa18df6c7a39373d0e153354eda4e1471fab4616837a9ae3295b890abd03a
ERC20
- 0x064b2aee30d3693237d0e4f1792b0bde2d80f799d2f95ee7cc2bb339b8fce23eL2 BRIDGE ADDRESS
- 0x01c22dddbdbb040268b0a2bb79d62602a57726b2532ee015980f033eb10d8472L1 BRIDGE ADDRESS
- 0xD1A3D5b3Aa75f0884001b2F92d4c7E6050B2eF97
Proxy class hash
- 0x601407cf04ab1fbab155f913db64891dc749f4343bc9e535bd012234a46dc61Implementation_v0 class hash
- 0x707e746b94ec595a094ff53dfacb0b6ed8117ba7941844766dd34ab7872107aImplementation_v1 class hash
- 0x1b439f0e941915a2a45bed6d5affed2966010bb5e9b682bc4137178af2a9667Deployed contract
- 0x00701816faf15bf9a97132dbc84d594bf4dd12cea878a8e46254a504ee2187e8
DENTRO DE CADA GUÍA NADAI PODRA ENCONTRAR LOS DEPLOY Y CONTRATOS
Para garantizar que este repositorio se mantenga lo más simple y minimalista posible para no confundir a los principiantes, no se aceptarán contribuciones en forma de agregar nuevos protocolos, pero si cree que vale la pena agregarlo a la lista, envíeme un DM en Twitter Darlington Nnam. Mientras tanto, podría contribuir en forma de modificaciones a los proyectos existentes enumerados. Un buen lugar para comenzar es revisar los problemas abiertos. Asegúrese de prestar atención a lo siguiente en el curso de la contribución:
- Mantenga la implementación lo más simple y minimalista posible.
- Comente los códigos en detalles para permitir que otros entiendan lo que hacen sus códigos. Natspec es la opción preferida.
- Mantenga sus códigos simples y limpios.
- Al abrir PR, proporcione una descripción detallada de lo que está tratando de corregir o agregar. Construyamos un excelente REPO de aprendizaje para los frenéticos que buscan comenzar con Cairo.😉
Si este repositorio fue útil, ¡dale una ESTRELLA!