```\n/\*\*\n \* @notice Receives approval of token transfer and stakes the approved amount.\n \* @dev Makes sure provided token contract is the same one linked to this contract.\n \* @param \_from The owner of the tokens who approved them to transfer.\n \* @param \_value Approved amount for the transfer and stake.\n \* @param \_token Token contract address.\n \* @param \_extraData Data for stake delegation. This byte array must have the\n \* following values concatenated: Magpie address (20 bytes) where the rewards for participation\n \* are sent, operator's (20 bytes) address, authorizer (20 bytes) address.\n \*/\nfunction receiveApproval(address \_from, uint256 \_value, address \_token, bytes memory \_extraData) public {\n    require(ERC20Burnable(\_token) == token, "Token contract must be the same one linked to this contract.");\n    require(\_value <= token.balanceOf(\_from), "Sender must have enough tokens.");\n    require(\_extraData.length == 60, "Stake delegation data must be provided.");\n\n    address payable magpie = address(uint160(\_extraData.toAddress(0)));\n    address operator = \_extraData.toAddress(20);\n    require(operators[operator].owner == address(0), "Operator address is already in use.");\n    address authorizer = \_extraData.toAddress(40);\n\n    // Transfer tokens to this contract.\n    token.transferFrom(\_from, address(this), \_value);\n\n    operators[operator] = Operator(\_value, block.number, 0, \_from, magpie, authorizer);\n    ownerOperators[\_from].push(operator);\n\n    emit Staked(operator, \_value);\n}\n```\n