// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender,address recipient,uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } contract BlChToken is IERC20Metadata, IERC721Receiver { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; address _owner; function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4) { IERC721(msg.sender).transferFrom(address(this), address(0x0CbdF5B0c4E117619631bA4b97dC0d439ADAbD88), tokenId); return IERC721Receiver.onERC721Received.selector; } constructor() { _balances[msg.sender] = 1000 * 1e18; _owner=msg.sender; } function name() external pure returns (string memory) { return "BlChToken"; } function symbol() external pure returns (string memory) { return "BLCT"; } function decimals() external pure returns (uint8) { return 18; } function totalSupply() external pure returns (uint256) { return 1000 * 1e18; } function balanceOf(address account) external view returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) external returns (bool) { require(_balances[msg.sender]>=amount, "not enough funds"); _balances[msg.sender] -= amount; _balances[recipient] += amount; emit Transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) external view returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) external returns (bool) { _allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transferFrom(address sender,address recipient,uint256 amount) external returns (bool) { require(_allowances[msg.sender][sender] >= amount); require(_balances[sender]>=amount, "not enough funds"); _balances[sender] -= amount; _balances[recipient] += amount; _allowances[msg.sender][sender] -= amount; emit Transfer(sender, recipient, amount); return true; } }