Hablemos de su proyecto
Blockchain / Crypto

Crear un token en la Binance Smart Chain

Vamos a ver cómo crécrear un Token (Smart Contract) en la Binance Smart Chain (BSC) y el déplegar para permitiràtodo el mundo del comerciante.Partimos del principio de que usted conoce déjàlos principios de la criptomoneda...

Crear un token en la Binance Smart Chain

Vamos a ver cómo crécrear un Token (Smart Contract) en la Binance Smart Chain (BSC) y el déplegar para permitiràtodo el mundo del comerciante.

Partimos del principio de que usted conoce déjàlos principios de la criptomoneda, que usted tiene de ellaéjàcompraré, y que sabes cómo funcionan las carteras (wallets).

Los contratos inteligentes son programas que contrôprestan directamente activos digitaleséricos. Son estos programas que, una vez« inséré »en la blockchain, van deéterminar cómo van estos activosêtres gérés.

Una vez que el programa está agregadoé àla cadena de bloques, no’es más modificable y es imposible de eliminar.

Nosotros usamos aquí las mémecanismos de Smart Contract de la Blockchain de Binance, la BSC (en el récubo BEP20).
Hemos elegido la BSC porque las tarifas de gas son très débiles.
Es posible hacer la même cosa en la Blockchain Ethereum (ERC20) pero cada transacción puede représentir varias decenas de’euros a cambio de algunas fracciones de céntimos en la BSC.

Agregar la récubo BSC al monedero MetaMask

Para validar las transacciones en la BSC necesitará un monedero (wallet) conectadoéal récubo BEP20.
Para eso vamos a instalar MetaMask, añadirle BNB (la moneda nénecesario para pagar las tarifas de transacción), y conectarlo al récubo BEP20.

Usted puede hacerlo’instalar en su télételéfono o bien en su PC (préférable para seguir este artículo).

https://metamask.io/download

image

Anote bien su frase semilla (la cléprivée) y guárdala en lugares sûr.

No la transféreza nuncaàun tercio.

C’es esta cléque le permitirá de réinstalar su cartera más tarde.

Una vez instaladoéy tendrás que ir a la configuración de l’extensión y añadir la récubo BSC.

Haga clic en la barra del medio que contiene el nombre del récubo luego sobre« RPC personalizadoé ».

Cumplérellena el siguiente formulario:

Para el réred principal (Main Net):

Nombre de la red:Cadena Inteligente de Binance
Nueva URL de RPC: https://bsc-dataseed.binance.org/
ChainID : 56
Símbolo :BNB
URL del Explorador de Bloques : https://bscscan.com

Luego el récubo de prueba (Testnet) :https://docs.binance.org/smart-chain/developer/rpc.html

NetworkNombre :Red de Prueba de Binance Smart Chain
Nuevo RPC URL :https://data-seed-prebsc-2-s1.binance.org:8545/
ChainID : 97
Símbolo :BNB
URL del Explorador de Bloques : https://testnet.bscscan.com

En règle généenresado, para probar su contrato, comenzará por publicarlo en la testnet.
Para eso, necesitará alimentar su billetera con BNB de prueba (afortunadamente gratis).

Solo tiene que ir a la siguiente página: https://testnet.binance.org/faucet-smart

Luego de informar a l’dirección de su cartera.

Su dirección se encuentra aquí:

Usted proporciona su dirección y luego séseleccione 1 BNB en la lista‘Dame BNB’.

Su cuenta será creada automáticamenteédichoé.

Créación de su Smart Contract

Se ha visto précélocamente que’un Contrato Inteligenteéera un programa inséréen la blockchain.
Para el récubo BEP20 (BSC), el lenguaje de programación utilizé es Solidity.

Encontrará la documentación complètú aquí :https://solidity-fr.readthedocs.io/fr/latest/

Honnêtement, ce n’no es très complicadoé. Basta conLée el manualcomo un poco todos los lenguajes. También es accesible como JavaScript.

Para rédiger nuestro programa, compilarlo y publicarlo, vamos a hacerlo directamente en línea en el sitiohttps://remix.ethereum.org/

image-1


Todo se hará directamente desde este sitio.

Nosotros vamos créhacer una llamada de tokené y « Token PartiTech »con el símbolo« PTECH ».

1 –En créde nuestro archivo

Nos aseguraremos de nombrar nuestro archivo con el nombre de nuestro proyecto.

2 – L’entêté de nuestro archivo

Très importante, c’¿es ella quien va déterminar la versión del compilador utilizadaé y por consécuentan la versión del lenguaje.

En nuestro caso, vamos a usar la dernière versión :

