Multi-token eficiente para juegos + Tokenized Vaults para yield automático
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; contract GameItems is ERC1155 { // IDs de tokens ” pueden ser fungibles o no uint256 public constant GOLD = 0; // Fungible uint256 public constant SWORD = 1; // Semi-fungible uint256 public constant SHIELD = 2; // Semi-fungible uint256 public constant TROPHY = 3; // Único (1 supply) constructor() ERC1155("https://api.game.io/{id}.json") { // Mint inicial ” un contrato, múltiples tipos _mint(msg.sender, GOLD, 10_000, ""); _mint(msg.sender, SWORD, 50, ""); _mint(msg.sender, SHIELD, 30, ""); _mint(msg.sender, TROPHY, 1, ""); // Único! } // Transferencia batch ” 1 tx para múltiples tokens // Gas: ~35% más barato que ERC-20 + ERC-721 separados function equipSet(address player) external { uint256[] memory ids = new uint256[](3); uint256[] memory amounts = new uint256[](3); ids[0]=GOLD; amounts[0]=100; ids[1]=SWORD; amounts[1]=1; ids[2]=SHIELD; amounts[2]=1; safeBatchTransferFrom( msg.sender, player, ids, amounts, "" ); } }
safeBatchTransferFrom de 5 tokens cuesta ~70,000 gas. Hacerlo con 5 contratos ERC-20 separados: ~250,000 gas. Ahorro: 72%
pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol"; contract YieldVault is ERC4626 { uint256 public apy; // APY en basis points (1% = 100) constructor(IERC20 _asset, uint256 _apy) ERC4626(_asset) ERC20("Yield USDC", "yUSDC") { apy = _apy; } // Shares-to-assets aumenta con el tiempo (yield) function totalAssets() public view override returns (uint256) { // Los assets crecen con el tiempo + yield return IERC20(asset()).balanceOf(address(this)) + accruedYield; } // Clave: previewRedeem calcula cuántos assets // recibirás por tus shares al retirar // previewRedeem(100 shares) = 103 USDC (con yield) }
assets × totalShares / totalAssetsshares × totalAssets / totalShares