How we're allowing players to deposit tokens from any chain to their player accounts, without leaving their favorite EVM chain.
Goals:
Being able to deposit GLMB (Moonbeam ERC20 token) into the game smart contract
Being able to deposit any other Moonbeam token into the game smart contract
Being able to deposit any native EVM token from any EVM chain into the game smart contract
Being able to deposit any Substrate-based token into the game smart contract
/** * @notice Let an user deposit GLMB inside the SC linked to his mirror wallet * @param _glmbAmount: amount of GLMB to deposit * @param _beneficiary: address to deposit tokens to */functiondepositFunds (uint256_glmbAmount,address_beneficiary) publicpayable {require(_glmbAmount >0,"Amount must be greater than zero");require(glmbAddress.balanceOf(msg.sender) >= _glmbAmount,"Not enough GLMB"); glmbAddress.transferFrom(msg.sender,address(this), _glmbAmount); players[_beneficiary].glmbAvailable += _glmbAmount; }
As you probably know, to be able to move ERC20 tokens on behalf of a user, we need to increase its allowance towards our smart contract beforehand. To do so, we can easily use the batch Precompile we previously described to achieve it in a single transaction.
try {let internal =awaitgameContract.players(await addy);let internalAddy =await internal[0];if ( (await internalAddy) =="0x0000000000000000000000000000000000000000" ) {alert("You need to register before deposit");window.location.replace("https://playtge.com/register");return; } } catch (err) {console.log(err); }let iface =newethers.utils.Interface(glmbABI);let sGlmb =document.getElementById('amount').value.toString() // get the value from the input in the front-endlet glmbFund =ethers.utils.parseEther(sGlmb);let dataGlmb =iface.encodeFunctionData("increaseAllowance", [ gameAddressv2, glmbFund, ]);let iface2 =newethers.utils.Interface(gameABIV2);let dataFunding =iface2.encodeFunctionData("depositFunds", [ glmbFund, addy ]);try {let approvalTxn =awaitbatchContract.batchAll( [bananasAddress, gameAddressv2], ["0","0"], [dataGlmb, dataFunding], [], { gasLimit:200000, } );awaitapprovalTxn.wait();alert("Deposit successful!");window.location.replace("https://playtge.com/play"); } catch (approvalErr) {console.log(approvalErr); }