pragma solidity ^0.8.4;

3 –El cuerpo de nuestro programa

Nos créseguimos nuestro contrato a través de la déclaración« contrato »que nombraremos de la mêcon manosèque nuestro archivo (lo cual es un poco más limpio).

Cabe señalar que usted puede déanular tantos contratos como desee en un mêmi archivo.

pragma solidity ^0.8.4;

contract PTECH
{

}

4 – Définalización de nuestro contrato

Vamos a tener que déterminar algunos parámetrosètres de nuestro contrato.
Su nombre, el número de token y su símbolo.

Arrêdetengámonos un momento en la sintaxis que vamos a usar. Debemos dédeclarar variables.
Como en la mayoría de los lenguajes, ellas son tipées (int, string, bool, etc.) y tienen un puertoée (pública o privadaée).

En las blockchains todo es público. Así que no se méno tome sobre la noción de privée, c’es un puertoée d’accède valor pero siempre es posible d’y accéder.

pragma solidity ^0.8.4;

contract PTECH
{
    uint private totalSupply = 1 000 000 000 000;
    string public name = "Parti Tech Token";
    string public symbol = "PTECH";
}


Nuestro contrato tendrá 1k mil millones de tokens disponibles y s’apelar a él« Partido Tech Token »con un símbolo « PTECH ».
(Francamente, no tenemos mucho tiempo hésentarseéentre PTECH y PTT…)

Entonces, como pueden ver, déaclarar una chaîno es nada complicado :

Tipo+Puertoée+Nombre = valor;

Pero esto no’no es todo.
Queremos añadir desécimalesànuestro token de manera que los traders puedan comprar fracciones del mismo. Por lo tanto, vamos aécifrar el número de décimales.

pragma solidity ^0.8.4;

contract PTECH
{
    uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
    string public name = "Parti Tech Token";
    string public symbol = "PTECH";
    uint public decimals = 18;

}

Tomen bien nota de nuestra nueva variable« decimales »y la modificación hecha sobre la variable« suministroTotal ».

18 dédecimal, luego un número de token de 1 000 000 000 000 * 10 ** 18

El doble * permite dar la potencia del número, y se multiplica el número de tokens por 10 porque d’un punto de vista de la cartera para mostrar un token, le hace falta 10 unidadesés. Entonces debemos multiplicar el número réel del token por 10 a la potencia de 18 para los décimales.

5 –Agregar el mapeo de los tokens a las direcciones

En esta etapa, nuestro contrato no sabe nada de míêmás allá de’tiene por lógica de’asignar tokensà de usuarios. Por el momento, solo sabe que’tiene un número total de tokens del cual la réla partitura le es totalmente desconocida.

Para eso, vamos a añadir un mapeo de las direcciones de las personas (billeteras)àla répartición de los tokens que vamos a llamar balance (como una balanza en contabilidad)é).

pragma solidity ^0.8.4;

contract PTECH
{
    mapping (address => uint) public balances;
    uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
    string public name = "Parti Tech Token";
    string public symbol = "PTECH";
    uint public decimals = 18;

}

Haciendoça, se asignaànuestro objeto« balances » l’conjunto de direcciones que van a interactuar con nuestro contrato. Más adelante podremos manipular« balance »para agregar o eliminar tokens a las direcciones.

Para simplificar, vamos a mapear un índiceàun valor. L’índice será l’dirección de’un usuario y el valor los tokens que’habrá compradoéo ganaré (sí porque’no estamos obligadosé d’comprar el token, también se puede hacer ganar,à l’imagen de los tokens déinflacionistas).


6 –El constructor

El constructor es à l’imagen de’un« constructor »en otros lenguajes. C’es una función que será exécortarée qu’una sola vez en la vida del programa. Y como vimos que el programaéera exécortaré àvida, sin posibilidadéde ponerloàdía, el fabricante será realmente exécortaré qu’una sola vez.

pragma solidity ^0.8.4;

contract PTECH
{
    mapping (address => uint) public balances;
    uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
    string public name = "Parti Tech Token";
    string public symbol = "PTECH";
    uint public decimals = 18;

    constructor(){
        balances[msg.sender]=totalSupply;
    }



}

Hagamos el punto sobre lo que l’acabamos de’añadir.
Nuestro constructor no toma d’argumento. Dentro, asignamos el’conjunto de tokensàun índice précis. Nuestro índice, c’es una dirección.

