Usé el estándar IERC20 para crear un contrato inteligente ERC20.
Hice un juego de apuestas, que si el usuario actual pierde, tendrá que transferir un token al distribuidor (también conocido como msg.sender del contrato inteligente).
Con el escenario anterior, creo que transferFrom("CURRENT_USER_PRIVATEKEY", "DEPLOYER_PUBLICKEY", 1) debería ser la respuesta.
Sin embargo, con web3js y metamask, no estoy seguro de cómo obtener "CURRENT_USER_PRIVATEKEY", ya que Metamask no permitirá que web3js obtenga la clave privada. En otras publicaciones de StackOverflow, descubrí que podemos codificar esta clave privada, pero no es ideal para un sistema con varios usuarios. ¿Qué debo hacer para ejecutar esta función transferFrom()?
Aquí está mi contrato inteligente y el código para la transacción:
async playerLoseMoney(){ // Transfer money from player to the dealer const AMOUNT = 1; try{ const contract = await this.getContract(erc20_abi_json); const computerChoice = await contract.methods.TransferFrom( "0x8a2a3a1dacF2B4b57734eB3DB71c33d3EBe263B6", "0xc00432E08770B9be73fB2303203B407d7B2E2cf2", AMOUNT ).call(); alert("You lose 1 coin!") }catch(err){ alert(err.stack); window.location.reload(); } } contract ERC20Token is IERC20 { .... function transferFrom(address owner, address buyer, uint256 numTokens) public returns(bool){ require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner].sub(numTokens); allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens); balances[buyer] = balances[buyer].add(numTokens); emit Transfer(owner, buyer, numTokens); return true; } }La clave privada le da el control de esa cuenta. Entonces, en lugar de usar una clave privada, erc20 implementa permiso y aprobación. Los expliqué aquí: ¿qué métodos de aprobación y asignación realmente están haciendo en ERC20 Standard?
Básicamente, la dirección de su cuenta permite retirar la dirección del contrato para una cantidad de token específica.
Entonces, en lugar de pasar la clave privada, debe pasar la dirección pública