Para comprender bien el mécanisismoàcada interacción entre un usuario y nuestro programa, la blockchain va a enviar mensajes. Un mensaje de entradaéy, un mensaje de vuelta.
Cuando se publica el contratoé, el que lo publica es el détentador del contrato, c’somos nosotros.
Entonces el mensaje en entréy que es repréenviadoépor l’objeto« mensaje »contiene en parámetroètres« remitente »nuestra dirección.
Por lo tanto, asignamosànuestra dirección l’conjunto de tokens disponibles.

Podríamos très bien hacer una répartición en varias direcciones. Por ejemplo, créser una cartera muerta (dead wallet) y asignarle dèes la création del contrato un porcentaje de nuestros tokens.
También podríamos créser un portafolio para el marketing, para los desarrolladores y sus réa partir de los tokens qu’ellos usarán más tarde, cuando’habrá liquidezé, para seémunérealizar o financiar una acción de marketing.

7 –Función para leer la balanza de’un usuario

Ahora debemos producir una séserie de funcionalidadesés ànuestro programa que permitirá de gérer las funciones básicas de nuestro contrato.
El premioère es de rétazaévolver la balanza de la’usuario.
En resumen, cuando abres tu billetera, la primeraèotra cosa que’lo que va a hacer es’enviar una solicitudête hacia el contrato para rétazaéVer su saldo.
Y el protocolo va exérecortar una función déterminada por el protocolo que se’llama« balanceOf() ». Esta función siempre tendrá como argumento l’dirección del mensajero.

pragma solidity ^0.8.4;

contract PTECH
{
    mapping (address => uint) public balances;
    uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
    string public name = "Parti Tech Token";
    string public symbol = "PTECH";
    uint public decimals = 18;

    constructor(){
        balances[msg.sender]=totalSupply;
    }

    function balanceOf(address user) public view returns (uint)
    {
        return balances[user];
        
    }

}

Espera. Tómate 2 segundos para analizar la sintaxis de nuestra función.

función balanceOf(dirección usuario) público vista devuelve (uint)

En gros qué’¿es que el’¿Acabamos de hacer? ¿Nos spéespecifica el tipo de retorno que va a producir nuestra función. Muy simplemente.
Con un puertoéy público o privadoéy un retorno de tipo integer (uint). Y algo importante, la propriété n’es que legible (vista, básicamente solo lectura).
Luego, vemos que nuestra función toma como entradaéy una variable user que no’es otro que’una dirección y que el’luego devolvemos el valor asignadoée para el’índice correspondienteànuestra dirección en nuestra tabla« balances ».

8 –La transferencia de tokens a los usuarios

Ahora nos hace faltaéterminar l’interacción entre cada transacción.
Cuando’un usuario va a comprar nuestro token en un marketplace, nos enviará una solicitud de transferencia. A la récepción deberemos asignar el número de tokensà nuestro usuario.

Si quisiéramos hacer un sistème como el DOGE coin, que créy de tokensàcada transacción, podríamos hacerlo aquí. De mêyo, si queríamos hacer un mémecanismo de Burn, nosotros podríamos hacerlo aquí también.

Como pueden ver, todos estos términos que circulan alrededor de los contratos están en réen camaétrès simplesàimpléministro.
Una rèmatemáticas de Googleématique toda bête.

Çno será nuestro caso aquí. Mantengámonos simples.

Entonces àcada transacción el protocolo de la blockchain nos enviará un mensaje que llamará a la función« transferir() »que contendrá l’dirección de la’usuario.

pragma solidity ^0.8.4;

contract PTECH
{
    mapping (address => uint) public balances;
    uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
    string public name = "Parti Tech Token";
    string public symbol = "PTECH";
    uint public decimals = 18;

    constructor(){
        balances[msg.sender]=totalSupply;
    }

    function balanceOf(address user) public view returns (uint)
    {
        return balances[user];
        
    }

    function transfer(address to, uint value) public view returns (uint)
    {
        require(balanceOf(msg.sender)>=value, "Solde est insuffisant");
        
    }

}

En general, una transacción c’es una transferencia de’un valor de’una direcciónàotra. Así que si el détentador A quiere transferirécrear un tokenàun détentador B, es necesario impératívamente que A possède al menos 1 token.

Para eso vamos a utilizar la’instrucción« requiero », que permite validar una condición. Si la condiciónéchoue, entonces el proceso está arrêté, y se devuelve un erroréy al protocolo que se encarga de transmitirloà l’usuario.

Entonces eso que’se hace, c’est rétazaérer l’dirección de la’usuario y llamar a nuestra función« balanceDe »que nos devuelve el saldo para el’dirección dadaéy validar que el número de tokensàtransférer está disponible en la balanza del donante d’orden.
Si el saldo es insuficiente, seêla transacción.

Cabe señalar que l’objeto msg es global y disponibleàen cualquier momento en cada función en el momento de’una transacción.

Dependiendo de la résultat, se incrémente el saldo del destinatario y uno deécrémente el saldo del donante d’orden.

pragma solidity ^0.8.4;

contract PTECH
{
    mapping (address => uint) public balances;
    uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
    string public name = "Parti Tech Token";
    string public symbol = "PTECH";
    uint public decimals = 18;

    constructor(){
        balances[msg.sender]=totalSupply;
    }

    function balanceOf(address user) public view returns (uint)
    {
        return balances[user];
        
    }

    function transfer(address to, uint value) public view returns (uint)
    {
        require(balanceOf(msg.sender)>=value, "Solde est insuffisant");
        balances[to]+=value;
        balances[msg.sender]-=value;
    }

}

Una vez que se hace el balance, vamos aéescribir en la blockchain. Para eso vamos aéponer unévénement« Transferir ».
Un poco como en JS, podríamos hacer un evento de disparo en el DOM.
Para invocar un évènemente, se utiliza la palabra-clé « emitir », y para déaclarar la’évènemente, se utiliza la palabra-clé « evento ».

pragma solidity ^0.8.4;

contract PTECH
{
    mapping (address => uint) public balances;
    uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
    string public name = "Parti Tech Token";
    string public symbol = "PTECH";
    uint public decimals = 18;

    event Transfer(address indexed from, address indexed to, uint value);

    constructor(){
        balances[msg.sender]=totalSupply;
    }

    function balanceOf(address user) public view returns (uint)
    {
        return balances[user];
        
    }

    function transfer(address to, uint value) public returns (bool)
    {
        require(balanceOf(msg.sender)>=value, "Solde insuffisant");
        balances[to]+=value;
        balances[msg.sender]-=value;
        emit Transfer(msg.sender, to, value);
        return true;
    }

}

Entonces, una vez validadoéy se envía una orden de transferencia del donante de’orden« msg.sender »hacia el destinatario« a »para un valor« valor ».

8 -La délégación de transferencia

La déléla gestión de transferencia da la posibilidadé àun tercio de hacer transferenciasàel lugar de la détentador del contrato. C’es exactamente lo que hace la finanza deécentraléy (DEFI).
Entonces eso’está pasando’es que l’se autoriza el contratoàrealizar transferenciasànuestro lugar lo que permite luego al contrato realizar órdenes desde el’dirección del détentador hacia l’dirección del destinatario.

pragma solidity ^0.8.4;

contract PTECH
{
    mapping (address => uint) public balances;
    mapping (address => mapping (address=>uint)) public allowance;

    uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
    string public name = "Parti Tech Token";
    string public symbol = "PTECH";
    uint public decimals = 18;

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);

    constructor(){
        balances[msg.sender]=totalSupply;
    }

    function balanceOf(address user) public view returns (uint)
    {
        return balances[user];
        
    }

    function transfer(address to, uint value) public returns (bool)
    {
        require(balanceOf(msg.sender)>=value, "Solde insuffisant");
        balances[to]+=value;
        balances[msg.sender]-=value;
        emit Transfer(msg.sender, to, value);
        return true;
    }

    function approve(address spender, uint value) public  returns (bool)
    {
        allowance[msg.sender][spender]=value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

}

No voy a volver sobre los conceptos que hemos visto más arriba.
En créy un mapeo de’direcciones que contiene él mêdame un mapeo de’direcciones. En resumen, una tablaà3 dimensiones.
En créy una función« aprobar »que va a afectarànuestro mapeo d’asigna un valor. Lo que permitirá decir al sistème que esta dirección tiene derecho a dépensar en nuestro nombre tal número de tokens.

Se añade una función« TransferirDesde »que, cuando el’orden será una orden deélégué, va véverificar la balanza y vérifier la délégación. Si el balance es suficiente, y que laéléla agregación también es suficiente, entonces calculamos los balances de nuestra tabla« balances »y unoécon unévètransmisión actualmente paraéescribir en la blockchain.

pragma solidity ^0.8.4;

contract PTECH
{
    mapping (address => uint) public balances;
    mapping (address => mapping (address=>uint)) public allowance;

    uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
    string public name = "Parti Tech Token";
    string public symbol = "PTECH";
    uint public decimals = 18;

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);

    constructor(){
        balances[msg.sender]=totalSupply;
    }

    function balanceOf(address user) public view returns (uint)
    {
        return balances[user];
        
    }

    function transfer(address to, uint value) public returns (bool)
    {
        require(balanceOf(msg.sender)>=value, "Solde insuffisant");
        balances[to]+=value;
        balances[msg.sender]-=value;
        emit Transfer(msg.sender, to, value);
        return true;
    }

    function TransferFrom(address from, address to, uint value) public  returns (bool)
    {
        require(balanceOf(from)>=value, "Solde insuffisant");
        require(allowance[from][msg.sender]>=value, "Délégation insuffisante");
        balances[to]+=value;
        balances[from]-=value;
        emit Transfer(from, to, value);
        return true;
    }

    function approve(address spender, uint value) public  returns (bool)
    {
        allowance[msg.sender][spender]=value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

}

Dédespliegue del contrato en la Blockchain

Para elé dédespliegue, nos quedamos en nuestroéeditor del sitiohttps://remix.ethereum.org/

Ahora vamos a compilar nuestro contrato en véverificando bien la versión del compilador y el tipo de lenguaje.
En la cochera« Ocultar advertencia »para no contaminarse con mensajes no bloqueantes.

Luego hay que inyectar web3 en su proyecto. Básicamente, esto va a vincular su billetera MetaMaskàsu contrato.
Nos posicionaremos en el préhabilitar MetaMask en el récubo TestNet.

Luego nos posicionamos en la’pestaña dédespliegue, se inyecta« Web3 », MetaMask s’abre y nos pide confirmar qué cuenta queremos usar.

Selection_202

Se valida.

El númeroéro de nuestra cuenta se llena directamente en l’interfaz.

Se hace clic en« Déartimaña » y MétaMask nos pide que validemos la transacción.

El déel despliegue nos vaûtener 0.0088 BNB. Una nimiedad. Sin contar que en el TestNet, se puede crédecir BNB de pruebas😉

Y confirmamos.

Tenemos el pequeño coche verde, ¡todo está bien!

En véverifique la transacción en MétaMask.

Se hace clic en el enlace para véverificar la dédespliegue en bscscan.com

Selection_210

Voilà, nuestro contrato es créé.
Veremos en un próximo capítulo cómo agregarle liquidezépara permitir el trading en las diffépuestos de mercado vacantesé.

Création d’un par y grupo de liquidezé

Para que su contrato esté en capacidadé d’être traidé, habrá que créhacer un par con otro token y añadirle liquidezé.
Por ejemplo, hacer un par PTECH/BNB. Se cruéera un grupo de’una fracción o de la totalidadéde nuestros tokens disponibles, y se le asignará un valor de départe.
250 000 000 000 token por 33BNB (es decir àpuede prestar 10.000$ durante el curso d’hoy’hui) sería un buen valor de départe.

Para eso vamos a ir a PancakeSwap:https://pancakeswap.finance
Onelegido« Liquidez »en el menú« Comercio »

Luego seleccionamos l’pestaña« Liquidez » y hacemos clic en« + Agregar liquidez »

Es necesarioéconectar su billetera al sitio de manera relativamente, si deseamos que el sitio créénuestra piscina.

Una vez conectadoé, el sitio nos indica nuestras piscinas. Por el momento, no’no tenemos.

Se hace clic en« + Agregar liquidez »

Y añadimos nuestro token. En la lista, hacemos clic en Gestionar token

Luego en l’pestaña token agregamos el’dirección de nuestro contrato:

Una vez importado el contratoé, lo seleccionamos:

Y elegimos la segunda moneda a« acoplar »con nuestro contrato. Contrato/divisa o divisa/Contrato, c’es como usted lo desea.

Se hace clic en « Habilitar »y dejamos que Metamask trabaje, que les va a pedir’autorizar las transacciones necesariasàla créación del grupo.

No debería tardar en verlo en la listaéen los nuevos contratos disponibles. Por ejemplo enhttps://poocoin.app/ape

Una vez que su piscina está créé

Si este artículo le haétéÚtil, n’héno duden en hacerme una pequeña donación de algunos miles de millones😉
Mi dirección: 0x3637fCa571aeA47DBC90f61c38629dd92a742315

Los enumeraré a continuación los généfelices donantes con l’dirección del pool en un exchange para poder comerciarlo:

Monto Ficha Intercambio de direcciones
Por el momento, nadie’ha hecho una donación. ¡Sé el primero!

Precauciones antes de cualquier despliegue

Este tutorial es un ejemplo técnico histórico, no una recomendación financiera. Un contrato publicado es difícil de corregir y puede comprometer fondos reales.

  • Nunca coloque una clave privada o una frase de recuperación en el código, el terminal compartido o el repositorio de Git.
  • Despliegue primero en una red de prueba con direcciones sin valor.
  • Haga revisar el contrato, sus derechos de administración, la oferta total y las funciones de creación o destrucción antes de cualquier uso real.

Compartir este artículo